TestNG+Selenium實現簡單的Web前端測試
Selenium應該是目前前端測試最主流的測試工具吧,支援主流瀏覽器如Firefox、Chrome、IE等,無論你熟悉Python還是Java,都可以方便的使用Selenium提供的豐富的測試套件,還有其它很多基於Selenium二次封裝開發的測試框架如Robot Framework可供選擇。
這次是第一次使用Java操作WebDriver,以TestNG作為測試框架,實現簡單的Web前端測試。
IDE: Eclipse Oxygen.3a Release (4.7.3a)
Step1:開啟Eclipse,在Help - Install New Software…中搜索並安裝TestNG外掛
安裝重啟之後可在Window - Show View - Other裡,Java下檢視到TestNG
Step2:使用Eclipse自帶的Maven外掛(或者在Window - Preferences - Maven - Installations新增系統安裝的其它版本Maven),新建一個Maven專案
輸入groupId和artifactId
Step3:在testExample/pom.xml中新增TestNG、Selenium作為dependencies,若只想使用特定的WebDriver實現,如Firefox,可直接新增selenium-firefox-driver作為dependency。
<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>testExamples</groupId>
<artifactId> testExamples</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>3.13.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
</dependency>
</dependencies>
</project>
Alt+F5選擇專案進行更新,可以在Maven Dependencies裡檢查依賴包是否存在
右鍵點選JRE System Library, 改成系統預設
Step4:下載瀏覽器對應的driver放到特定目錄下(如C:\webdriver),可檢視官網下載地址 。如使用Firefox,需要到這裡下載最新的geckdriver.exe。
Step5:右鍵點選專案,建立一個新的TestNG class並指定package。
可選:
- Annotations,後面可在定義測試類的時候新增
- XML suite file,在這裡新增可直接在package裡生成suite檔案;也可以預設,建立好測試類之後右鍵選擇專案TestNG - Convert to TestNG,會在專案下生成suite檔案包含專案裡不同package的所有測試類。本文暫時不涉及Test Suite的使用。
Step6:實現測試類
用例1:
AUT - http://live.guru99.com/index.php/
測試類如下
package selenium;
import org.testng.annotations.Test;
import static org.testng.Assert.assertTrue;
import java.util.List;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
public class testPractice1 {
private String aut_url = "http://live.guru99.com/index.php/";
private WebDriver driver;
@Test
public void checkMainTitle() {
driver.get(aut_url);
String title1 = getTitle();
assertTrue(title1.contains("THIS IS DEMO SITE"));
}
@Test
public void checkMobileTitle() {
driver.findElement(By.linkText("MOBILE")).click();
String title2 = getTitle();
assertTrue(title2.equals("MOBILE"));
}
@Test
public void checkSortByName() {
List<WebElement> list1 = getProductList();
list1.sort((e1, e2) -> e1.getAttribute("title").compareTo(e2.getAttribute("title")));
Select sort_type = new Select(driver.findElement(By.xpath("//select")));
sort_type.selectByVisibleText("Name");
List<WebElement> list2 = getProductList();
for (WebElement a:list2) {
int index = list2.indexOf(a);
assertTrue(a.getAttribute("title").equals(list1.get(index).getAttribute("title")));
}
}
@BeforeClass
public void setUp() {
System.setProperty("webdriver.gecko.driver", "C:\\webdriver\\geckodriver.exe");
driver = new FirefoxDriver();
}
@AfterClass
public void afterTest() {
driver.quit();
}
public List<WebElement> getProductList() {
List<WebElement> list = driver.findElements(By.xpath("//h2[@class='item last']/a"));
return list;
}
public String getTitle() {
WebElement title = driver.findElement(By.className("page-title"));
String t = null;
if (title.isDisplayed()) {
t = title.getText();
System.out.println("Current title is:"+t);
}
return t;
}
}
用例2:
AUT - https://tokenpad.io (借用朋友公司開發的產品頁面)
1. 註冊新使用者
- 測試註冊成功,頁面提示下一步
- 測試註冊失敗,頁面提示警告資訊
2. 登陸
- 測試登陸成功,頁面跳轉到登陸之後的Dashboard
- 測試 登陸失敗,頁面提示警告資訊
在多用例的測試類中除錯單個用例的時候可以用類似@Test(enabled=false),@AfterTest(enabled=false)來阻止其它用例或步驟執行。
package testPractice;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.util.List;
public class Practice2 {
private String base_url = "https://tokenpad.io";
private String login_url = base_url+"/auth/login";
private String signup_url = base_url+"/auth/sign-up";
private String dashboard_url = "https://tokenpad.io/invest/dashboard/onboard";
private WebDriver driver;
private String userId1 = "[email protected]";
private String passwd1 = "1234qwer";
private String userbase = "test";
private String passwd = "12345678";
private int delay = 3;
WebDriverWait waitVar = null;
@Test
public void checkLoginSuccessfully() throws InterruptedException {
String expected_text = "Welcome to Tokenpad";
login(userId1, passwd1);
Thread.sleep(5000);
if (driver.findElement(By.tagName("app-init")).isEnabled()) {
assertTrue(driver.getCurrentUrl().contains(dashboard_url));
assertTrue(driver.findElement(By.xpath("//div[@class='title']")).getText().contains(expected_text));
}
else {
fail();
}
}
@Test
public void checkLoginFailed() {
String expected_alert = "The email or password you have entered is invalid.";
login(userId1, passwd);
waitVar.until(ExpectedConditions.visibilityOfElementLocated(By.tagName("alert")));
assertTrue(driver.findElement(By.xpath("//div[@role='alert']")).getText().contains(expected_alert));
}
@Test
public void checkSignUpFailed() {
String country = "China";
String expected_alert = "Your email is already been used.";
signUp(userId1, passwd1, country);
waitVar.until(ExpectedConditions.visibilityOfElementLocated(By.tagName("alert")));
assertTrue(driver.findElement(By.xpath("//div[@role='alert']")).getText().contains(expected_alert));
}
@Test
public void checkSignUpSucceed() {
String country = "Sweden";
String userId = userbase+String.valueOf(System.currentTimeMillis())+"@test.com";
signUp(userId, passwd, country);
waitVar.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.className("send-validation")));
assertTrue(driver.findElement(By.xpath("//h2[text()='Confirm Your Email']")).isDisplayed());
}
public void signUp(String user, String password, String country) {
driver.get(signup_url);
waitVar.until(ExpectedConditions.visibilityOfElementLocated(By.className("login-form")));
driver.findElement(By.name("email")).sendKeys(user);
driver.findElement(By.name("password")).sendKeys(password);
driver.findElement(By.className("ng-arrow")).click();
setCountry(country);
driver.findElement(By.xpath("//button[text()='Create Account']")).click();
}
public void setCountry(String country) {
if (driver.findElement(By.tagName("ng-dropdown-panel")).isEnabled()) {
List<WebElement> countries = driver.findElements(By.xpath("//div[@role='option']//span[@class='ng-option-label ng-star-inserted']"));
for (WebElement item:countries) {
if (item.getText().equals(country)) {
int index = countries.indexOf(item)+1;
String path = "//div[@class='ng-dropdown-panel-items scroll-host']//div["+index+"]";
driver.findElement(By.xpath(path)).click();
break;
}
}
}
}
public void login(String user, String password) {
driver.get(login_url);
if (driver.findElement(By.tagName("app-login")).isEnabled()) {
driver.findElement(By.name("email")).sendKeys(user);
driver.findElement(By.name("password")).sendKeys(password);
driver.findElement(By.xpath("//button[text()='Login']")).click();
}
}
@BeforeTest
public void setUp() {
System.setProperty("webdriver.gecko.driver", "C:\\webdriver\\geckodriver.exe");
driver = new FirefoxDriver();
System.out.println("Initialize browser");
//可以採用隱式設定通用的等待時間
//driver.manage().timeouts().implicitlyWait(delay, TimeUnit.SECONDS);
//也可以採用顯式根據條件判斷結果設定等待時間
waitVar = new WebDriverWait(driver, delay);
}
@AfterTest
public void afterTest() {
driver.quit();
}
}
總結兩點使用心得:
1. 使用Selenium最重要的一點是在不同的web框架之中準確定位元素,在使用xpath的時候,可以藉助瀏覽器外掛如Chrome我使用的是ChroPath來方便的獲取到。
2. 在assert之前給頁面充分的載入時間,比如新增等待時間並通過判斷元素是否顯示、存在的方式確定頁面載入完全了。
相關推薦
TestNG+Selenium實現簡單的Web前端測試
Selenium應該是目前前端測試最主流的測試工具吧,支援主流瀏覽器如Firefox、Chrome、IE等,無論你熟悉Python還是Java,都可以方便的使用Selenium提供的豐富的測試套件,還有其它很多基於Selenium二次封裝開發的測試框架如Robo
使用Selenium實現基於Web的自動化測試
Selenium 及其實現原理 Selenium 的主要功能包括: 1)測試與瀏覽器的相容性:測試應用程式能否相容工作在不同瀏覽器和作業系統之上。 2)測試系統功能:錄製用例自動生成測試指令碼,用於迴歸功能測試或者系統用例說明。 簡而言之,Selenium 就是一款可以錄製使用者操作,幫助 Web
在Linux下實現Python+selenium+chrome的web自動化測試
宣告:ubuntu版本是在16.04下進行的 1、首先需要先安裝Chrome sudo apt-get install libxss1 libappindicator1 libindicator7 wget https://dl.google.com/linux/direc
一隻自動化測試小白的學習記錄——Python+Selenium+Sublime 運用API、元素定位、元素操作方法、滑鼠鍵盤事件實現入門Web自動化測試
題外話:之前做一些自動化測試的入門實驗都是用的Python的IDLE進行編寫的,正兒八經的好處(可以一行一行地執行,因此能夠直觀地看到對於網頁測試的每一步變化,也能夠明確地知道在哪一步出了錯),不知所云的壞處(沒有一下子執行指令碼程式的成就感?????(黑人嚴肅臉)) 。於是
Selenium+Python進行web自動化測試(Demo+API)
mod amp cep path chrome all 配置使用 nas img Selenium官方網站 http://selenium-python.readthedocs.io/ 配置使用環境 下載相應的瀏覽器驅動, Firefox 是默認的 本文以 chrome 為
c語言實現簡單web服務器
tps gate choices found lte expect inf tro condition 1http簡單介紹http超文本傳輸協議:host主機地址:port端口/urlhost會被DNS服務器 解析成IP地址,所以有時候可以直接用域名,http默認訪問80端
web前端測試——e2e測試
開發環境:安裝有node的macbook(windows沒測) 第一步: 建立自己需要測試的專案,如在桌面建立一個test目錄作為我們的專案根目錄。 開啟sublim text ,並將專案拖到sublim text中,方便管理。 第二步: 開啟終端,輸入命令cd
Java實現簡單web server
小背景 在《計算機網路-自頂向下方法》這本書中,第二章應用層有個小的程式設計作業,今天將其實驗並記錄下來。 簡介 在計算機網路應用層中最重要的幾個協議有:HTTP,SMTP,FTP,D
Spring boot + mvn 實現簡單web記事本
功能需求: web應用中實現簡易記事本,內容儲存到本地檔案 概要設計: 1.spring boot實現前後端訊息傳送 2.業務類中實現寫入本地檔案 實現: 1.spring boot搭建 mvn匯入spring boot核心包 其中thymeleaf包的作
利用Postman實現簡單的自動化測試
1. 關於tests[]斷言 對於系統整套介面的測試最好是建立系統相關的Collection,便於以後測試,測試指令碼採用的是JavaScript語法編寫,指令碼主要寫的位置在Pre-request Script和Tests兩個欄目中,Pre-request
Go語言實現簡單web應用cloudgo
cloudgo 框架選擇 Martini 功能列表 使用極其簡單. 無侵入式的設計. 很好的與其他的Go語言包協同使用. 超讚的路徑匹配和路由. 模組化的設計 - 容易插入功能件,也容易將其拔出來. 已有很多的中介軟體可以直接使用. 框架內已擁有很好的開箱即
postman 簡單教程-實現簡單的介面測試
最近開始做介面測試了,因為公司電腦剛好有postman,於是就用postman來做介面測試,哈哈哈哈,。。。postman 功能蠻強大的,還比較好用,下面說下postman如何來測試介面 1.下載postman外掛,網址http://chromecj.com/web-dev
web前端測試要點
【說明】 JS壓縮: 目的:1、減少JS程式碼容量,增加下載速度和執行速度;2、壓縮後的JS程式碼不具備可識性,在一定程度上達到加密效果,防止被人輕易使用。 常規Javascript壓縮的
web前端測試——mocha介面測試
執行環境:macbook(windows沒有測試) 條件:電腦安裝了node.js 第一步: 在桌面新建test資料夾,開啟sublim text,並將資料夾拖入sublim text,方便管理檔案 第二步: 開啟終端,輸入cd Desktop/test進入到該
C語言實現簡單的記憶力測試遊戲
一個簡單的記憶測試遊戲! printf("\n記住螢幕上出現的一串數.請仔細看,數字只出現一定時間."); printf("\n之後數字會消失,你要輸入相同的數字.\n");printf("\n祝你好運!\n\n是否要開始遊戲(是-Y,否-N) 猜數成功後,難度會上升~~~
基於Selenium技術的Web自動化測試框架
時光飛逝,轉瞬之間,已在計算機軟體這個行業,在開發和測試崗位工作了10年。而這其中的酸楚,苦澀和甜美,恐怕只有親身經歷過才能深有體會。 在當今資訊社會,飛速發展的時代大背景下,小小的我,無疑是幸運的。感謝奮戰過的每一個崗位,感謝每一位領導,感謝每一位同事。是他們提供了平臺和
java實現簡單web容器(執行緒池)
執行緒池ThreadPool.java package webserver; import java.util.Collection; import java.util.Iterator; import java.util.Vector; /** * 執行緒池 *
利用xinetd實現簡單web伺服器(映象站)
瀏覽效果: linux伺服器安裝xinetd後,在/etc/xinetd.d/目錄下建立xhttpd檔案,並輸入內容: service xhttpd { socket_type = stream protocol = tcp wait = no
c語言實現簡單web伺服器
浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>
基於Selenium+Python的web自動化測試框架
一、什麼是Selenium? Selenium是一個基於瀏覽器的自動化測試工具,它提供了一種跨平臺、跨瀏覽器的端到端的web自動化解決方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE:Firefo