使用Selenium-PO设计模式提高Web自动化测试效率

本文介绍了PO设计模式在自动化测试中的应用,如何通过分离测试代码与页面定位,提高代码维护性。通过例子展示了如何使用PageObject模式重构测试用例,强调了PO的灵活性和基本规则。同时提供了软件测试学习资源链接。
摘要由CSDN通过智能技术生成

PO(page object)设计模式是在自动化中已经流行起来的一种易于维护和减少代码的设计模式。在自动化测试中,PO对象作为一个与页面交互的接口。测试中需要与页面的UI进行交互时,便调用PO的方法。这样做的好处是,如果页面的UI发生了更改,那么测试用例本身不需要更改,只需更改PO中的代码即可。

PO设计模式具有以下优点:

1、测试代码与页面的定位代码(如定位器或者其他的映射)相分离。

2、该页面提供的方法或元素在一个独立的类中,而不是将这些方法或元素分散在整个测试中。

这允许在一个地方修改由于UI变化所带来的所有修改。

通过一个简单的示例来说明页面对象。首先,思考一个不使用PO模式的自动化测试的典型案例:

  1. /***

  2. * Tests login feature

  3. */

  4. public class Login {

  5. public void testLogin() {

  6. // 在登录页面上填写登录数据

  7. driver.findElement(By.name("user_name")).sendKeys("userName");

  8. driver.findElement(By.name("password")).sendKeys("my supersecret password");

  9. driver.findElement(By.name("sign-in")).click();

  10. // 登录后验证h1标签是否为Hello userName

  11. driver.findElement(By.tagName("h1")).isDisplayed();

  12. assertThat(driver.findElement(By.tagName("h1")).getText(), is("Hello userName"));

  13. }

  14. }

这种方法有两个问题。

1、测试方法与定位器 (在此实例中为By.name)耦合过于严重。如果测试的用户界面更改了其定位器或登录名的输入和处理方式,则测试本身必须进行更改。

2、在对登录页面的所有测试中,同一个定位器会散布在其中。

可以在以下登录页面的示例中应用PO设计模式重写此示例。

  1. import org.openqa.selenium.By;

  2. import org.openqa.selenium.WebDriver;

  3. /**

  4. * Page Object encapsulates the Sign-in page.

  5. */

  6. public class SignInPage {

  7. protected WebDriver driver;

  8. // <input name="user_name" type="text" value="">

  9. private By usernameBy = By.name("user_name");

  10. // <input name="password" type="password" value="">

  11. private By passwordBy = By.name("password");

  12. // <input name="sign_in" type="submit" value="SignIn">

  13. private By signinBy = By.name("sign_in");

  14. public SignInPage(WebDriver driver){

  15. this.driver = driver;

  16. if (!driver.getTitle().equals("Sign In Page")) {

  17. throw new IllegalStateException("This is not Sign In Page," +

  18. " current page is: " + driver.getCurrentUrl());

  19. }

  20. }

  21. /**

  22. * Login as valid user

  23. *

  24. * @param userName

  25. * @param password

  26. * @return HomePage object

  27. */

  28. public HomePage loginValidUser(String userName, String password) {

  29. driver.findElement(usernameBy).sendKeys(userName);

  30. driver.findElement(passwordBy).sendKeys(password);

  31. driver.findElement(signinBy).click();

  32. return new HomePage(driver);

  33. }

  34. }

Home page的PO如下所示。

  1. import org.openqa.selenium.By;

  2. import org.openqa.selenium.WebDriver;

  3. /**

  4. * Page Object encapsulates the Home Page

  5. */

  6. public class HomePage {

  7. protected WebDriver driver;

  8. // <h1>Hello userName</h1>

  9. private By messageBy = By.tagName("h1");

  10. public HomePage(WebDriver driver){

  11. this.driver = driver;

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

  13. throw new IllegalStateException("This is not Home Page of logged in user," +

  14. " current page is: " + driver.getCurrentUrl());

  15. }

  16. }

  17. /**

  18. * Get message (h1 tag)

  19. *

  20. * @return String message text

  21. */

  22. public String getMessageText() {

  23. return driver.findElement(messageBy).getText();

  24. }

  25. public HomePage manageProfile() {

  26. // Page encapsulation to manage profile functionality

  27. return new HomePage(driver);

  28. }

  29. /* 提供登录用户主页所代表的服务的更多方法. 这些方法可能会返回更多页面对象.

  30. 例如, 单击"撰写邮件"按钮可以返回ComposeMail类对象 */

  31. }

那么,接下来的登录测试用例将使用这两个页面对象。

  1. /***

  2. * Tests login feature

  3. */

  4. public class TestLogin {

  5. @Test

  6. public void testLogin() {

  7. SignInPage signInPage = new SignInPage(driver);

  8. HomePage homePage = signInPage.loginValidUser("userName", "password");

  9. assertThat(homePage.getMessageText(), is("Hello userName"));

  10. }

  11. }

PO的设计方式具有很大的灵活性,但是有一些基本规则可以使测试代码具有理想的可维护性。

PO本身绝不应进行判断或断言。判断和断言是测试的一部分,应始终在测试的代码内,而不是在PO中。PO用来包含页面的表示形式,以及页面通过方法提供的服务,但是与PO无关的测试代码不应包含在其中。

实例化PO时,应进行一次验证,即验证页面以及页面上可能的关键元素是否已正确加载。在上面的示例中,SignInPage和HomePage的构造函数均检查预期的页面是否可用并准备接受测试请求。

PO不一定需要代表整个页面。PO设计模式可用于表示页面上的组件。如果自动化测试中的页面包含多个组件,则每个组件都有单独的页面对象,则可以提高可维护性。

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值