UI自動化測試(四)AutoIT工具使用和robot對象模擬鍵盤按鍵操作
AutoIT簡介
AutoIt 目前最新是v3版本,這是一個使用類似BASIC腳本語言的免費軟件,它設計用於Windows GUI(圖形用戶界面)中進行自動化操作。它利用模擬鍵盤按鍵,鼠標移動和窗口/控件的組合來實現自動化任務。而這是其它語言不可能做到或無可靠方法實現的(例如VBScript和SendKeys)。
實現原理:
使用AutoIT下的工具去定位頁面外的元素屬性值,其次再利用AutoIT下的工具編寫合適的腳本,然後將腳本編譯成可執行文件,最後在自動化實現時,直接調用此腳本實現文件的上傳、下載等操作。
備註:定位元素、編寫腳本和編譯,需要借助AutoIT提供的工具,但是腳本編譯成可執行文件後,可以直接使用。
AutoIT的下載及安裝
下載地址:https://www.autoitscript.com/site/autoit/downloads/
打開網頁,點擊如下圖所示按鈕,即可下載:
AutoIT的安裝
安裝很簡單,一路默認路徑就好,安裝成功後,在開始菜單可看到如下圖所示界面:
使用AutoIT工具的步驟
1.AutoIT Window Info用來識別Windows控件,根據識別的控件信息編寫腳本;x86為32位
2.SciTE Script Editor用來寫腳本,並保存為au3格式
3.Complie Script to .exe, 將剛編寫的腳本,編譯成可執行文件;
4.編譯後在java代碼中中調用
想必介紹到這,或多或少有所了解了,對AutoIT工具下的功能點也清楚了,Run Script是運行腳本的,我們是要到java代碼中調用,所以此處就略過了。
實例一
接下來就用一個實例來講解下AutoIT工具的具體使用,實例功能是:把百度首頁中的百度圖片另存為到本地或任意磁盤
在做這個事情的時候,我們要知道,步驟是先要選中圖片,並右擊,選擇另存為,然後輸入文件名以及保存的位置,最後點擊保存。人工操作鼠標很簡單,但現在是要使用代碼來實現該功能,可細化分為三步,如下:
1.使用Selenium功能彈出右鍵菜單
2.利用robot選擇相關菜單
3.調用AutoIT實現另存為操作
4.到java代碼中調用
實現第一步,在瀏覽器中定位到圖片元素,代碼如下:
WebElement img = driver.findElement(By.cssSelector("div#lg img")); Actions action = new Actions(driver); action.contextClick().perform();
實現第二步,模擬鍵盤操作,鼠標移到另存為處,使用robot對象,代碼如下:
Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_DOWN); Thread.sleep(1000); robot.keyPress(KeyEvent.VK_DOWN);
VK_DWON是操作按鈕向下按一下的意思,因為另存為在右鍵菜單中的第二行,所以需要向下按兩下實現
實現上述兩步代碼後,會彈出如下所示框,讓輸入文件名以及保存路徑,該對話框已經是頁面外的元素了,使用普通的定位時定不到了,所以就需要使用AutoIT工具來實現。
實現第三步,操作如下:
①打開autoit工具包下的AutoIT Window Info(x64)工具,版本按自己電腦系統來,界面如下所示:
1.1鼠標點中Finder Tool並拖動到輸入文件名處,操作如下所示,得到下圖結果
1.2重復上述定位步驟,定位保存按鈕,結果如下圖所示
②元素定位到了,接下來就是使用AutoIT工具包下的SciTE Script Editor寫腳本,並保存為au3格式,註意:此工具中;表註釋
根據定位到的參數值,寫如下腳本:
ControlFocus("另存為", "","Edit1") WinWait("[CLASS:#32770]","",10)
;文件路徑 ControlSetText("另存為", "", "Edit1", "d:\baidu.png") Sleep(2000) ControlClick("另存為", "","Button2")
代碼解釋:
第一行:ControlFocus ( "title", "窗口文本", controlID) 設置輸入焦點到指定窗口的某個控件上;
第二行:WinWait ( "title題" , "窗口文本" , 超時時間 ) 暫停腳本的執行直至指定窗口存在(出現) 為止;
第三行:;表註釋
第四行:ControlSetText ( "title", "窗口文本", controlID, "新文本" ) 修改指定控件的文本;
第五行:Sleep ( 延遲 ) 使腳本暫停指定時間段;
第六行:ControlClick ( "title", "窗口文本", 控件ID , 按鈕 , 點擊次數 ) 向指定控件發送鼠標點擊命令;
其中, title即AutoIt Window Info識別出的Title字段, controlID即AutoItWindow Info識別出的Class和Instance的拼接, 如上圖拼接後的結果應為:Button2。
③使用AutoIT工具包下的Complie Script to .exe工具把剛編寫的腳本編譯成可執行文件,操作如下:
執行上步驟後,會出現baidu.exe可執行文件
第四步,到java代碼中調用該可執行文件,操作代碼如下:
Runtime.getRuntime().exec("d:/baidu.exe");
運行java代碼,在定義的路徑下會看到已保存的百度圖片,如下所示:
整體代碼實現如下,僅供參考:
1 package com.ui.day1; 2 3 import java.awt.AWTException; 4 import java.awt.Robot; 5 import java.awt.event.KeyEvent; 6 7 import org.openqa.selenium.By; 8 import org.openqa.selenium.WebDriver; 9 import org.openqa.selenium.WebElement; 10 import org.openqa.selenium.chrome.ChromeDriver; 11 import org.openqa.selenium.interactions.Actions; 12 13 public class test_demo_autoit { 14 15 public static void main(String[] args) throws Exception { 16 System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe"); 17 WebDriver driver=new ChromeDriver(); 18 driver.get("https://www.baidu.com/"); 19 driver.manage().window().maximize(); 20 21 WebElement move = driver.findElement(By.cssSelector("div#lg img")); 22 Actions action = new Actions(driver); 23 action.contextClick(move).perform(); 24 Thread.sleep(2000); 25 Robot robot = new Robot(); 26 robot.keyPress(KeyEvent.VK_DOWN); 27 Thread.sleep(1000); 28 robot.keyPress(KeyEvent.VK_DOWN); 29 Thread.sleep(1000); 30 robot.keyPress(KeyEvent.VK_ENTER); 31 32 Runtime.getRuntime().exec("d:/baidu.exe"); 33 34 35 36 } 37 38 }
將百度首頁中的圖片另存為還有一個實現方法,不用robot對象,直接在AutoIT編寫腳本中發送個V,因為選擇另存為和按V是一樣的作用,AutoIT編寫腳本代碼如下:
send("v") Sleep(1000) ControlFocus("另存為", "","Edit1") WinWait("[CLASS:#32770]","",10) ControlSetText("另存為", "", "Edit1", "d:\baidu.png") Sleep(2000) ControlClick("另存為", "","Button2")
在java代碼中實現如下,僅供參考:
1 package com.ui.day1; 2 import org.openqa.selenium.By; 3 import org.openqa.selenium.WebDriver; 4 import org.openqa.selenium.WebElement; 5 import org.openqa.selenium.chrome.ChromeDriver; 6 import org.openqa.selenium.interactions.Actions; 7 8 public class yihuqingjiu_test_demo_autoit1 { 9 10 public static void main(String[] args) throws Exception { 11 System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe"); 12 WebDriver driver=new ChromeDriver(); 13 driver.get("https://www.baidu.com/"); 14 driver.manage().window().maximize(); 15 16 WebElement move = driver.findElement(By.cssSelector("div#lg img")); 17 Actions action = new Actions(driver); 18 action.contextClick(move).perform(); 19 Thread.sleep(2000); 20 Runtime.getRuntime().exec("d:/baidu.exe"); 21 22 } 23 24 }
實例二
在禪道中上傳附件,從實例一中已明白整個操作過程,因而在該實例中便只介紹下頁面外元素定位以及java代碼實現。
頁面外元素定位,編寫腳本代碼如下所示:
ControlFocus("打開", "","Edit1") WinWait("[CLASS:#32770]","",10) ControlSetText("打開", "", "Edit1", "F:\new\UI\測試.pdf") Sleep(2000) ControlClick("打開", "","Button1")
java代碼實現如下,僅供參考:
1 package com.ui.day1; 2 3 import org.openqa.selenium.By; 4 import org.openqa.selenium.WebDriver; 5 import org.openqa.selenium.chrome.ChromeDriver; 6 7 public class yihuqingjiu_test_demo_au { 8 9 public static void main(String[] args) throws Exception { 10 System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe"); 11 WebDriver driver=new ChromeDriver(); 12 driver.get("http://127.0.0.1/zentao/my/"); 13 driver.manage().window().maximize(); 14 driver.findElement(By.id("account")).sendKeys("admin"); 15 Thread.sleep(1000); 16 driver.findElement(By.name("password")).sendKeys("123456"); 17 Thread.sleep(1000); 18 //點擊登錄 19 driver.findElement(By.xpath("//button[@id=‘submit‘]")).click(); 20 Thread.sleep(2000); 21 //點擊測試 22 driver.findElement(By.linkText("測試")).click(); 23 Thread.sleep(1000); 24 //點擊Bug 25 driver.findElement(By.linkText("Bug")).click(); 26 Thread.sleep(1000); 27 //點擊提交Bug 28 driver.findElement(By.xpath("//a[@href=‘/zentao/bug-create-5-0-moduleID=0.html‘]")).click(); 29 Thread.sleep(1000); 30 31 //調用AutoIT工具 32 Runtime.getRuntime().exec("d:/chandao/chandao.exe"); 33 Thread.sleep(5000); 34 35 } 36 37 }
需要註意的是,使用AutoIT工具時進行自動化腳本運行時,要把殺毒軟件關掉,不然會影響,誤判是病毒
robot對象模擬鍵盤按鍵操作
在前一篇中說到的鍵盤事件,是使用Actions類,但實現效果不明顯,所以用Robot類,創建robot對象來實現,效果很好,話不多說,直接上代碼。
代碼實現如下,僅供參考:
1 package com.ui.day1; 2 3 import java.awt.Robot; 4 import java.awt.event.KeyEvent; 5 6 import org.openqa.selenium.By; 7 import org.openqa.selenium.WebDriver; 8 import org.openqa.selenium.WebElement; 9 import org.openqa.selenium.chrome.ChromeDriver; 10 11 public class yihuqingjiu_test_robot_mouse { 12 13 public static void main(String[] args) throws Exception { 14 System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe"); 15 WebDriver driver=new ChromeDriver(); 16 //瀏覽器要加載的url 17 driver.get("https://www.baidu.com"); 18 //窗口最大化 19 driver.manage().window().maximize(); 20 21 WebElement ctr1=driver.findElement(By.cssSelector("#kw")); 22 ctr1.sendKeys("12306"); 23 Thread.sleep(1000); 24 25 //按下ctrl+F4 26 Robot robot = new Robot(); 27 robot.keyPress(KeyEvent.VK_ALT); 28 robot.keyPress(KeyEvent.VK_F4); 29 robot.keyRelease(KeyEvent.VK_ALT); 30 31 //按下ctrl+shift+delete 32 Robot robot1 = new Robot(); 33 robot1.keyPress(KeyEvent.VK_CONTROL); 34 robot1.keyPress(KeyEvent.VK_SHIFT); 35 robot1.keyPress(KeyEvent.VK_DELETE); 36 robot1.keyRelease(KeyEvent.VK_CONTROL); 37 robot1.keyRelease(KeyEvent.VK_SHIFT); 38 robot1.keyRelease(KeyEvent.VK_DELETE);//delete鍵可不釋放,但ctrl+shift鍵必須釋放 39 40 } 41 42 }
鍵盤事件實現時,需要值得註意的是,ctrl,shift、alt鍵需要釋放,不然會影響後者操作。
按下操作的關鍵字是keyPress(),按鍵釋放關鍵字是keyRelease()
本文僅代表作者觀點,系作者@溫一壺清酒發表。轉載請註明出處:http://www.cnblogs.com/hong-fithing/
UI自動化測試(四)AutoIT工具使用和robot對象模擬鍵盤按鍵操作