UI 自動(dòng)化中如何處理上傳文件事件

在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è)面明顯位置給出文章鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幔欧,一起剝皮案震驚了整個(gè)濱河市罪治,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琐馆,老刑警劉巖规阀,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘦麸,居然都是意外死亡谁撼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厉碟,“玉大人喊巍,你說(shuō)我怎么就攤上這事」抗模” “怎么了崭参?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)款咖。 經(jīng)常有香客問(wèn)我何暮,道長(zhǎng),這世上最難降的妖魔是什么铐殃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任海洼,我火速辦了婚禮,結(jié)果婚禮上富腊,老公的妹妹穿的比我還像新娘坏逢。我一直安慰自己,他們只是感情好赘被,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布是整。 她就那樣靜靜地躺著,像睡著了一般民假。 火紅的嫁衣襯著肌膚如雪浮入。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天羊异,我揣著相機(jī)與錄音舵盈,去河邊找鬼。 笑死球化,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓦糟。 我是一名探鬼主播筒愚,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菩浙!你這毒婦竟也來(lái)了巢掺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤劲蜻,失蹤者是張志新(化名)和其女友劉穎陆淀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體先嬉,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧苫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疫蔓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片含懊。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡身冬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岔乔,到底是詐尸還是另有隱情酥筝,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布雏门,位于F島的核電站嘿歌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茁影。R本人自食惡果不足惜宙帝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呼胚。 院中可真熱鬧茄唐,春花似錦、人聲如沸蝇更。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)年扩。三九已至蚁廓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厨幻,已是汗流浹背弃理。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留原在,地道東北人根悼。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像格了,于是被迫代替她去往敵國(guó)和親看铆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容