Java+TestNG+Maven+Selenium的web自動化測試腳本環境的搭建

一、環境搭建

1、安裝java環境

a、 安裝JDK

b、安裝eclipse

c、安裝maven

參考:http://www.cnblogs.com/s1328/p/4620812.html

2、安裝eclipse下的testng插件

Eclipse中點擊Help->Install new software -> 點擊Add

在Location輸入 http://beust.com/eclipse

選中Testng版本,點擊Next,按照提示安裝,安裝完之後重啓Eclipse

3、安裝firefox插件

a、fireBug插件,幫你定位頁面元素

b、firePath插件,可以直接告訴你頁面元素的Xpath

下面需要在Eclipse裏爲我們要做的web自動化測試創建一個Eclipse工程

你需要按照File - New - Project - Maven - Maven Project來創建Maven工程

這裏爲了簡單起見,你可以直接去GitHub拿我創建好的工程 

https://github.com/zhangting85/simpleWebtest

不會用GitHub的同學只要打開這個連接然後點擊Download ZIP這個按鈕就可以下載到創建好的工程源代碼。

然後在Eclipse裏按照File - Import... - Maven - Existing Maven Projects來導入剛剛下載的源代碼。

 

工程結構詳解:

一個最簡單的標準maven工程,源代碼放在src/main/java目錄下,測試代碼放在src/test/java目錄下;

maven還創建了一個pom.xml,負責替你管理所有這個工程所依賴的jar包。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>simple-webtest</groupId>
  <artifactId>simple-webtest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>simple-webtest</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
      <dependency>
          <groupId>org.testng</groupId>
          <artifactId>testng</artifactId>
          <version>6.8.5</version>
      </dependency>
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>2.40.0</version>
      </dependency>
  </dependencies>
</project>

上面的<version>2.40.0</version>中間是版本號,如果selenium要從2.40升級到2.41了,我們只需要改這裏的版本號。不用再去官網下載jar包了。

是不是很方便?

 

4. 檢查環境是否準備完畢

在Eclipse裏剛剛導入的工程裏,找到simpleWebtest.test包下的TestWebdriverEnv.java文件。

右鍵 - Run as - TestNG Test

如果前面步驟均安裝正確,你將看到selenium打開了你的Firefox瀏覽器,並跳轉到我的GitHub工程所在頁面。

命令行裏會輸出Hello World, TestNG

此外,testNG還會在你的工程目錄下創建test-output目錄,裏面存放着默認的testNG測試報告。

 

好。至此一個selenium的腳本開發環境就搭好了。

以上測試代碼只使用了firefox,如果你想創建chrome、ie的測試腳本,

還需要下載對應的driver文件並把這些文件放在你係統的環境變量path裏。

比如,ie的driver文件是IEDriverServer.exe。有需求的朋友就去官網下載吧。

二、編寫簡單線性腳本

1、自動化測試原理

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

1)取預期結果;

2)取實際結果;

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

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

1)定位一個元素

2)操作一個元素

3)斷言

 

這裏用百度首頁的搜索做一個例子:

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 }

下面逐行解釋:

WebDriver driver=new FirefoxDriver();

參考:http://www.cnblogs.com/sdet/p/3633639.html

 

 

這裏是聲明瞭一個 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表達式。

 定位xPath的方法參考:http://www.cnblogs.com/s1328/p/4931145.html

 

https://www.cnblogs.com/s1328/p/4931094.html

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章