自動化腳本

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

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

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

有的測試人員認爲自動化測試很神祕,很神奇。偏偏相反, 自動化測試很簡單 nginx

自動化測試,通常分三個步驟:git

1)取預期結果;github

2)取實際結果;web

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

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

緣由就是他 簡單 api

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。

 

 

 

 

 

 

 

 

 

 

 

 

以爲不錯的可關注微信公衆號在手機上觀看,讓你用手機邊玩邊看

相關文章
相關標籤/搜索