1. 程式人生 > >TestNG+Selenium實現簡單的Web前端測試

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專案
新建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