Java+Selenium2+AutoIt實(shí)現(xiàn)右鍵文件另存為功能

今天我們將探討如何使用Java、selenium2和autoit實(shí)現(xiàn)chrome瀏覽器的右鍵文件另存為功能。特別地,我們將關(guān)注如何動(dòng)態(tài)輸入文件名。這一部分已經(jīng)在最新更新中進(jìn)行了改進(jìn)。

Java+Selenium2+AutoIt實(shí)現(xià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í)筆記(深入)”;

Java+Selenium2+AutoIt實(shí)現(xiàn)右鍵文件另存為功能

2、安裝后,你會(huì)看到以下界面:

Java+Selenium2+AutoIt實(shí)現(xiàn)右鍵文件另存為功能

| 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ì)聚焦并識別出具體的控件信息。

Java+Selenium2+AutoIt實(shí)現(xiàn)右鍵文件另存為功能

同樣地,你可以定位文件名框以及“保存”和“取消”按鈕。

Java+Selenium2+AutoIt實(shí)現(xiàn)右鍵文件另存為功能

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)。這樣可以檢查腳本是否需要修改。

Java+Selenium2+AutoIt實(shí)現(xiàn)右鍵文件另存為功能

確認(rèn)腳本無誤后,使用AutoIt中的“Compile Script to .exe”功能生成可執(zhí)行的Windows exe文件。

Java+Selenium2+AutoIt實(shí)現(xiàn)右鍵文件另存為功能Java+Selenium2+AutoIt實(shí)現(xiàn)右鍵文件另存為功能

最后,在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); //注意一定要用,不要使用/

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊7 分享