今天分享我在選擇Day19說的第三種方法時遇到的問題。
這個工具的使用說明裡有一句話:填單期間,請雙手離開鍵盤和滑鼠。
今天寫這個專案到現在還沒那麼完整的原因,而這句話就是其中最大的一個。
程式去填表單的方式,是把按鍵送到「現在正在前景的那個視窗」。
這件事的前提是,那個視窗一直都是表單。
但它不一定是。
我在開發的時候常常遇到,程式送了一串鍵出去,結果什麼都沒有發生,回去查才發現,焦點在某個時間點跑掉了,跑到別的視窗去。那串鍵確實被送出去了,只是送到了別的地方。
更麻煩的是,我如果在旁邊點了一下其他東西,比如切去看個訊息,焦點就走了。
所以那句話是在提醒我這段時間這台電腦不是我的。
表單上有幾個欄位要填中文。
一開始我是用貼上的,比直接打字可靠。
結果貼出來的內容常常不是我要的,我要貼的是一段備註,貼出來變成「登入」,或是「改單據」這種完全無關的詞。
原因其實跟第一個問題一樣,因為我中間複製了其他文字,但它根本不知道,所以就把我複製的文字貼到備註欄位中。
後來我改成用打字的,打完再放大檢查一次,錯了就全選刪掉重打。
這是一個很笨的解法,但它是目前比較穩定的方式。
填到一半,畫面有時候會跳出一個視窗,
使用者將於 N 秒內強迫登出授權
這是閒置提醒,對人來說它很合理,你太久沒動了,系統問你還在不在。
對一支正在填單的程式來說,它是一個從天而降的障礙物,那個視窗蓋在表單上面,接下來的按鍵全部會打到它身上。
所以程式還要學會認出這個視窗,然後按「取消」。
這一條我在 Day 19 提過,今天講具體一點。
那個系統裡,Ctrl+S 在某個畫面是用來把作業叫出來的。
但在表單畫面上,Ctrl+S 是儲存。
所以整個流程裡最危險的一刻,是程式以為自己還在前一個畫面,於是按了一次 Ctrl+S。
如果它判斷錯了,那一下就是儲存。
我前面兩天寫了那麼多關於「不給它儲存的能力」的設計,但這裡有一個漏洞,儲存不只是一個按鈕,它還是一組鍵。 我可以不提供按儲存的功能,我沒辦法讓那組鍵在表單上失效。
焦點、剪貼簿、彈出的視窗、快速鍵,這四樣東西都不屬於我的程式。它們屬於那台電腦,而那台電腦上還有別的東西在跑,包括那個 ERP 本身,也包括坐在前面的我。
我的程式不是在一個環境裡執行,它是在一個環境裡借用時間。
這跟前兩個專案的差別非常大。
前面那兩個都跑在雲端,排程時間到了就開始跑,跑的時候沒有人會動它,剪貼簿沒有別人在用,也不會有視窗突然跳出來,那個世界裡只有它自己。
這一個不是,它跑在一張有人坐著的桌子上,而桌子上的東西隨時會動。
所以它的脆弱跟前兩個專案的脆弱不是同一種,前面那兩個的風險在邏輯裡,資料算錯、規則過期、步驟漏掉。這一個的風險在環境裡,程式本身沒有錯,但它身處的那一秒不是它以為的那一秒。
這些我沒有解掉,只是擋著。
送鍵之前先確認焦點。 焦點不在表單上就停下來,不要盲目地送。
填完一格立刻讀回來。 讀到的跟填的不一樣就停在那裡。這一道在這裡的作用,是為了接住那些「送出去了但沒進去」的鍵。
認得出那個登出提醒,並且按掉它。 這是硬寫進去的。
中斷的時候停在下一個動作之前。 如果中途發現不對,可以直接打斷,它會在做完當下這一步之後停住,表單維持在未儲存的狀態。
這四件事加起來,效果是讓它出錯的時候停下來,而不是讓它不出錯。
我知道這兩件事差很多。
但以我現在能做到的程度,讓一個會出錯的東西停得住,已經是比較務實的目標了。
補充,這個工具現在只跑在我自己的電腦上,它綁定視窗大小,換一台要重新校準;也只驗過一種情況,換個廠商那些連動欄位我都還沒實際量過,所以嚴格講它還不是一個可以交出去的東西。