selenium设计模式之PageObject

在设计selenium脚本时,许多脚本管理起来很乱,并且代码间关联不大,维护起来很费力,怎么办?官方提供了一种设计模式来参考--PageObject。

Page Object is a Design Pattern which has become popular in test automation for enhancing test maintenance and reducing code duplication. A page object is an object-oriented class that serves as an interface to a page of your AUT。

Page Object是越来越受欢迎的设计模式用来维护测试脚本并且减少代码重复率。page object模式是一个面向对象的类作为你的自动化UI测试的页面接口。

无论什么时候需要与页面上的UI相联系,都可以使用PageObject。那么如何创建页面对象类呢。selenium给我们提供了一个方法:那就是使用PageObject类的initElements方法,方法参数传入的是当前driver对象和当前Object页面类pageClassToProxy.

一个没有使用PageObject设计模式的selenium代码类是这样的:

public class Login {

public void testLogin() {
driver.type("inputBox", "testUser");
driver.type("password", "my supersecret password");
driver.click("sign-in");
driver.waitForPageToLoad("PageWaitPeriod");
Assert.assertTrue(driver.isElementPresent("compose button"),
"Login was unsuccessful");
}
}

可以看出,类中的代码非常混乱。这种途径有两个问题:

一:测试方法和自动化UI测试定位元素没有分离,不利于代码的维护。

二:ID元素会被分离到许多tests中,就比如在所有的tests中都需要登录页面。

参考pageObject设计模式的这种技术,上个例子可以被重写,就像下面这个签到的页面使用page 对象一样。

主要代码如下:

public SignInPage(WebDriver driver) {
this.driver = driver;
if(!driver.getTitle().equals("Sign in page")) {
throw new IllegalStateException("This is not sign in page, current page is: "
+driver.getLocation());
}
}
public HomePage loginValidUser(String userName, String password) {
driver.type("usernamefield", userName);
driver.type("passwordfield", password);
driver.click("sign-in");
driver.waitForPageToLoad("waitPeriod");

return new HomePage(driver);
}
}

以下是使用page对象编写的Home Page类

public class HomePage {

private WebDriver driver;

public HomePage(WebDriver driver) {
if (

      !driver.getTitle().equals("Home Page of logged in user")

   ) { 

          throw new IllegalStateException("This is not Home Page of logged in user, current page" +
"is: " +driver.getLocation());
}
}

public HomePage manageProfile() {
return new HomePage(driver);
}

}

TestLogin类中使用这两个page类:

public class TestLogin {
public void testLogin() {
SignInPage signInPage = new SignInPage(driver);
HomePage homePage = signInPage.loginValidUser("userName", "password");
Assert.assertTrue(selenium.isElementPresent("compose button"),
"Login was unsuccessful");
}
}

可以有很多设计page对象的方法,但是有一些基本的规则约束你如何获取你测试代码的可维护性。

page对象永远不应该设置断言,这是你测试的一部分,并且应该一直约束在你的测试代码中,而不应该存在你的page对象中。

你的page object应该只包含page的展现,并且page类提供的服务应该只包含方法去获取某种东西而不是关联到那些被限制在page对象中并且正在被检测的代码。

有一个单独的,验证应该被添加到pag object中,那就是验证这个page和可能出现的关键元素是否被正确加载。这个验证应该在初始page对象时就应该被完成。就拿以上的HomaPage和SignInPage两个page类来说,在一开始就验证这个page类是否可用和是都准备好接受请求操作。

一个page object不必要去展现整个页面。Page Obeject设计模式可以被用来展示页面的部分组件,如果一个页面含有多个componments,那么给每个component设计一个page对象会使得程序的可维护性更好。

当然还有其它的设计模式,比如说使用selenium提供的PageObject类来完成page对象的初始化。我们在上面已经提到了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值