自動化腳本


本文將介紹一個Java+TestNG+Maven+Selenium的web自動化測試腳本環境下selenium簡單線性腳本的編寫,並提供全部代碼。

文中將看到,使用selenium編寫一個能操作瀏覽器的腳本是非常容易的。而簡單線性腳本的編寫是下一步編寫頁面對象腳本的基礎。

1.在開始之前,我想明確一下,自動化測試的基本原理。

有的測試人員認為自動化測試很神秘,很神奇。恰恰相反, 自動化測試很簡單 

自動化測試,一般分三個步驟:

1)取預期結果;

2)取實際結果;

3)斷言:比較1)和2)來判斷測試是否通過;

從歷史角度來看,自動化測試的出現早於專職測試人員的出現。也就是說在開始有我們這些專門做軟件測試的測試人員之前,自動化測試已經存在了。

原因就是他 簡單 

selenium自動化測試,在自動化測試里也是屬於超級 簡單 的一類。但前提是必須理解上面說的自動化測試原理,以及其他一些自動化測試設計原則。否則,我們將會看到, 簡單的項目也會失敗 。有很多由初、中級開發人員或會一點點代碼的測試人員編寫的selenium自動化測試項目,因此失敗。

2.簡單的selenium測試腳本編寫,一般也是分三個步驟:

1)定位一個元素

2)操作一個元素

3)斷言

好,這里用百度首頁的搜索做一個例子:

 1 package simplewebtest.test;
 2 3 import java.util.concurrent.TimeUnit; 4 5 import org.openqa.selenium.By; 6 import org.openqa.selenium.WebDriver; 7 import org.openqa.selenium.firefox.FirefoxDriver; 8 import org.testng.annotations.Test; 9 10 public class TestBaiduHome { 11 12 @Test 13 public void searchSomething(){ 14 15 WebDriver driver=new FirefoxDriver();//打開Firefox; open firefox 16 driver.get("http://www.baidu.com");//打開百度open the url 17 driver.findElement(By.id("kw1")).sendKeys("GitHub");//輸入搜索關鍵字“GitHub";input search keyword 18 driver.findElement(By.id("su1")).click();//點擊搜索按鈕click the search button 19 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等頁面加載,10秒內不加載成功即報超時。waiting for 10 seconds 20 String aResult=driver.findElement(By.xpath(".//*[@id='4']/h3/a")).getText();//取第四條搜索結果的標題。 get the text of 4th search result 21 assert aResult.contains("GitHub");//做斷言 assertion 22 driver.findElement(By.xpath(".//*[@id='4']/h3/a")).click();//打開第四個搜索結果。Open the 4th search result on baidu 23 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等頁面加載,10秒內不加載成功即報超時。waiting for 10 seconds 24 25 //獲取所有窗口的handle,然后逐個切換,直到切換到最新窗口 switch to the new window 26 for(String winHandle : driver.getWindowHandles()){ 27 driver.switchTo().window(winHandle); 28 } 29 30 String aTitle=driver.getTitle();//取新窗口的title 31 System.out.println("current widnow title is:"+aTitle);//打出來看看 32 assert aTitle.contains("GitHub");//斷言 33 34 } 35 }
View Code

本系列所有代碼https://github.com/zhangting85/simpleWebtest,

這個例子存放在src/test/java/simplewebtest/test/TestBaiduHome.java

下面逐行解釋:

WebDriver driver=new FirefoxDriver();

這里是聲明了一個 WebDriver 類型的對象引用,我給他起名叫driver;

然后讓這個driver指向WebDriver的一個子類(FirefoxDriver)的對象;

我們知道FirefoxDriver繼承自WebDriver,IEDriver也繼承自WebDriver;

就像蘋果繼承自水果,橘子也繼承自水果;

這里用了Java的向上轉型,使用子類的對象來初始化父類的引用。(注:實際上Webdriver是一個接口。)

這將產生什么效果呢?

我們在driver上調用方法的時候,都是先查找WebDriver里的方法定義,然后jvm去他的子類比如FirfoxDriver中找到其在子類中的實現,再執行的。比如FirefoxDriver的get方法和IEDriver的get方法,他們具體執行的代碼內容明顯是不一樣的。但我們的腳本,只要改變driver引用的子類,而不用改變我后面的方法調用。

也就是說,我們用firefox和用ie,除了第一句話新建對象時不一樣,后面的方法調用都是一樣的。

java會自動根據我們上面這句話里創建的對象,去選擇他應該執行的實際代碼。

這也就是JAVA里的多態,一句話記住多態:用子類對象初始化父類引用,方法調用時自動執行子類代碼,成員變量調用時自動調用父類成員變量。

以上,題外話略多,是希望測試人員不要自我放棄,寫個程序不會有多難,Java的基礎必須要掌握。

driver.get("http://www.baidu.com");

調用Webdriver的get方法,跳轉到制定的URL;

凡是這里跳轉不過去的,十有八九是因為webdriver版本太低,瀏覽器版本太高,請改上一節講的pom.xml里配置的webdriver版本號至最新版。

driver.findElement(By.id("kw1")).sendKeys("GitHub");//輸入搜索關鍵字“GitHub";input search keyword driver.findElement(By.id("su1")).click();//點擊搜索按鈕click the search button

這里調用Webdriver的findElement方法來查找頁面元素。然后在找到的頁面元素WebElement對象上調用sendKeys方法來打字和click方法來點擊。

如果你問我這個id的值是怎么來的,那么你可以去看一下FireBug這個插件,他會替你找到每一個元素的一切屬性。

如果你要定位的元素沒有id,你還可以用className,Xpath,css,等等來定位。

另一個插件FirePath可以幫你產生任意元素的xpath表達式。

findElement方法需要一個By類型的參數。

但是代碼里我們使用了By.id("kw1") 這里的id是一個靜態方法,他的聲明是:

public static By id(java.lang.String id)

所以我們調用By.id的時候,他會返回一個By類型的對象給我們。

至於下面findElement是怎樣用這個對象來查找頁面元素的,暫時不講。簡單來說,就是把我們傳入的id傳給對應的Driver,由driver去查找元素,再返回給我們。

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

很常用的一個等待頁面加載的語句。這個implicityWait是會對driver的下一個findElement調用起作用的。

百度這個搜索結果頁面很有意思,雖然我們感覺不出來,但搜索結果其實是異步顯示上去的,所以不加等待他就會找不到元素。

而后面點擊搜索結果打開一個窗口的時候我們再次用了等待。

另外,這個方法並不是對所有網頁都有效,有時我們要用一些別的等待。還有盡量不要用Thread.sleep

String aResult=driver.findElement(By.xpath(".//*[@id='4']/h3/a")).getText();//取第四條搜索結果的標題。 get the text of 4th search result assert aResult.contains("GitHub");//做斷言 assertion

這兩句,首先去取實際結果,也就是根據某個xpath表達式找到的搜索結果元素上的Text

然后,再判斷他是否符合預期結果,即包含有“GitHub”這個字符串。

assert是TestNG提供的,這里不要用if else去判斷這個字符串。TestNG的assert結果會反映在測試報告里。

也不要自己去拋出一個代表斷言失敗的異常,TestNG會替你完成這件事。

以上兩個錯誤是中低級開發人員編寫測試框架時常犯的。

我們既然用了TestNG,請至少嘗試去用TestNG的功能。

for(String winHandle : driver.getWindowHandles()){ driver.switchTo().window(winHandle); } 

這段代碼表示切換窗口。有意思的是,他是在窗口打開后,先取出所有窗口的hanles,然后一個一個切過去。

因為新窗口必定在最后,所以不論你有幾個窗口,這段代碼總能找到最新一個窗口。如果你還需要操作老窗口,

可以事先把老窗口的Handle保存起來,以后再切回來。

以上一個簡單的線性測試腳本編寫完畢。基本的元素定位、元素操作、窗口切換、斷言都有了,你可以查看官網的文檔,了解各個api的更多方法。

熟練地編寫線性腳本大概需要個把月,有編程基礎的更快,這一篇介紹的內容基本沒有難度。下一篇介紹進階的線性腳本,包括frame,actions,關閉瀏覽器,運行javascript,WebDriverWait。

 

 

 

 

 

 

 

 

 

 

 

 

覺得不錯的可關注微信公眾號在手機上觀看,讓你用手機邊玩邊看


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM