朵拉小序:Page Object,即”页面对象“,就是将单个页面作为一个对象来处理。
以面向对象的方式来处理页面和业务流程的好处在于,如果某个页面元素的属性有了变化,只需在包含这个元素的页面对象中调整操作该元素的属性或方法即可。
若有大量重复代码,且开发修改一个页面的一个元素属性后,那自动化测试需要修改调整的工作量会 成倍增加。
解决这种问题,可采用面向对象的方式来处理页面之间的交互。将单个页面上的页面元素和相应操作封装到一个页面对象中。即Page Object。
一、page Object
首先,明确基本页面,以及它们之间的切换。
1.LoginPage
登录页包括:用户名输入框 密码输入框 登录按钮
//定义3个WebElement属性,用于记录用户名、密码、登录
public class LoginPage1 {
WebDriver driver;
WebElement username;
WebElement password;
WebElement loginbutton;
public LoginPage1(WebDriver driver) {
this.driver = driver;
username = driver.findElement(By.id("tbUserName"));
password = driver.findElement(By.id("tbPassword"));
loginbutton = driver.findElement(By.id("btnLogin"));
}
//定义1个login()方法,用于发送用户名和密码并登录网站。
public void login(String userName, String passWord) {
username.sendKeys(userName);
password.sendKeys(passWord);
loginbutton.click();
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
}
}
2.LogoutPage
public class LogoutPage {
WebDriver driver;
// 在构造函数中记录WebDriver
public LogoutPage(WebDriver driver) {
this.driver = driver;
}
// 定义logout()方法,封装弹出框的处理细节,包括显式等待弹出框的出现,及确认退出。
public void logout() {
WebDriverWait wait = new WebDriverWait(driver, 300);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
}
}
----------------------------------------------------
以下是case代码,可以看到:在采用Page Object方式的面向对象机制后,case代码的逻辑更清晰。
public class TestMessageWithPageObject1 {
// 完整测试用例代码
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
// 构造MainPage的实例对象
MainPage1 mainPage = new MainPage1(driver);
// 构造Page2的实例对象
MessagePage messagePage = new MessagePage(driver);
// 打开主页并登录,然后发送消息后退出登录状态
mainPage.login("zh_webdriver", "webdriver_1");
messagePage.sendMessage("zh_webdriver", "testSendingMessage1", "text message1");
messagePage.sendMessage("zh_webdriver", "testSendingMessage2", "text message2");
mainPage.logout();
// 再次打开测试主页并登录,后发送消息并删除所有消息,然后退出
mainPage.login("zh_webdriver", "webdriver_1");
messagePage.sendMessage("zh_webdriver", "testSendingMessage3", "text message3");
messagePage.deleteAllMessage();
mainPage.logout();
driver.quit();
}
}
------------
二、使用Page Object、Page Factory、@FindBy和 How
Page Factory、@FindBy和 How数组就是WebDriver专门提供给用户以更好地利用Page Object方式。可以称为加强版的Page Object机制。
且使得测试代码的逻辑更清晰 ,维护起来更方便。
How数组支持的页面元素包括如下类型:
ID
ID_ OR_NAME
CSS
NAME
CLASS_NAME
LINK_TEXT
PARTIAL_LINK_TEXT
TAG_NAME
XPATH
---------------------------
LoginPage2
public class LoginPage2 {
WebDriver driver;
//在页面中的任意一个页面元素都可以使用@FindBy注解来进行标记。@ FindBy可用于替换driver.findElement()方法的查找机制来定位页面元素。
//同时使用How数组来替换By的作用。
@FindBy(how = How.ID,id = "input1")
WebElement username;
@FindBy(how = How.ID,id = "input2")
WebElement password;
@FindBy(how =How.ID,id = "btnLogin")
WebElement loginbutton;
public LoginPage2(WebDriver driver){
this.driver = driver;
}
public void login(String userName,String passWord){
username.sendKeys(userName);
password.sendKeys(passWord);
loginbutton.click();
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
}
}
LogoutPage2
public class LogoutPage2 {
WebDriver driver;
public LogoutPage2(WebDriver driver) {
this.driver = driver;
}
public void logout() {
WebDriverWait wait = new WebDriverWait(driver, 300);
wait.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
}
}
MainPage2
import java.util.*;
public class MainPage2 {
// PageFactory会替换传统的通过new来实例化对象的方式。
WebDriver driver;
// 采用@FindBy和How数组来替换driver.findElement()方法
@FindBy(how = How.LINK_TEXT, linkText = "登录")
WebElement loginLink;
@FindBy(how = How.LINK_TEXT, linkText = "退出")
WebElement logoutLink;
public MainPage2(WebDriver driver) {
this.driver = driver;
}
public void openMainPage(String url) {
driver.get(url);
driver.manage().timeouts().implicitlyWait(300, TimeUnit.SECONDS);
}
public void login(String userName, String passWord) {
loginLink.click();
WebDriverWait wait = new WebDriverWait(driver, 300);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("input1")));
LoginPage2 loginPage = PageFactory.initElements(driver, LoginPage2.class);
loginPage.login(userName, passWord);
}
public void logout() {
logoutLink.click();
// 此处移除了driver.findElement()方法,用PageFactory.initElements()方法替换了之前传统的logoutPage的对象实例化方法,并将driver实例传递给对象
LogoutPage2 logoutPage = PageFactory.initElements(driver, LogoutPage2.class);
logoutPage.logout();
}
}
case代码:
public class TestMessageWithPageObject2 {
public static void main(String... args) throws InterruptedException {
WebDriver driver = new FirefoxDriver();
// 区别:MainPage与MessagePage的实例化均由PageFactory.initElements()方法替换了。
MainPage2 mainPage = PageFactory.initElements(driver, MainPage2.class);
MessagePage2 messagePage = PageFactory.initElements(driver, MessagePage2.class);
//打开主页
mainPage.login("zh_webdriver", "webdriver_1");
Thread.sleep(2000);
mainPage.login("zh_webdriver", "webdriver_1");
messagePage.sendMessage("zh_webdriver", "testSendingMessage3", "text message3");
messagePage.deleteAllMessage();
mainPage.logout();
driver.quit();
}
}
备注:因本地代码较多,笔记中只贴出部分Demo代码 ,全部代码稍后会统一整理在云盘中。
本文来自企鹅号 - 木蚂蚁媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - 木蚂蚁媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。