自动化测试的设计问题(Selenium WebDriver + Spring Boot + Cucumber + 页面对象模型 + PageFactory 模式)

Design Issue with Automated Test (Selenium WebDriver + Spring Boot + Cucumber + Page Object Model + PageFactory Pattern)

我正在使用这些工具和概念构建一个自动化测试框架 -

一切正常,我对自己构建的内容很满意。按照页面对象模型,我创建了 PageObject 类,它们基本上是实际网页的模型。我也在使用 PageFactory 模式来自动实例化 WebElements。

我已经利用了 Spring Boot,非常棒。我所说的令人敬畏的意思是像在整个应用程序中自动注入配置,在执行 Cucumber 测试时在步骤定义 类 之间实现测试世界共享所需的依赖注入,以及其他如果没有它就有点乏味的目标.

了解了背景,现在让我们来回答我的问题。

我希望 Spring 管理我的页面对象 beans/components。我正在使用构造函数中的 PageFactory.initElements(WebDriver driver, Object page) 方法初始化我的页面对象。据我所知,如果在浏览器中实际加载页面之前初始化页面对象,那么任何对其 Web 元素调用操作的尝试都将导致 StaleStateException。正确的?那么,如果我让我的页面对象 Spring 托管 bean,我该如何控制它的 web 元素的初始化呢?我可以从构造函数中删除 PageFactory 的初始化方法,并将其放在其他一些方法中,稍后我可以调用这些方法来实例化它。但我想知道是否有更好的方法。

程序应该能够在 Cucumber 的步骤定义 类 中自动装配页面对象,但是只要在浏览器中加载实际页面或调用某些操作方法进行交互,就应该实例化这些对象的元素与网络元素。

如果您遵循页面对象模型和 PageFactory,制作 PageObjects spring bean 是个好主意吗?

似乎 PageFactory.initElements() 方法只创建实际网络元素的代理而不是缓存它们。所以,无论我什么时候初始化,每次在WebElement上调用方法时,driver都会先在当前页面找到它,然后在WebElement上模拟动作。

唯一会导致 state 状态的是页面更改或重新加载。感谢您指出这一点。

但是每当我们使用 @CacheLookup 注释时,我们将失去页面工厂的好处之一,因为它会找到元素一次,然后保留对它的引用,因此,我们更有可能看到 StaleElementExceptions .

此博客可能会对其他人有所帮助 - http://www.seleniumeasy.com/selenium-tutorials/page-factory-pattern-in-selenium-webdriver