有关页面对象模型模式的设计问题

时间:2018-11-26 17:13:54

标签: selenium testing design-patterns browser-automation

我想知道我们的POM方法是否有问题。在互联网上的许多示例中,我发现此模式以某种方式使用,以便您的测试脚本如下所示:

pageObject.doSomethingWithElement(parameters...)

对我们来说,这样做是很自然的:

pageObject.element.doSomething(parameters...)

因此,我们无需实现页面类中元素可以实现的功能,而只需在测试脚本中定义这些操作即可。由于某种原因,我们觉得与自然存在的事实相似

System.out.println()
System.err.println()

代替

System.printlnOut()
System.printlnErr()

我们会错过我们方法的一些缺点吗?

1 个答案:

答案 0 :(得分:3)

在这两种型号之间进行选择没有优点或缺点。但是我认为您对推荐的方法有点误解。这个想法不是要pageObject.doSomethingWithElement,而是要使用页面的功能pageObject.doSomething(如果需要)。

例如,如果您查看Selenium examples,第一个示例就是public HomePage loginAs(String username, String password)。此功能与元素无关,它与页面的功能无关,该功能很容易用口头表达,没有任何涉及的元素引用。我可以将此功能读取为:当用户位于“登录”页面上,并且用户提供了用户名和密码时,成功登录后,用户将被重定向到“首页” 。哪种提供对页面模型的自然BDD解释。

这种方法的优点是您的测试更具可读性。而不是像这样:

loginPage.username.setValue(...)
loginPage.password.setValue(...)
loginPage.loginButton.submit()
// how do I get a homepage from here?

此模型允许具有

HomePage homePage = loginPage.loginAs(...)

完成!

从维护的角度来看:如果开发人员更改“登录”页面上的元素,那么对于处理登录功能的20个测试可能很重要。但是您希望其他980测试必须完全不受其更改的影响,因为它们仅在使用方式登录时测试功能的其他部分。因此,只要登录本身保持应有的状态,它们就可以完全忽略登录元素的更改。

因此,我认为,选择不是在页面可以表达元素相关功能的各种方式之间进行选择,而是页面是否应该表达元素或专注于页面提供的功能,而与元素无关。

我建议您阅读此处引用的页面,它可以很好地了解页面模型的全部内容。