Web上本地上傳圖片,彈出的框Selenium是無法識別的,也就是說,selenium本身沒有直接的方法去實現上傳本地文件,這里總結了兩種上傳文件的方式。
一、利用Robot類處理文件上傳。
其大致流程可以為:
1、 利用selenium點擊web上本地文件的上傳按鈕;
2、 在彈出的彈框中,文件路徑輸入框默認的是光標的聚焦,將文件在磁盤上的路徑通過拷貝和黏貼的方法寫上去。
3、 通過按下回車,默認觸發彈框的確定按鈕,完成文件上傳的功能。
這里以百度首頁的利用圖片搜索為例:
打開百度首頁,搜索按鈕左側有一個照相機的圖標,點擊可以選擇圖片搜索,我們通過本地上傳圖片的過程來模擬文件自動化上傳操作。准備條件,在百度圖片搜索一個圖片,保存到桌面,例如找到一個關於selenium的圖片,然后保存在桌面,名稱為selenium.jpg。
相關實現代碼如下:
package first;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class shangchuang {
public static void main(String[] args)throws Exception {
WebDriver driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
driver.get("https://www.baidu.com");
//指定圖片路徑
StringSelection selection=new StringSelection("C:\\Users\\你的用戶名\\Desktop\\selenium.jpg");
//把圖片路徑復制到剪切板
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null);
System.out.println("selection"+selection);
//點擊照相機這個工具
driver.findElement(By.xpath("//*/span[@class='soutu-btn']")).click();
//點擊本地上傳圖片
driver.findElement(By.xpath("//*/div[@class='upload-wrap']")).click();
//新建一個Robot類的對象
Robot robot=new Robot();
Thread.sleep(1000);
//按下Ctrl+V
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
//釋放Ctrl+V
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_V);
Thread.sleep(2000);
//點擊回車
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
}
}
二、利用AutoIt上傳文件
以上是第一種方的實現,第二種方式是利用AutoIt這個工具。這是一個能支持桌面GUI自動化的工具,它支持腳本語言編寫。在Selenium腳本中如果需要AutoIt來協助這個文件上傳功能,大概步驟是這樣的:
1. Selenium點擊web產品上的文件上傳按鈕,彈窗上傳框。
2.執行AutoIt實現准備好的腳本文件,這個腳本文件寫了關於上傳什么文件的一個.exe文件。
在一切測試工作之前,我們先下載和安裝AutoIt。
1)打開AutoIt的官網下載地址
https://www.autoitscript.com/site/autoit/downloads/
2)點擊下載zip,當然也可以下載Editor。
解壓得到的效果如圖:
3)點擊SciTe文件夾,我們打開腳本編輯器。雙擊SciTE.exe
4)打開百度圖片上傳窗口,同時打開AutoIt 腳本編輯器和元素定位器。拖動元素定位器上那個靶點形狀按鈕到文件上傳彈窗,能夠捕獲到一些元素信息。
5)在AutoIt腳本編輯器里輸入如下腳本,綠色部分為解釋的,不需要寫。
6)編譯成一個.exe文件
先保存到本地,例如默認路徑保存,名稱為UploadFile.au3,然后在AutoIt腳本編輯器中點擊Tools菜單,選擇compile,會在同路徑下生成一個UploadFile.exe的文件,待會在Selenium腳本要使用。
7)Selenium腳本執行UploadFile.exe文件,觀察文件是否上傳。
package first;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class AutoIt {
public static void main(String[] args) throws Exception{
WebDriver driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS);
driver.get("http://www.baidu.com");
//點擊照相機這個工具
driver.findElement(By.xpath("//*/span[@class='soutu-btn']")).click();
//點擊本地上傳圖片
driver.findElement(By.xpath("//*/div[@class='upload-wrap']")).click();
// 執行桌面的AutoIt封裝的腳本
Runtime.getRuntime().exec("C:\\Users\\你的用戶名\\Desktop\\UploadFile.exe");
}
}
我用的是火狐62,最終的效果如圖所示: