2015-05-29

用 iMacros 和 javascript 一口氣填完教學意見調查表

一到學期末,學校總要大家上網填寫這個無聊繁瑣又不見得有用的調查, 有時科目多的話,把這些調查問卷一一填完還真是浪費生命。有沒有辦法快速填表呢?

[趕時間請看精簡版 填教學評量的正確方式之咻!咻!咻! ,附教學影片!]


javascript 速度快 5 倍

只要把選擇題填完就可以送出了,其中他說的什麼檢核機制, 應該就只是其中兩題敘述相反要選相反答案,這樣的話所有題目都選中間就好啦。 Ctrl + Shift + K 開啟 Firefox 的 Console , 複製貼上以下 javascript 按 Enter 或者選取拖曳到 Bookmarks Toorbar 變成按鈕再點擊也行。

javascript:var a = document.querySelectorAll('input[value="3"]'); for(var i=0; i<a.length;i++) { a[i].click(); } var a = document.querySelectorAll('input[value="填畢送出"]'); for(var i=0; i<a.length;i++) { a[i].click(); }


按下 Enter 或點選 OK ,到頁面底下點選"確認送出",或者再做一個 bookmarklet 直接點擊,再按一次 Enter 或點選 OK ,再點擊"回期末教學意見調查首頁",就填完一科問卷了。

javascript:var a = document.querySelectorAll('input[value="確認送出"]'); for(var i=0; i<a.length;i++) { a[i].click(); }

javascript:var a = document.querySelectorAll('input[value="回期末教學意見調查首頁"]'); for(var i=0; i<a.length;i++) { a[i].click(); }

好迅速唷!如此一來,填一個科目只要左右手按 6 個按鍵 (點進科目 > 全選 "3" 和 "填畢送出" > Enter > "確認送出" > Enter > "回期末教學意見調查首頁") , 比起一題一題回答快了大概 5 倍吧,到此已經節省不少時間了。

不過如果這學期我選了 10 個科目,不就還是要按 60 個按鍵,這樣還是挺麻煩的。


iMacros 速度再快 6 倍

搜尋一下,找到 iMacros for Firefox 這個好用的 add-on 。 第一次用還不太上手,跟著 初步教學 ,錄製一段巨集來觀察他的語法。搜尋發現 iMacros 也可以用 javascript 寫 ,但要照那篇寫的要另外存成 .js 檔案放到電腦裡某個資料夾。

想說這樣就可以利用 javascript 的 for 迴圈設定 iMacros 的 POS 值 (代表第幾個這個東西) 來依序點選問卷首頁的 10 個小圖片按鈕,其中利用 document.getElementsByTagName("img").length; 可以得到網頁上有幾個圖片,也就是有幾個科目。

不過用 javascript 又不太方便,無法使用 document , 會顯示 ReferenceError: document is not defined , 似乎要用更複雜的 iMacros 寫法。

後來又發現,要執行 javascript 直接用 iMacros 的 URL GOTO=javascript:... 就行了, 這樣或許直接寫成 iMacros 的 .iim 檔案來執行比較方便。 然後,還要處理對話框點擊 OK 的步驟,這似乎要寫在前一步點擊送出的前面,像這樣:

ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:useraddform ATTR=*

填完一個科目的整個 iMacros 程式碼如下:

TAB T=1
URL GOTO=https://onepiece2.nchu.edu.tw/cofsys/plsql/Stud_Question_Main1
TAG POS=7 TYPE=IMG ATTR=SRC:https://onepiece2.nchu.edu.tw/cof/java/images/application_edit.png
URL GOTO=javascript:var%20a%20=%20document.querySelectorAll('input[value="3"]');%20for(var%20i=0;%20i<a.length;i++)%20{%20a[i].click();%20}
TAB T=2
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:useraddform ATTR=*
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:questionform ATTR=*
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ACTION:/cofsys/plsql/Stud_Question_Main1 ATTR=*
TAB CLOSE
TAB T=1
URL GOTO=https://onepiece2.nchu.edu.tw/cofsys/plsql/Stud_Question_Main1

其中第三行的 POS=7 是指要填第幾個科目; TAB T=2 是用在第一次從首頁點進科目時會開新分頁, 填完後回到首頁再點進科目就不會開新分頁,但一開始的首頁還在,為了方便之後 LOOP , TAB CLOSE 關閉新開的這個分頁、 TAB T=1 回到一開始的分頁, 再次 URL GOTO 讓他重新整理。

執行後,瞬間第 7 個科目就變成完成填答的圖案了! 比剛才又快了六倍。光是測試就已經填完四科了,我的科目怎麼這麼少啊。 而且研究這些的時間大概早就可以去慢慢填完了吧,不過研究這個有趣多了呀。 就像飛哥與小佛做一個 照片運輸器 來找回滑板比起直接做一個滑板有趣多了。


雖然這樣已經夠快了,不過 10 個科目就要執行 10 次,還要一一改程式碼,這樣還是有點麻煩。

iMacros + LOOP 速度再快 10 倍,一鍵解決!

iMacros 的 LOOP 其實不難,參考 Using !LOOP 教學影片,原本以為要把第三行改成 POS={{!LOOP}} , 才發現填過的"填答評量"圖案會消失,因此每次都只要用 POS=1 就行了, 上一個步驟說的 10 個科目就只要按 10 次,不用改程式碼; 這也是之前程式碼最後要重新整理的原因;然後也不用設定 {{!LOOP}} , 但要讓程式碼執行 6 次,就要把 Max 改成 6 (剩餘沒填的科目數) , 最後改按 Play (Loop) 。


程式碼和上面一樣,只改了第三行 POS=1 ;執行時多了在 Max 填科目數的步驟,然後按 Play (Loop) :

TAB T=1
URL GOTO=https://onepiece2.nchu.edu.tw/cofsys/plsql/Stud_Question_Main1
TAG POS=1 TYPE=IMG ATTR=SRC:https://onepiece2.nchu.edu.tw/cof/java/images/application_edit.png
URL GOTO=javascript:var%20a%20=%20document.querySelectorAll('input[value="3"]');%20for(var%20i=0;%20i<a.length;i++)%20{%20a[i].click();%20}
TAB T=2
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:useraddform ATTR=*
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:questionform ATTR=*
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ACTION:/cofsys/plsql/Stud_Question_Main1 ATTR=*
TAB CLOSE
TAB T=1
URL GOTO=https://onepiece2.nchu.edu.tw/cofsys/plsql/Stud_Question_Main1

因為每個科目問題數不一樣,所以中間保留用 javascript 來自動勾選答案。

終於完成了!一鍵解決所有教學意見調查表!

用 300 倍或更高的速度一口氣填完麻煩的問卷是多大的樂趣啊。真可惜每個人每個學期只能填一次......

2017.1.7 更新

又到了有趣的秒填問卷時刻,但這次卻卡在中間 URL GOTO=javascript... 的步驟, 明明都勾選好了確沒送出去,然後出現 Page loading timeout 的錯誤訊息。 也許可以加入什麼讓 imacros 知道 javascript 已經 loading 完了, 想不到辦法,乾脆試著直接用 imacros 來打勾每個選項。 但是因為每個科目問題數不一樣,所以要在程式裡多列一些選項以免有的科目沒填完, 然後還要加上 !TIMEOUT_STEP 的設定,就不會卡在找不到的選項, 以及 !ERRORIGNORE 讓他不會因為這個錯誤而中斷。

SET !TIMEOUT_STEP 0
SET !ERRORIGNORE YES
TAB T=1
URL GOTO=https://onepiece2.nchu.edu.tw/cofsys/plsql/Stud_Question_Main1
TAG POS=1 TYPE=IMG ATTR=SRC:https://onepiece2.nchu.edu.tw/cof/java/images/application_edit.png
TAB T=2
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_A1
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_A2
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_A3
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_A4
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_A5
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B1
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B2
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B3
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B4
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B5
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B6
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B7
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B8
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B9
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B10
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B11
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B12
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B13
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B14
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B15
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B16
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B17
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B18
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B19
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_B20
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C1
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C2
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C3
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C4
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C5
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C6
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C7
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C8
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C9
TAG POS=3 TYPE=INPUT:RADIO FORM=NAME:useraddform ATTR=ID:v_C10
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:useraddform ATTR=*
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:questionform ATTR=*
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ACTION:/cofsys/plsql/Stud_Question_Main1 ATTR=*
TAB CLOSE
TAB T=1
URL GOTO=https://onepiece2.nchu.edu.tw/cofsys/plsql/Stud_Question_Main1

耶,可以順利執行了,只是程式碼好長,不知道怎麼用 imacros 的指令來一次勾選完。 還是想用 javascript,找到了 !TIMEOUT_PAGE 可以設定他不要因為 page loading 卡太久, 於是處理了上面的問題。

SET !TIMEOUT_PAGE 1
SET !ERRORIGNORE YES
TAB T=1
URL GOTO=https://onepiece2.nchu.edu.tw/cofsys/plsql/Stud_Question_Main1
TAG POS=1 TYPE=IMG ATTR=SRC:https://onepiece2.nchu.edu.tw/cof/java/images/application_edit.png
TAB T=2
URL GOTO=javascript:var%20a%20=%20document.querySelectorAll('input[value="3"]');%20for(var%20i=0;%20i<a.length;i++)%20{%20a[i].click();%20}
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:useraddform ATTR=*
ONDIALOG POS=1 BUTTON=OK CONTENT=
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:questionform ATTR=*
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ACTION:/cofsys/plsql/Stud_Question_Main1 ATTR=*
TAB CLOSE
TAB T=1
URL GOTO=https://onepiece2.nchu.edu.tw/cofsys/plsql/Stud_Question_Main1

太棒了又可以一鍵填完了,誰還沒填的歡迎找我幫忙唷。

No comments :

Post a Comment