如何在Selenium中使用页面对象模型进行更快的应用测试

作者:Selenium应用测试   发布时间:2021-09-27

Selenium中的页面对象模型是一种对开发和测试团队非常有用的设计模式。继续阅读以了解如何使用它进行更快的应用测试

什么是页面对象模型?

页面对象模型,也称为 POM,在 Selenium 中是一种设计模式,可为按钮、输入字段和其他 Web 元素创建对象存储库。在 Selenium 中使用 POM 的主要目标是减少代码重复并改进未来测试用例的维护。在页面对象模型中,将应用程序的每个网页视为一个类文件。 

每个类文件都会联系您在页面中找到的元素。使用这些元素,测试人员可以与被测系统进行交互。

让我们看一个来自Web应用程序的登录页面的实际示例,以及如何使用Selenium中的页面对象模型方法来构建它。

Web 登录页面示例

页面对象模型

以下是我们需要在测试自动化脚本中使用的在此页面上完成登录的元素示例。我们将使用这个例子构建一个页面对象模型。

在此示例中用作用户名的电子邮件字段:

<input id="email" name="email" type="text" class="form-control" placeholder="email">

密码字段:

<input id="password" name="password" type="password" class="form-control" placeholder="Password">

将验证提供的详细信息的登录按钮:

<button type="button" class="btn btn-primary" value="" name="btnLoginAuth" id="btnLoginAuth">Log In</button>

成功或错误消息显示在此处:

<span id="spanAuthResponse" name="spanAuthResponse">Error! Invalid Auth Details provided.</span>

首先,考虑一个不使用页面对象模型的典型测试自动化脚本的示例。

/***
*Login Page Feature – Not using Page Object Model
*/
Public class LoginPage {

Public void TestLogin() {

        //Enter the login data
            driver.findElement(By.name("email")).sendKeys("testUser@gmail.com");
            driver.findElement(By.name("password")).sendKeys("my supersecret password");
            driver.findElement(By.name("btnLoginAuth")).click();

            //Verify error message is shown
            driver.findElement(By.name("spanAuthResponse")).isDisplayed();
            assertThat(driver.findElement(By.name("spanAuthResponse")).getText(), is("Error! Invalid Auth Details provided."));    

}

}

您可能想知道这种方法有什么问题,因为这是在Selenium 中开始测试自动化的一种非常常见的方法。但是,有两个问题。

测试方法和目标定位器之间没有分离。两者都交织在一种方法中。所以如果登录变了,完整的测试也必须变,这导致了以后的大量维护。

定位器(我们如何找到元素)将分布在多个测试中,因此没有简单的方法来更新和维护它们。

应用页面对象模型技术,上面的示例对于登录页面将如下所示。

/**
 * Page Object for the Login page.
 */
public class LoginPage {
  protected static WebDriver driver;

  // <input name="email" type="text">
  private By usernameBy = By.name("email");
  // <input name="password" type="password">
  private By passwordBy = By.name("password");
  // <button name="btnLoginAuth" type="button">
  private By signinBy = By.name("btnLoginAuth");

  public LoginPage(WebDriver driver){
    this.driver = driver;
  }

  /**
    * Login as valid user for this application
    *
    * @param userName
    * @param password
    * @return Next Dashboard Page object
    */
  public DashboardPage loginValidUser(String userName, String password) {
    driver.findElement(usernameBy).sendKeys(userName);
    driver.findElement(passwordBy).sendKeys(password);
    driver.findElement(signinBy).click();

    return new DashboardPage(driver); //Not Yet implemented in this example
  }
}

这种方法现在允许您按以下方式实施验证(测试)。

/***
 * Tests login feature
 */
public class TestLogin {

  @Test
  public void testLogin() {
    LoginPage loginPage = new LoginPage(driver);
    DashboardPage dashboardPage = loginPage.loginValidUser("userName", "password"); //Not yet implemented
    assertThat(dashboardPage.getMessageText(), is("Hello userName"));
  }

}

以下是允许使用此方法实现测试代码所需可维护性的规则。

页面对象永远不应该进行断言或验证。这是您测试的一部分,应该始终在您的测试用例中,而不是在页面对象中。页面对象只是页面的表示。

您的页面对象中可以有一个验证,即验证页面是否正确加载。这可能包含页面正常工作的关键元素。

只添加您需要的元素,尽可能保持干净,并在需要时添加。不要过度设计它。

大规模测试

还存在其他框架,为浏览器和移动测试实现此 (POM) 概念。Quantum 框架使用这种方法。这是使用Quantum的示例:

这是我用简单英语进行的 BDD 测试。

总结

页面对象模型是创建易于维护的测试的好方法,并且可以让您更快地扩展测试工作,因为您可以根据任何测试自动化流程的需要重用对象。

尝试在 Selenium 中使用页面对象模型,看看它如何适用于您的项目。对于那些寻求适用于该概念的 BDD 框架的人,请尝试使用 Quantum 框架并更快地完成更多工作。


本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-60725088-8054),我们将立即处理,马上删除。



沪ICP备07036474号-4 |

沪公网安备 31010702003220号

2015-2021 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd.