在UI自動(dòng)化中市咆,我們經(jīng)常會(huì)遇到上傳文件操作。處理上傳事件是一個(gè)比較麻煩的操作押桃,因?yàn)辄c(diǎn)擊上傳控件會(huì)彈出Windows窗口供用戶選擇文件,但是Windows窗口是瀏覽器之外的組件分蓖,所以selenium本身無(wú)法處理這個(gè)windows窗口。這里給大家?guī)讉€(gè)處理思路尔许,我們先看一下下面這個(gè)HTML么鹤。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>test</title>
<script language="javaScript">
function toAlert()
{
alert("hello continue...");
}
</script>
</head>
<body>
<form>
<table >
<tr>
<td>
<input name="file" type="file"/>
</td>
</tr>
</table>
</form>
</body>
</html>
用notepad++ 打開(kāi),將它存成一個(gè) autotest.html文件味廊,打開(kāi)之后蒸甜,只有一個(gè)上傳按鈕,我們來(lái)看一下怎么處理上傳事件余佛。
1
直接調(diào)用selenium自帶的sendkeys進(jìn)行操作柠新,將需要上傳的文件路徑直接傳遞進(jìn)上傳控件。
2.import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
/**
* Description:
* Author: ChrisMa
* Date: 2019-05-15
*/
public class testupload2 {
public static void main(String ags[]) throws InterruptedException {
//初始化webdriver
WebDriver driver = new ChromeDriver();
//打開(kāi)本地html
driver.get("file:///D:/UI/autotest1.html");
// 將文件所在路徑傳遞給上傳文件控件
driver.findElement(By.name("file")).sendKeys("D:\text.txt");
// 等待看到結(jié)果
Thread.sleep(10000);
//關(guān)閉webdriver
driver.quit();
}
}
這種方案可以解決大部分的上傳操作辉巡,可是對(duì)于一些上傳框禁止輸入的就無(wú)法操作了恨憎,這時(shí)候我們就要考慮其他方案。
2
針對(duì)無(wú)法輸入的红氯,我們可以考慮采用AutoIT來(lái)進(jìn)行上傳框咙。
AutoIt目前最新是v3版本,這是一個(gè)使用類(lèi)似BASIC腳本語(yǔ)言的免費(fèi)軟件,它設(shè)計(jì)用于Windows GUI(圖形用戶界面)中進(jìn)行自動(dòng)化操作痢甘。它利用模擬鍵盤(pán)按鍵,鼠標(biāo)移動(dòng)和窗口/控件的組合來(lái)實(shí)現(xiàn)自動(dòng)化任務(wù)茉贡。
官方網(wǎng)站:https://www.autoitscript.com/site/
從網(wǎng)站上下載AutoIt并安裝塞栅,安裝完成在菜單中會(huì)看到下圖的目錄:
AutoIt Windows Info 用于幫助我們識(shí)Windows控件信息。
Compile Script to.exe 用于將AutoIt生成 exe 執(zhí)行文件腔丧。
Run Script 用于執(zhí)行AutoIt腳本放椰。
SciTE Script Editor 用于編寫(xiě)AutoIt腳本。
我們打開(kāi)html 網(wǎng)頁(yè)愉粤,然后點(diǎn)擊一下上傳按鈕:
下面我們看一下怎么用autoIT來(lái)處理這個(gè)上傳砾医。
? 打開(kāi)AutoIT Window Info,然后點(diǎn)擊Finder Tool衣厘,不松開(kāi)左鍵如蚜,等鼠標(biāo)變成瞄準(zhǔn)器類(lèi)型時(shí),將鼠標(biāo)挪動(dòng)到文件上傳框需要識(shí)別的控件上松開(kāi)左鍵影暴。
識(shí)別出對(duì)象之后所有的信息會(huì)顯示在AutoIT windows info里
經(jīng)過(guò)識(shí)別窗口的title為“Open”错邦,標(biāo)題的Class為“#32770”。
文件名輸入框的class 為“Edit”型宙,Instance為“1” 撬呢,所以ClassnameNN為“Edit1”。
打開(kāi)按鈕的class 為“Button”妆兑,Instance為“1” 魂拦,所以ClassnameNN為“Button1”毛仪。
我們打開(kāi)SciTE Script Editor,然后將下列代碼填入:
;ControlFocus("title","text",controlID) Edit1=Edit instance 1
ControlFocus("Open", "","Edit1")
; Wait 10 seconds for the Upload window to appear
WinWait("[CLASS:#32770]","",10)
; Set the File name textmargin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; color: rgb(51, 51, 51); font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 17px; letter-spacing: 0.544px; text-align: left; text-indent: 39pt;">
ControlSetText("Open", "", "Edit1", "D: est.txt")
Sleep(2000)
; Clickmargin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; color: rgb(51, 51, 51); font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 17px; letter-spacing: 0.544px; text-align: left; text-indent: 39pt;">
ControlClick("Open", "","Button1");
將script在SciTE Script Editor保存之后芯勘,打開(kāi)上傳窗口箱靴,在SciTE Script Editor中選擇Tools->go, 來(lái)查看一下文件是否可以上傳。
確認(rèn)腳本運(yùn)行正常借尿, 我們將這個(gè)腳本保存成Script.au3, 然后打開(kāi)Compile Script to.exe刨晴,將Script.au3文件轉(zhuǎn)換為Script.exe:
這個(gè)時(shí)候,我們打開(kāi)上傳文件控件路翻,雙擊Script.exe文件狈癞,可以看到文件上傳事件已經(jīng)處理成功。
接下來(lái)茂契,就是使用java來(lái)調(diào)用該EXE文件:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
/**
* Description:
* Author: ChrisMa
* Date: 2019-05-15
*/
public class testupload2 {
public static void main(String ags[]) throws InterruptedException {
//初始化webdriver
WebDriver driver = new ChromeDriver();
//打開(kāi)本地html
driver.get("file:///D:/ UI/autotest.html");
// 點(diǎn)擊選擇文件按鈕
driver.findElement(By.name("file")).click();
// 設(shè)置等待3秒
Thread.sleep(3000);
// Java 的Runtime 模塊的getruntime.exec()方法可以調(diào)用exe 程序并執(zhí)行蝶桶。
Runtime exe = Runtime.getRuntime();
try {
String str = "D://Script.exe";
// 運(yùn)行指定位置的.exe文件
exe.exec(str);
} catch (IOException e) {
System.out.println("Error to run the exe");
e.printStackTrace();
}
// 等待看到結(jié)果
Thread.sleep(10000);
//關(guān)閉webdriver
driver.quit();
}
}
借助AutoIT也有自己的限制,比如只能在Windows系統(tǒng)中進(jìn)行掉冶,如果要移植到其他系統(tǒng)真竖,就得參考其他方式。
3
如果想在非Windows系統(tǒng)中處理上傳厌小,我們可以用純Java的形式處理恢共,這時(shí)候,我們就要用到Robot這個(gè)類(lèi)璧亚,在該過(guò)程中流程表現(xiàn)為:打開(kāi)上傳文件的控件->將文件在磁盤(pán)上的路徑讨韭,通過(guò)robot copy pasty進(jìn)去(需要文件輸入框默認(rèn)是光標(biāo)聚焦)->按下回車(chē),觸發(fā)彈窗確定按鈕癣蟋,完成文件上傳過(guò)程
4
代碼如下:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
/**
* Description:
* Author: ChrisMa
* Date: 2019-05-15
*/
public class testupload {
public static void main(String ags[]) throws InterruptedException, AWTException {
//初始化webdriver
WebDriver driver = new ChromeDriver();
//打開(kāi)本地html
driver.get("file:///D:/ UI/autotest.html");
// 指定上傳文件的路徑
StringSelection sel = new StringSelection("D:\test\test1.txt");
// 把圖片文件路徑復(fù)制到剪貼板
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(sel,null);
System.out.println("selection" +sel);
// 點(diǎn)擊上傳按鈕
driver.findElement(By.name("file")).click();
// 新建一個(gè)Robot類(lèi)的對(duì)象
Robot robot = new Robot();
Thread.sleep(1000);
// 按下回車(chē)
robot.keyPress(KeyEvent.VK_ENTER);
// 釋放回車(chē)
robot.keyRelease(KeyEvent.VK_ENTER);
// 按下 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(1000);
// 點(diǎn)擊回車(chē) Enter
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
// 等待看到結(jié)果
Thread.sleep(10000);
//關(guān)閉webdriver
driver.quit();
}
}
上傳文件咱們就先處理到這里透硝,希望可以給大家開(kāi)闊思路,大家下次見(jiàn)疯搅。
作 者:Testfan Chris
出 處:微信公眾號(hào):自動(dòng)化軟件測(cè)試平臺(tái)
版權(quán)說(shuō)明:歡迎轉(zhuǎn)載濒生,但必須注明出處,并在文章頁(yè)面明顯位置給出文章鏈接