POM面对象模型架现在已经成为业界非常流行的测试自动化框架,因为它易于维护和减少代码的重复,深的大家青睐。
POM模型的主要优点:
如果对任何页面UI进行更改,不需要我们改变任何测试用例,我们只需要更改页面对象中的代码(只在一个地方)。使用selenium的许多其他工具都遵循页面对象模型。
POM模型要求将一个页面上所有功能/可重用组件写到一个class文件中。现在说, 例如,我们设计4个页面,分别为主页,登录页,创建帐户和忘记密码页等。
按照谷歌wiki页面对象
“在Web应用程序的UI中,测试与交互的区域。页面对象简单地将这些对象建模为测试代码中的对象。这减少了重复代码的数量,意味着如果UI发生变化,修复只需要在一个地方应用。
针对以上页面,我们将创建类homepage.class、LoginPage.class、CreateAccountPage.class和ForgotPasswordPage.class。在每一个类中,我们将识别和编写特定于页面的可重用方法。
在第一页“谷歌主页”,它将有许多选项,如搜索,登录,+你,图像,隐私等链接。基于用户行为定位到相应的页面。现在,我们想要自动化的所有功能都应该为每个页面提供可重用的方法/组件。
现在我们的主页是谷歌页面,我们可以通过点击谷歌页面上的任何链接导航到其他页面。当我们导航到其他页面时,我们需要返回那个页面对象。否则返回当前页对象,因为此操作不能导航到其他页面对象表示的另一个页面。
POM模型提供以下优点。
1。测试代码和页面代码(如定位器)分离(或如果你使用一个UI布局图)。
2。页面提供的服务或操作只有一个存储库,而不是分散在每个测试用例中
在这两种情况下,由于UI变更所需的任何修改都在一个地方进行。
示例:
public void loginTestCase() {
driver.navigate().to(URL);
driver.findElement(By.name("signIn")).click();
driver.findElement(By.id("username")).sendKeys("testuser");
driver.findElement(By.id("password")).sendKeys("testpassword");
driver.findElement(By.name("loginbtn")).click();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("profile")));
String Expected=driver.findElement(By.id("message")).getText();
Assert.assertEquals(Expected, "Welcome");
}
如果你观察上面的测试,有测试和测试定位器不分离。如果是这样的话,将来如果用户界面发生变化,必须在多个地方进行更改。它也将成为难以确定这些定位器作为定位器的机会被用在多个测试更。
我们将尝试通过实现页面对象模型重写上面的示例:
/***
* Tests login functionality
*/
public void loginTestCase() {
// To go to home page
homePage.gotoHomePage();
//To click on SignIn link
accountLoginPage = homePage.clickOnSignIn()
//To verify if user is navigated to sign-in page
Assert.assertTrue(accountLoginPage.verifyPage());
//Login to the account
accountLoginPage.userLogin(username,password);
//To verify if user is navigated to user home page after successfull login
Assert.assertTrue(userHomePage.verifyPage());
}
在上面的测试中,我们没有使用任何定位器。它是由driver.findelement的完全分离等,例外,没有静态值的代码等。我们将以在多个页面中定义的方法的工作。基于测试,我们将导航到所需的页面并访问这些页面方法。