------Web自動化測試之Webdriver+TestNG--從零到熟練(系列)css
通過前三章咱們對自動化相關內容的學習,咱們瞭解了什麼是自動化測試,測試環境的搭建和WebDriver API的介紹,定位方法及檢測點兒設置等相關知識點。從本章開始,咱們講探討測試用例的編寫,以及其相關的知識點。java
雖然咱們在第二章在搭建測試環境的時候,寫了一個簡單的測試用例檢測環境,不過那不算是一個完整的測試用例。下面咱們以登陸衆籌網爲例,開始咱們測試用例的編寫之旅!編程
首先咱們先寫一下這個測試用例的手工測試步驟:瀏覽器
(1)用瀏覽器打開衆籌網首頁www.zhongchou.com。模塊化
(2)單擊右上角的登陸按鈕,彈出登陸浮層。函數
(3)輸入用戶名和密碼,單擊登陸按鈕,進行登陸。學習
(4)檢測是否登陸成功,並打開了首頁。測試
(5)退出登陸。網站
這是咱們手工測試的步驟,若是要轉化成自動化測試用例,須要轉化成咱們須要的腳本語言編寫的程序。ui
如咱們前面講到的,能夠利用Selenium IDE來錄製測試步驟,而後添加上檢測點,就能夠造成一個測試用例。轉化成咱們須要的腳本語言格式,如java,而後保存文件,放到咱們的開發環境下就能夠調試運行了。
具體的錄製方法以下:
(1)打開火狐瀏覽器,打開Selenium IDE,在IDE的Base URL中輸入要錄製的網站地址:http://www.zhongchou.com。
(2)IDE默認是處於錄製狀態的,若是沒有,單擊紅色按鈕,錄製。在火狐瀏覽器的地址欄中輸入http://www.zhongchou.com,打開百度首頁。
(3)單擊右上角的登陸按鈕,彈出登陸浮層。
(4)在彈出的浮層中輸入 用戶名:183****8905,密碼:a****00,而後單擊登陸按鈕。
(5)在打開的首頁中,右擊右上角的暱稱,如圖4.2.1所示,選擇assert判斷項,設置檢測點。而後退出登陸。
圖4.2.1 設置檢測點
(6)單擊Selenium IDE的回放按鈕,檢測錄製的測試步驟,如圖4.2.2所示,不過此時檢測點會報錯,緣由是執行太快,頁面沒有刷新出來。
圖4.2.2 回放錄製的測試步驟
(7)爲了解決這個問題,咱們在檢測點前添加一個等待。等待咱們要檢測的內容出現後,再去執行判斷。如圖:4.2.3所示,回放驗證成功。
圖4.2.3 添加等待命令
(8)如今說明咱們錄製的測試用例沒有問題,導出錄製的測試用例爲java/Junit/WebDriver格式的,保存爲login.java.如圖4.2.4所示:
圖4.2.4 導出錄製的測試用例
(9)檢查導出的代碼,Selenium IDE幫咱們導出的代碼以下:
#login.java
package com.example.tests;
import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
public class Login {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "http://www.zhongchou.com/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void testLogin() throws Exception {
driver.get(baseUrl + "/");
driver.findElement(By.id("headerLogin")).click();
driver.findElement(By.name("username")).clear();
driver.findElement(By.name("username")).sendKeys("18311338905");
driver.findElement(By.name("user_pwd")).clear();
driver.findElement(By.name("user_pwd")).sendKeys("a000000");
driver.findElement(By.cssSelector("a.zc")).click();
for (int second = 0;; second++) {
if (second >= 60) fail("timeout");
try { if ("潛龍9527".equals(driver.findElement(By.cssSelector("div.siteLgInner")).getText())) break; } catch (Exception e) {}
Thread.sleep(1000);
}
assertEquals("潛龍9527", driver.findElement(By.cssSelector("div.siteLgInner")).getText());
driver.findElement(By.cssSelector("div.siteLgInner")).click();
driver.findElement(By.linkText("退出")).click();
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
private boolean isAlertPresent() {
try {
driver.switchTo().alert();
return true;
} catch (NoAlertPresentException e) {
return false;
}
}
private String closeAlertAndGetItsText() {
try {
Alert alert = driver.switchTo().alert();
String alertText = alert.getText();
if (acceptNextAlert) {
alert.accept();
} else {
alert.dismiss();
}
return alertText;
} finally {
acceptNextAlert = true;
}
}
}
代碼講解:
(10) 將代碼導入到開發環境中。打開Eclipse,新建java工程如:Test。將剛剛保存的login.java文件導入到這個工程中,如圖4.2.5所示:
圖4.2.5導入保存的文件
(11) 運行驗證剛剛導入的代碼,右擊這個文件,「Run as」-->」TestNG test」,查看運行結果。程序沒有任何輸出,經分析,咱們得出緣由:由於咱們導出的是WebDriver格式的,TestNG不識別,若是咱們直接導出TestNG格式的,又沒有WebDriver相關的引用。因此,咱們就修改一下代碼,將「@Before,@After」修改爲「@BeforeTest,@AfterTest」便可運行。但運行過程當中會報錯,如圖4.2.6所示:
圖4.2.6 程序運行結果
這個錯誤緣由是:咱們退出時,先須要將鼠標移到暱稱,會拉出下拉菜單,而後單擊退出菜單進行退出。而Selenium IDE是錄製不到鼠標over到暱稱上的操做的,因此找不到退出按鈕。而mouseover()操做須要導入另外的包,因此咱們採出如下操做來完成退出:
//退出連接:http://www.zhongchou.com/usernew-loginout
driver.get(baseUrl + "usernew-loginout");
(12) 再次執行測試用例,則會打開火狐瀏覽器,登陸到衆籌網,而後檢測登陸是否成功,然後退出。此是測試用例會有如圖4.2.7所示的輸出結果:
圖4.2.7 修改後的測試用例輸出
(12)至此,利用Selenium IDE來錄製測試用例,而且在開發環境下運行經過。但是咱們發現這樣錄製測試用例仍是存在問題的,轉化後會有不少用不到的代碼存在,並且不符合模塊化編程的規範,有些功能還實現不了。因此咱們仍是喜歡本身編寫測試用例,錄製轉化只能看成參考。