AutoIT實現上傳檔案功能
當需要上傳檔案,輸入框不是<input>元素,且不能用此方法解決時:
- 首先找到元素:WebElement file = driver.findElement(By.name("filename"));
- 給此元素設定值:file.sendKeys("E:\testfile.jpg");
就需要用到autoIT
一、AutoIT安裝
- 下載並安裝AutoIT,下載連結:https://www.autoitscript.com/site/autoit/
- AutoIT安裝成功後,可以在開始選單下看到AutoIT的所有工具,如下圖所示:
- 其中分為幾類,AutoIT Window Info用來識別Windows控制元件,根據識別的控制元件資訊編寫指令碼;Complie Script to .exe,用來將利用AutoIt編寫的指令碼,編譯成可執行檔案;Run Script 用來執行AutoIT的指令碼資訊;SciTE Script Editor用來編寫AutoIt指令碼。
- 接下來就是利用以上四種工具,來編寫AutoIT指令碼,然後編譯成可執行檔案
2、利用AutoIT編寫指令碼
(1) AutoIt Window Info
開啟此工具,利用此工具來識別Windows控制元件資訊,如輸入框、按鈕等。
此工具開啟的介面顯示:
用滑鼠拖住工具上的Finder Tool的圖示(即圖中藍色圈圈部分)到要識別的控制元件上,控制元件的唯一標識資訊會顯示在工具的左側部分(圖中紅框標出的部分)。
從顯示的結果得知,此控制元件的Title=“開啟”,Class為Button,Instance=1。我們就是利用控制元件的這些資訊,定位控制元件,編寫指令碼。
(2) SciTE Script Editor
根據以上所識別的空間資訊,利用此編輯器,利用此軟體根據AutoIT的語法編寫指令碼。
附實現檔案上傳需要的幾個方法:
ControlFocus ( "視窗標題", "視窗文字", 控制元件ID) 設定輸入焦點到指定視窗的某個控制元件上
WinWait ( "視窗標題" [, "視窗文字" [, 超時時間]] ) 暫停指令碼的執行直至指定視窗存在(出現)為止
ControlSetText ( "視窗標題", "視窗文字", 控制元件ID, "新文字" ) 修改指定控制元件的文字
Sleep ( 延遲 ) 使指令碼暫停指定時間段
ControlClick ( "視窗標題", "視窗文字", 控制元件ID [, 按鈕] [, 點選次數]] ) 向指定控制元件傳送滑鼠點選命令
其中,title即AutoIt Window Info識別出的Title欄位,controlID即AutoIt Window Info識別出的Class和Instance的拼接,如上圖拼接後的結果應為:Button1
例項:
AutoIT指令碼編寫完成後,可以通過選單欄“Tools”-->“Go” 執行一下指令碼。注意,執行的時候,上傳視窗需處於開啟狀態。
3、AutoIT指令碼編譯成可執行檔案
指令碼編輯執行無誤後,將其儲存。然後開啟Complie Script to .exe工具,將儲存的指令碼編譯成exe可執行檔案。
點選“Browse”選擇儲存的指令碼檔案,點選“Convert”將其生成exe檔案。
至此,利用AutoIT實現圖片上傳的流程結束。
4. 然後新增到自動化指令碼中:
driver.findElement(By.id("upfile")).click();
Runtime.getRuntime().exe("d:/upfile.exe");
二、遇到的問題:
1. autoIT 按開啟按鈕不靈敏,直接換成輸入enter鍵,程式碼改為如下:
ControlFocus("檔案上傳","","Edit1");
WinWait("[CLASS:#32770]","",5);
ControlSetText("檔案上傳","","Edit1","D:\OA測試總結.docx");
Sleep(2000);
Send("{ENTER}")
Sleep(2000);
2. autoIT實現檔案為變數
在傳遞命令列引數到AutoIt指令碼中的時候,AutoIt會自動初始化一個特殊的陣列 $CmdLine。
下面這些可以在AutoIt指令碼中直接使用:
$CmdLine[0] ;引數的數量
$CmdLine[1] ;第一個引數 (指令碼名稱後面)
$CmdLine[2] ;第二個引數
所以,將程式碼改成:
(1) ControlFocus("檔案上傳","","Edit1");
WinWait("[CLASS:#32770]","",5);
ControlSetText("檔案上傳","","Edit1",$CmdLine[0]);
Sleep(2000);
Send("{ENTER}")
Sleep(2000);
(2)自動化程式碼改成:
Runtime.getRuntime().exe("d:/upfile.exe file" );