一、什么是Page Object?
Page Object是一种将页面之间相应的元素放在一个类里面统一管理的设计模式。Page Object测试框架的出现解决了传统UI测试框架中用户界面UI发生变化时,需要对大量测试用例进行重构的问题。它通过建立一个抽象层,将页面元素抽象成对象。并将页面行为抽象为方法,减少了代码冗余度及测试维护成本。
优点:
1、易于维护。在应用程序的修改过程中,由于分层模式,多大部分情况下修改只需要更改页面对象类中的方法即可。
2、易于扩展。随着应用程序测试的深入,Page Object也将不断地扩展。
3、耦合性低。不同的Page Object操作的是不同的页面,因此不同的Page Object之间是解耦合的。
设计思路:
Page Object设计模式是将业务逻辑和页面元素的操作分离开来。page object作为一个独立的组件可以更好的满足当前需求的变化,降低易变度,同时提高复用度,增加可读性。
二、如何设计Page Object模式
Page Object是由实现Page 的存储库、浏览器操作和测试脚本组成的。基于page object模式,我们将页面元素的定位和操作进行了封装,当页面元素发生变化时,我们只需要修改页面对象中的方法即可。
1、页面类。每一个页面设置一个独立的页面类,并继承Page类,每一个页面都有唯一一个URL。
public class BasePage {
public BasePage(){
PageFactory.initElements(LcmUtil.getWebdriver(), this);
}
}
public class LoginPage extends BasePage {
String url;
WebDriver driver;
public LoginPage(WebDriver driver){
this.driver = driver;
url = "";
}
public void navigate () {
driver.navigate().to(this.url);
}
}
2、页面方法。封装页面的方法,并使用@FindBy注解进行定位。
public class LoginPage extends BasePage {
@FindBy(xpath="//input[@name='username']")
WebElement nameField;
@FindBy(xpath="//input[@name='password']")
WebElement passwordField;
@FindBy(xpath="//input[@name='submit']")
WebElement loginButton;
String url;
WebDriver driver;
public LoginPage(WebDriver driver){
this.driver = driver;
url = "";
}
public void navigate () {
driver.navigate().to(this.url);
}
public void login(String name, String password) {
nameField.sendKeys(name);
passwordField.sendKeys(password);
loginButton.click();
}
}
3、测试用例。测试用例中的代码简单易懂,与业务无关,不会产生重复测试代码、代码维护难度大等问题。
public class LoginTest extends TestCaseBase{
@Test
public void testLogin(){
LoginPage loginPage = new LoginPage(driver);
loginPage.navigate();
loginPage.login("212895394@qq.com","123456");
}
}
三、Page Object驱动测试的高效性
让我们来看看在没有使用Page Object时,当页面执行了修改操作时测试代码需要如何重构。
当一个Web表单16个输入项时,一个借助selenium RC浏览器驱动的Http watch结果大约有300行字符数量。TDD紧密结合页面的可扩展和可维护性,自然而然地就会迫使开发者去探索如何更好地测试这种Web 表单构造。Page Object的另一个好处是通过使用已有的页面元素定位方法,允许QA进行更多有价值的测试。我们想要新建一个User对象,由于表单中的输入项有很多,这时在QA的测试代码中,创建每个用户测试用例花费的时间比较长,但是如果使用Page Object,就可以大大缩减测试用例的编写时间和维护成本。
基于这个例子,我们可以看到:使用Page Object可以极大地提高测试代码的可读性,可维护性减少开发窗口。
四、用Page Object设计模式简化测试代码
在传统的测试方法中,如果我们想验证一个业务操作是否成功,需要编写很多定位元素的代码。而如果使用Page Object设计模式,则可以将定位的元素封装到一个页面类中,具体的实现不需要考虑具体的元素,这样在进行测试时只需要调用页面类方法就可以完成页面操作和验证。下面是Page Object设计模式在web UI自动化测试过程中的一个典型应用。
1、Page类。在页面类中,封装了页面的元素和方法,仅暴露必要的方法,增加了可重用性。
public class SortSearchPage extends BasePage {
@FindBy(id="sort_div") private WebElement sortBtn;
@FindBy(xpath="//a[contains(text(),'最新')]") private WebElement timeOption;
@FindBy(id="search_input") private WebElement searchBtn;
@FindBy(css=".search-form [type='submit']") private WebElement searchBtn1;
@FindBy(id="search_str") private WebElement searchInput;
public SortSearchPage(WebDriver driver) {
super(driver);
}
public void sortItems() {
sortBtn.click();
timeOption.click();
}
public void search(String searchStr) {
searchBtn.click();
searchInput.sendKeys(searchStr);
searchBtn1.submit();
}
}
2、测试用例。测试用例中使用Page类,仅验证必要的部分,增加了可重用性。而在Page类中,封装了大量的细节,使得测试用例简洁明了。
public class SortAndSearchTest extends BaseTest{
@Test
public void testSortAndSearch(){
SortSearchPage sortSearchPage = page.goToSortSearchPage();
sortSearchPage.sortItems();
sortSearchPage.search("test");
}
}
五、还有什么需要我们注意的地方吗?
1、代码风格。Page Object不同的实现可能会有一定的差异,但是每个实现的代码风格是相似的。代码风格统一,让别人看代码更加容易。
2、元素定位方式。在使用Page Object模式时,需要注意使用稳定的定位方式,相对Xpath具有可读性更好的CSS选择器,建议优先使用CSS选择器。
3、Page Object VS Data Driver。Page Object是解决UI自动化测试平稳过渡的好方案,而Data Driver是另一种自动化测试的方案。在使用Data Driver的情况下,我们会使用外部文件来存储测试数据及其参数,而在使用Page Object的情况下,我们只需要将存储数据的部分从PageObject分离出来,使代码更具健壮性和高可维护性。
六、总结
通过Page Object设计模式的使用,可以使测试代码更加具有可读性和可维护性。同时它还允许我们将页面元素和测试逻辑分开,增强了测试的可重用性和稳定性。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/270248.html