1. 程式人生 > >UI自動化測試(四)AutoIT工具使用和robot對象模擬鍵盤按鍵操作

UI自動化測試(四)AutoIT工具使用和robot對象模擬鍵盤按鍵操作

rop 並保存 cto 右鍵 自動化測試 nqa files 安裝 存在

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對象模擬鍵盤按鍵操作