今天我們將探討如何使用Java、selenium2和autoit實(shí)現(xiàn)chrome瀏覽器的右鍵文件另存為功能。特別地,我們將關(guān)注如何動(dòng)態(tài)輸入文件名。這一部分已經(jīng)在最新更新中進(jìn)行了改進(jìn)。
在進(jìn)行Web自動(dòng)化測試時(shí),我們通常使用webdriver來控制各種瀏覽器。然而,當(dāng)需要與windows界面交互時(shí),WebDriver就顯得力不從心了。經(jīng)過研究,我們發(fā)現(xiàn)可以通過AutoIt來實(shí)現(xiàn)對Windows界面的操作。
操作流程如下:首先,使用WebDriver進(jìn)行右鍵點(diǎn)擊操作,顯示出包含“另存為”選項(xiàng)的菜單。然后,使用Robot模擬鍵盤操作,最后調(diào)用AutoIt生成的可執(zhí)行文件來處理彈出的Windows界面。
1、首先,訪問AutoIt的主頁下載并安裝軟件,選擇默認(rèn)安裝路徑即可。https://www.php.cn/link/ad6bf3efd234fc87c76f3158c2a973df
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
2、安裝后,你會(huì)看到以下界面:
| AutoIt Windows Info | 用于幫助我們識別Windows控件信息 | | Compile Script to .exe | 用于將AutoIt腳本轉(zhuǎn)換為可執(zhí)行的exe文件 | | Run Script | 用于執(zhí)行AutoIt腳本 | | SciTE Script Editor | 用于編寫AutoIt腳本 |
3、在AutoIt Windows Info中,務(wù)必注意使用Finder Tool。將工具拖到’Save As’窗口的邊緣,這樣軟件會(huì)聚焦并識別出具體的控件信息。
同樣地,你可以定位文件名框以及“保存”和“取消”按鈕。
4、編寫腳本后,可以使用AutoIt自帶的SciTE Script Editor,或其他文本編輯器來編輯。
代碼語言:JavaScript
;該腳本的語法是: ;分號代表注釋 ;ControlFocus ( "title", "窗口文本", controlID) 設(shè)置輸入焦點(diǎn)到指定窗口的某個(gè)控件上 ;WinWait ( "title題" , "窗口文本" , 超時(shí)時(shí)間 ) 暫停腳本的執(zhí)行直至指定窗口存在(出現(xiàn))為止 ;ControlSetText ( "title", "窗口文本", controlID, "新文本" ) 修改指定控件的文本 ;Sleep ( 延遲 ) 使腳本暫停指定時(shí)間段 ;ControlClick ( "title", "窗口文本", 控件ID , 按鈕 , 點(diǎn)擊次數(shù) ) 向指定控件發(fā)送鼠標(biāo)點(diǎn)擊命令 ;其中,title即AutoIt Window Info識別出的Title字段,controlID即AutoIt Window Info識別 ;出的Class和Instance的拼接,如上圖拼接后的結(jié)果應(yīng)為:Button1 ;第一步:聚焦另存為窗口,title:另存為,"text",controlId:寫ID可以識別 ControlFocus("Save As","","") ;暫停腳本的執(zhí)行直至指定窗口存在(出現(xiàn))為止 WinWait("[CLASS:#32770]","",10) ;第二步:填充文件名地址,其中$CmdLine[1]代表exe執(zhí)行時(shí)的動(dòng)態(tài)參數(shù), ;例如 kuang.exe "D:/test/a.html",這樣就可以動(dòng)態(tài)改變地址的名字,通過python ControlSetText("另存為","","Edit1",$CmdLine[1]) ;上述的我并沒有嘗試成功,所以使用固定文件名 ControlSetText("Save As","","Edit1","D: estoutputReportdownLoadPDFDoc.pdf") ;延時(shí)函數(shù) Sleep(2000) ;第三步:點(diǎn)擊保存按鈕,進(jìn)行下載,title:另存為,"text"寫成空,controlId:寫成Button2(ClassnameNN)也可以識別 ControlClick("Save As","","Button1")
更新:今天成功解決了如何正確使用$CmdLine[1]的問題。
ControlSetText(“另存為”,””,”Edit1″,$CmdLine[1]) 【調(diào)用代碼文中下面紅色更新部分】
編寫完腳本后,可以通過F5鍵運(yùn)行腳本,前提是你的瀏覽器的“另存為”對話框處于打開狀態(tài)。這樣可以檢查腳本是否需要修改。
確認(rèn)腳本無誤后,使用AutoIt中的“Compile Script to .exe”功能生成可執(zhí)行的Windows exe文件。
最后,在Java和Selenium的代碼中調(diào)用生成的exe文件來實(shí)現(xiàn)右鍵“另存為”功能。Java的調(diào)用代碼如下:
代碼語言:javascript
Runtime.getRuntime().exec("D:testdownload.exe");
以下是我的完整代碼,其中測試案例的邏輯是:導(dǎo)航到某個(gè)PDF鏈接,并將其下載。由于無法使用Selenium直接獲取PDF的網(wǎng)頁元素,因此采用右鍵“另存為”方式來下載PDF文件。請注意,我的鏈接可能無法使用,你可以替換為任意網(wǎng)頁鏈接進(jìn)行測試。
代碼語言:javascript
package cn.seleniumcn; import java.awt.Robot; import java.awt.event.KeyEvent; import java.io.IOException; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; import org.testng.annotations.AfterClass; import org.testng.annotations.Test; public class testChromeDriver { WebDriver driver; @Test public void testOne() throws Exception { //driver = new FirefoxDriver(); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("http://pspdf.morningstar.com/v1/equityquant?productid=pdfengine&langid=en-US&secid=0P000001GY&showstar=yes"); WebElement myElement = driver.findElement(By.xpath("http://*[@id='plugin']")); Actions action = new Actions(driver); action.moveToElement(myElement); //移動(dòng)到元素上 Thread.sleep(1000); action.contextClick(myElement).build().perform(); //模擬鍵盤操作(這里是移動(dòng)向下方向鍵) Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_DOWN); Thread.sleep(1000); robot.keyPress(KeyEvent.VK_DOWN); Thread.sleep(1000); robot.keyPress(KeyEvent.VK_DOWN); Thread.sleep(1000); robot.keyPress(KeyEvent.VK_ENTER); Thread.sleep(1000); try { //調(diào)用你使用Compile Script to.exe生成的可執(zhí)行exe文件 //對Windows窗體進(jìn)行操作:更換文件名,并保存到指定文件夾 Runtime.getRuntime().exec("D:testdownload.exe"); } catch (IOException e) { e.printStackTrace(); } } @AfterClass public void tearDown(){ driver.quit(); } }
更新:如上文所述,如果在腳本中使用了$CmdLine[1]參數(shù),那么在Java中調(diào)用exe時(shí)需要傳遞參數(shù)。這樣可以實(shí)現(xiàn)動(dòng)態(tài)文件名和路徑的設(shè)置,無需每次更改腳本文件。這是一個(gè)顯著的改進(jìn)。新的調(diào)用代碼模塊如下:
代碼語言:javascript
String folderPath = "D:dataSourceoutputReport"; File file = new File(folderPath); file.mkdirs(); //新建文件夾 Thread.sleep(1000); //Runtime.getRuntime().exec("D:testdownload.exe"); String fileName = "D:dataSourceoutputReportdownLoadPDFDoc.pdf"; //Runtime.getRuntime().exec("D:testdownload.exe inputfile OutputfilePath"); Runtime.getRuntime().exec("D:testdownload.exe inputfile "+ fileName); //注意一定要用,不要使用/