《手把手教你》系列技巧篇(五十五)-java+ selenium自動化測試-上傳文件-下篇(詳細教程)
- 2022 年 1 月 7 日
- 筆記
- java+selenium自動化測試
1.簡介
在實際工作中,我們進行web自動化的時候,文件上傳是很常見的操作,例如上傳用戶頭像,上傳身份證資訊等。所以宏哥打算按上傳文件的分類對其進行一下講解和分享。
2.為什麼selenium沒有提供API?
想必小夥伴們或者童鞋們一定很好奇,既然上傳文件在自動化這麼常見而且經常用到,那麼為什麼Selenium的webdriver為什麼不提供方法(API),宏哥這裡解釋一下原因:因為上傳文件需要打開window窗口,webdriver是無法對window的控制項操作的,換句話說就是:selenium無法識別非web的控制項,上傳文件窗口為系統自帶,無法識別窗口元素。所以沒有提供方法,需要我們換個思路去上傳文件。
3.上傳文件分類
首先,我們要區分出上傳按鈕的種類,大體上可以分為兩種,一種是input框,另外一種就比較複雜,通過js、flash等實現,標籤非input。
上傳文件有兩種場景:input控制上傳和非input控制項上傳。大多數情況都是input控制項上傳文件,只有非常少數的使用自定義的非input上傳文件。今天宏哥這一篇文章就用來介紹非input控制項上傳文件。
4.非input控制項上傳文件
非input控制項上傳文件,我們要引入外部插件上傳。這種上傳千奇百怪,有用a標籤的,有用div的,有用button的,有用object的,我們沒有辦法通過直接在網頁上處理掉這些上傳,唯一的辦法就是打開OS彈框,去處理彈框。有兩種方法一種通過pywin32上傳(這種只支援python語言),另一種是通過autoit上傳(python和java都支援,其他的沒有實踐過)。這裡我們只會講到autoit上傳文件。
4.1非input控制項上傳文件
宏哥總結了一下,大體上有以下幾種解決方案:
(1)autoIT,藉助外力,我們去調用其生成的au3或exe文件。
(2)Python pywin32庫,識別對話框句柄,進而操作
(3)SendKeys庫
(4)keybd_event,跟3類似,不過是模擬按鍵,ctrl+a,ctrl+c, ctrl+v…
5.準備工作
關於文件上傳,宏哥前邊已經介紹過幾種方法了,今天這篇介紹一個第三方工具,叫AutoIt,簡單來說,這個是一個能支援桌面GUI自動化的工具,它支援腳本語言編寫。這裡,我們用AutoIt來做文件上傳的演示。在Selenium腳本中如果需要AutoIt來協助這個文件上傳功能,大概步驟是這樣的:
1.Selenium點擊web產品上的文件上傳按鈕,彈窗上傳框。
2.執行AutoIt實現準備好的腳本文件,這個腳本文件寫了關於上傳什麼文件的一個.exe文件。
所以,我們先來介紹如何下載和安裝AutoIt。
5.1下載和安裝AutoIt
文件上傳是自動化中棘手的部分,目前selenium並沒有提供上傳的實現api,所以知道藉助外力來完成,如AutoIt、sikuli。
AutoIt , 這是一個使用類似BASIC腳本語言的免費軟體,它設計用於Windows GUI(圖形用戶介面)的自動化操作,利用模擬鍵盤按鍵,滑鼠移動和窗口/控制項的組合來實現自動化任務;
1.打開AutoIt的官網下載
AutoIt下載鏈接://www.autoitscript.com/site/autoit/downloads/ 或者點擊下列圖標進行下載!
2.點擊下載zip
兩種下載方法都可以,這裡我想下載的是zip,解壓出來如下圖所示:
5.2上傳腳本的編寫
1.點擊SciTe文件夾,我們打開腳本編輯器。
2.打開百度圖片上傳窗口,打開AutoIt Windows Info 工具,滑鼠移動到Finder Tool,按住滑鼠左鍵拖動到需要識別的windows控制項上。拖動元素定位器上那個靶點形狀按鈕到文件上傳彈窗,能夠捕獲到一些元素資訊。用滑鼠拖住工具上的Finder Tool的圖標(即圖中藍色圈圈部分)到要識別的控制項上,控制項的唯一標識資訊會顯示在工具的左側部分(圖中紅框標出的部分)。從顯示的結果得知,此控制項的Title=「打開」,Class為Edit,Instance=1。我們就是利用控制項的這些資訊,定位控制項,編寫腳本。
3.打開編輯器,根據控制項Finder Tool識別到的資訊來調用函數編寫腳本;在AutoIt腳本編輯器里輸入如下腳本,不要下面我寫的備註哈。
我們這裡需要知道有以下資訊:
1.操作頁面的title,用於固定操作的頁面。
2.需要填入的資訊,在輸入框中填入「上傳文件的路徑及文件名」(windows操作)
3.點擊「打開」按鈕,實現文件上傳。
根據以上所識別的控制項資訊,利用編輯器SciTE Script Editor,根據AutoIT的語法編寫腳本。
實現文件上傳需要的幾個方法:
ControlFocus ( "窗口標題", "窗口文本", 控制項ID) ---->設置輸入焦點到指定窗口的某個控制項上(即:控制項ID「文件名」輸入框的id) WinWait ( "窗口標題" [, "窗口文本" [, 超時時間]] ) ---->暫停腳本的執行直至指定窗口存在(出現)為止 ControlSetText ( "窗口標題", "窗口文本", 控制項ID, "新文本" ) ---->修改指定控制項的文本(即:控制項ID「文件名」輸入框的id) Sleep ( 延遲 ) ---->使腳本暫停指定時間段 ControlClick ( "窗口標題", "窗口文本", 控制項ID [, 按鈕] [, 點擊次數]] ) ---->向指定控制項發送滑鼠點擊命令(即:控制項ID「打開」按鈕的id)
其中,title即AutoIt Window Info識別出的Title欄位,controlID即AutoIt Window Info識別出的Class和Instance的拼接,如上圖拼接後的結果應為:Button1(即classnameNN)
;ControlFocus(("title","text",controllD)用於識別windows文件上傳窗口 ControlFocus("打開","","") ;向文件名輸入框輸入本地要上傳文件的路徑 ControlSetText("打開","","Edit1","C:\Users\DELL\Desktop\test\upload\北京宏哥.jpeg") Sleep(2000) ;點擊上傳窗口中的「打開「按鈕 ControlClick("打開","","Button1")
5.3驗證上傳腳本是否正確
1.保存腳本文件為ChromFileUpload.au3格式,然後在AutoIt腳本編輯器中點擊Tools菜單,tools=>go,執行腳本驗證(前提是windows窗口必須是打開狀態),驗證成功,如下圖所示:
5.4上傳腳本編譯成一個.exe文件
為了這個腳本能被java 程式調用,需要通過Compile Script to .exe (x64)工具生成exe文件(這個是通過.exe安裝包安裝的AutoIt)
1.AutoIt腳本編輯器中點擊Tools菜單,選擇compile,會在同路徑下生成一個.exe的文件(這個是通過解壓包安裝的AutoIt)
2.提示Conversion complete轉化完成:將ChromeFileUpload.exe拷貝到項目下,待會在Selenium腳本要使用。
5.5java程式碼執行exe文件
//實現文件上傳。通過Runtime的靜態方法獲取Runtime對象 Runtime runtime = Runtime.getRuntime(); //通過Runtime對象調用exe方法 runtime.exec("C:\Users\DELL\Desktop\test\upload\ChromeFileUpload.exe");
6.項目實戰
6.1程式碼設計
實現文件上傳整體程式碼如下:
6.2參考程式碼
package lessons; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; /** * @author 北京-宏哥 * * @公眾號:北京宏哥 * * @《手把手教你》系列技巧篇(五十三)-java+ selenium自動化測試-上傳文件-下篇(詳細教程) * * 2021年12月9日 */ public class AutoItUpload { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驅動路徑 WebDriver driver =new ChromeDriver(); try { driver.get("//www.baidu.com"); driver.manage().window().maximize(); // 點擊照相機這個按鈕 driver.findElement(By.xpath("//*/span[@class='soutu-btn']")).click(); // 點擊本地上傳圖片 driver.findElement(By.xpath("//*/input[@class='upload-pic']")).click(); Thread.sleep(3000); //實現文件上傳。通過Runtime的靜態方法獲取Runtime對象 Runtime runtime = Runtime.getRuntime(); //通過Runtime對象調用exe方法 runtime.exec("C:/Users/DELL/Desktop/test/upload/ChromFileUpload.exe"); Thread.sleep(5000); }catch (Exception e) { e.printStackTrace(); }finally { System.out.println("執行結束,關閉瀏覽器"); driver.quit(); } } }
6.3運行程式碼
1.運行程式碼,右鍵Run AS->Java Appliance,控制台輸出,如下圖所示:
2.運行程式碼後電腦端的瀏覽器的動作,如下小影片所示:
7.小結
這樣,我們就實現了利用AutoIt的自動上傳功能。好了,今天時間也不是很早了,宏哥今天就講解和分享到這裡,感謝您耐心的閱讀