1.標簽是input,如下圖所示:
WebElement e1= driver.findElement(By.id("load"));
//輸入要上傳文件的地址
e1.sendKeys("D:\\Work\\eclipse_workspace\\seleniumdemo\\res\\被上傳的文件.txt");
2.使用autoit腳本上傳方式
有的上傳控件不是input元素,這個時候利用sendkeys方法是行不通的。此時可以通過autoit來幫助我們實現上傳功能,先了解下什么是autoit。它是一個使用類似BASIC腳本語言的免費軟件,它設計用於Windows GUI(圖形用戶界面)中進行自動化操作。它利用模擬鍵盤按鍵,鼠標移動和窗口/控件的組合來實現自動化任務。而這是其它語言不可能做到或無可靠方法實現的
我們主要利用autoit來實現對上傳文件彈窗的定位,然后對彈窗中地址框賦值(文件路徑),然后點擊確定按鈕進行上傳文件,如下圖:
具體思路知道該怎么做了,下面通過autoit腳本來實現。
首先你需要安裝autoit(官網:https://www.autoitscript.com/site/),直接默認安裝即可。
接下來需要通過AutoIt Window Info (x86)或者AutoIt Window Info (x64)(這個是你剛才安裝的autoit自帶的應用程序,你可以在開始菜單中找到,如果開始菜單中沒有請到安裝目錄下查找),先打開AutoIt Window Info ,如圖:
打開其中對應你windows的程序,界面如下:
這個工具是定位windows gui(windows界面)元素用的。接下來會對上傳彈出框進行定位。
那百度的個人頭像上傳功能,點擊選擇圖片:
之后,會彈出:
然后找切換到剛才打開的AutoIt Window Info 工具,找到Finder Tool:然后用鼠標拖動此圖標到文件上傳彈窗的 文件名輸入框:
記錄下文件名輸入框的classname值。然后用上面的方法在獲取下“打開”按鈕的calssname,如圖:
記錄好“打開”按鈕的calssname。接下來根據定位值來編寫autoit腳本。
打開安裝目錄下的:SciTE Script Editor應用程序:
輸入下面的代碼:
;first make sure the number of arguments passed into the scripts is more than 1 If $CmdLine[0]<2 Then Exit EndIf ;if parmas num <2 ,then break ;$CmdLine[0] ;參數的數量 ;$CmdLine[1] ;第一個參數 (腳本名稱后面) ;$CmdLine[2] ;第二個參數 ;都是從cmd傳入參數 handleUpload($CmdLine[1],$CmdLine[2]) ;定義上傳函數,有兩個參數,第一個是瀏覽器名字,第二參數是文件路徑 Func handleUpload($browser, $uploadfile) Dim $title ;定義一個title變量 ;根據彈窗的title來判斷是什么瀏覽器 If $browser="ie" Then ; 代表IE瀏覽器 $title="選擇要加載的文件" ElseIf $browser="chrome" Then ; 代表谷歌瀏覽器 $title="打開" ElseIf $browser="firefox" Then ; 代表火狐瀏覽器 $title="文件上傳" EndIf if WinWait($title,"",4) Then ;等待彈出出現,最大等待時間是4秒 WinActivate($title) ;找到彈出窗口之后,激活當前窗口 ControlSetText($title,"","Edit1",$uploadfile) ;把文件路徑放入輸入框,此”Edit1“是用FinderTool獲取到的 ControlClick($title,"","Button1") ;點擊保存或者打開或者上傳按鈕,此“Button1”使用FinderTool獲取到的 Else Return False EndIf EndFunc
需要強調的是,autoit是根據彈窗的名字來給文件名輸入框賦值和點擊按鈕等操作的,由於不同的瀏覽器彈窗的名字可能不一樣,這里要謹慎選擇。
autoit的腳本到此寫完了,但是由於我們是在cmd中調用,需要將其轉換成exe可執行文件。
打開autoit安裝目錄下的應用程序:Compile Script to .exe (x86)或者Compile Script to .exe (x64),
然后按照圖中操作:
點擊Conver按鈕,則成功講upload.au3腳本轉換為運行文件upload.exe,如下圖:
接下來測試下效果,打開cmd,輸入:"C:\Users\Jing\Documents\upload.exe" "firefox" "C:\Users\Public\Pictures\pic.jpg" 雙引號不要省略,如圖:
之后回到網頁,查看剛才的頭像已被上傳:
這里需要強調下腳本在cmd的試用,第一個參數的是autoit exe腳本文件,第二是 autoit腳本函數需要的參數,回頭看看腳本,一個參數是瀏覽器名字:chrome或者ie或者firefox,第二個參數是要上傳文件的路徑,並且都要用英文環境下的雙引號括起來,就形成了下面的代碼:
"C:\Users\Jing\Documents\upload.exe" "firefox" "C:\Users\Public\Pictures\pic.jpg"
如何在Selenium中調用此腳本呢?你可以封裝成一個執行這個exe文件的方法:
/** * 上傳文件,需要點擊彈出上傳照片的窗口才行 * * @parambrower * 使用的瀏覽器名稱 * @paramfile * 需要上傳的文件及文件名 */ publicvoidhandleUpload(String browser, File file) { String filePath= file.getAbsolutePath(); String executeFile= "res/script/autoit/Upload.exe"; //定義了upload.exe文件的路徑 String cmd= "\""+ executeFile+ "\""+ " "+ "\""+ browser+ "\""+ " "+ "\""+ filePath+ "\""; try{ Process p= Runtime.getRuntime().exec(cmd); p.waitFor(); } catch(Exception e) { e.printStackTrace(); } }
然后在需要有上傳文件的用例中調用,具體步驟是:
先去用selenium點擊上傳文件按鈕,之后會彈出上傳文件輸入框,最后執行上面那個public void handleUpload(String browser, File file)方法即可。