一、環境搭建
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。