当我们以脚本的形式编写了大量的自动化测试代码后,很容易发现代码可读性太差了、任何一个测试脚本几乎毫无扩展能力或者说扩展起来只能修改边边角角、一旦被测系统的UI层发生变化对于测试代码的修改来说简直就是灾难性的,整个自动化工程几乎毫无结构可言,当面临这些问题的时候实际上已经失去了一部分自动化测试原有的职能
任何自动化测试团队在开展自动化测试这项活动的之前,必须考虑的是这项活动的ROI,自动化测试的本职是解放人力,基于前边所述的常见情况不仅仅其ROI非常低,也违背了自动化的初衷
基于这个大背景下,常规的自动化测试活动必须引入PO模式,它是一种自动化测试的设计模式,也是一种解耦的思想即:以页面为单位,将页面中的控件及控件的动作逐一提炼,从而在测试脚本中可以直接使用,其最终目的是使得元素定位表达式页面对象
测试代码三者分离
而分离后的测试代码,具有极高的可复用性、可读性,可维护性,可扩展性,而这像极了面向对象思想更像极了Java里Spring的MVC模式和Django的MTV模式
定义页面类
package PageObjects;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;
public class LoginPage {
//使用FindBy注解,定位到要操作的页面元素, 此处用的xpath,也可以用其他的类型
@FindBy(xpath = "//*[@name='email']")
public WebElement userName;
@FindBy(xpath = "//*[@name='password']")
public WebElement passWord;
@FindBy(xpath = "//*[@id ='dologin']")
public WebElement loginButton;
public String url = "http://mail.126.com";
public String title= "网易免费邮箱";
public WebDriver driver;
//构造函数,生成浏览器对象,初始化PageFactory对象
public LoginPage(){
driver = new ChromeDriver();
PageFactory.initElements(driver, this);
}
public void load(){
this.driver.get(url);
}
public void quit(){
driver.quit();
}
public void login(){
driver.switchTo().frame(driver.findElement(By.xpath("//*[@id='x-URS-iframe']")));
userName.sendKeys("[email protected]");
passWord.sendKeys("alex005x");
loginButton.click();
}
public WebDriver getDriver(){
return driver;
}
public void isLoaded()throws Error{
Assert.assertTrue(driver.getTitle().contains(title));
}
}
简洁的测试脚本
结合Java的单元测试框架TestNG完成测试脚本编写
package TestScripts;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.openqa.selenium.WebDriver;
import PageObjects.LoginPage;
public class Test126mail {
private WebDriver driver;
/*private String baseUrl="http://mail.126.com";
@BeforeMethod
public void beforeMethod(){
driver = new ChromeDriver();
}*/
@Test
public void testLogin() throws InterruptedException {
LoginPage loginpage = new LoginPage();
loginpage.load();
Thread.sleep(1000);
loginpage.login();
Thread.sleep(3000);
/*
loginpage.userName.sendKeys("davieyang99");
loginpage.passWord.sendKeys("alex005x");
loginpage.loginButton.click();
*/
Assert.assertTrue(loginpage.getDriver().getPageSource().contains("邮件"));
loginpage.quit();
}
/*@AfterMethod
public void afterMethod(){
driver.quit();
}*/
}