selenium设计模式之PageObject
2016-09-07 17:24
471 查看
在设计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对象的初始化。我们在上面已经提到了。
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对象的初始化。我们在上面已经提到了。
相关文章推荐
- Python3-Selenium3使用PO设计模式(Page Object)实现简单的页面登录操作
- selenium Object Page 设计模式理解及实现!
- Selenium+Python :WebDriver设计模式( Page Object )
- Selenium Page Object(PO)设计模式
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
- Selenium的PO模式(Page Object Model)[python版]
- QTP - PageObject设计模式
- Selenium的PO模式(Page Object Model)[python版]
- Page Object设计模式实践
- Page Object设计模式实践
- Page Object设计模式
- Webdriver的设计模式:Page Object(页面模型)
- 浅析selenium的page object模式
- Python+Selenium框架设计--- Page Object Model
- Page Object 设计模式
- 设计模式- 主动对象(Active Object)
- 设计模式之美:Object Pool(对象池)
- 设计模式之美:Role Object(角色对象)
- GoF著作中未提到的设计模式(5):Object Pool