selenium webdriver沒有提供直接的文件上傳功能,但是在使用的web項目中常常需要對文件進行上傳。在一般的上傳中,是需要點擊上傳按鈕,打開本地的window窗口,但是selenium 是無法直接操作window系統自帶的相關控件。
以下提供兩種關於文件上傳的方法。
普通上傳:普通的附件上傳是將本地文件的路徑作為一個值放在input 標簽中,通過form 表單將這個值提交給服務器。可以通過sendKeys("文件路徑")直接上傳。
插件上傳:一般是指基於Flash、JavaScript 或Ajax 等技術所實現的上傳功能。
演示HTML代碼片段
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上傳實例 - 菜鳥教程</title> </head> <body> <h1>文件上傳實例 - 菜鳥教程</h1> <form method="post" action="/TomcatTest/UploadServlet" enctype="multipart/form-data"> 選擇一個文件: <input type="file" name="uploadFile" /> <br /> <br /> <input type="submit" value="上傳" /> </form> </body> </html>
以下是普通上傳java代碼片段。
public class FileUpload { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe"); ChromeOptions Options = new ChromeOptions(); Options.addArguments("user-data-dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data"); WebDriver driver = new ChromeDriver(Options); driver.manage().window().maximize(); File file = new File("C:\\Users\\happy\\Desktop\\FileUpload.html"); // 用java來實現文件讀取功 \ driver.get(file.getAbsolutePath()); driver.findElement(By.name("uploadFile")).sendKeys("C:\\Users\\happy\\Desktop\\FileUpload.html"); // 獲取文件上傳文半框位置,傳入文件上傳地址。 driver.close(); driver.quit(); } }
通過這種方法上傳,就避免了操作Windows 控件的步驟。如果能找到上傳的input 標簽,那么基本上就可以通過sendKeys()。
插件上傳,可以使用AutoIt 實現上傳 編寫腳本 來實現。AutoIt 的安裝以及使用需要參考AutoIt 使用手冊等相關文檔。selenium 通過AutoIt 來操作window窗口的操作實質是通過java代碼來調用AutoIt 生成的腳本.exe文件。
通過Java調用的exe 程序並不在Java 的可控范圍內。換句話說,exe 執行多長時間,執行是否出錯,Java 程序都無法得知。
以下是在AutoIt 編輯器中編輯的操作文件上傳窗口的代碼。
ControlFocus("打開","","Edit1") ;識別windows窗口 WinWait("[CLASS:#32770]","",10) ;窗口等待十秒 ControlSetText("打開", "", "Edit1", "C:\Users\happy\Desktop\FileUpload.html") ;想輸入框中輸入需要上傳的地址 Sleep(2000) ControlClick("打開", "","Button1"); ;點擊[打開】按鈕
以下是java代碼
public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe"); ChromeOptions Options = new ChromeOptions(); Options.addArguments("user-data-dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data"); WebDriver driver = new ChromeDriver(Options); driver.manage().window().maximize(); File file = new File("C:\\Users\\happy\\Desktop\\FileUpload.html"); // 用java來實現文件讀取功 \ driver.get(file.getAbsolutePath()); driver.findElement(By.name("uploadFile")).click(); // 點擊選擇文件按鈕 Thread.sleep(3000); // 設置等待3秒 Runtime exe = Runtime.getRuntime(); // Java 的Runtime 模塊的getruntime.exec()方法可以調用exe 程序並執行。 try { String str = "E://upload.exe"; exe.exec(str); // 運行指定位置的.exe文件 } catch (IOException e) { System.out.println("Error to run the exe"); e.printStackTrace(); } driver.close(); driver.quit(); }