我正在使用这些工具和概念构建一个自动化测试框架 -
- 硒网络驱动程序
- 黄瓜(用于BDD)
- 弹簧启动
- 页面对象模型
- 页面工厂模式
一切都很好,我对我所建造的东西感到满意。在页面对象模型之后,我创建了PageObject类,这些类基本上是实际网页的模型。我还使用 PageFactory 模式来自动实例化 WebElements。
我利用了Spring Boot,以获得出色的效果。我所说的很棒,是指在整个应用程序中自动注入配置,在执行黄瓜测试时实现步骤定义类之间共享测试世界所需的依赖注入,以及其他目标,如果没有它,实现起来会有点乏味。
鉴于背景,现在让我们来回答我的问题。
我希望我的页面对象是 Spring 管理的 bean/组件。我正在使用构造函数中的PageFactory.initElements(WebDriver driver, Object page)
方法初始化我的页面对象。据我所知,如果在浏览器中实际加载页面之前初始化页面对象,那么任何对其 Web 元素调用操作的尝试都将导致StaleStateException
。正确?那么,如果我使页面对象成为 Spring 管理的 bean,我该如何控制其 Web 元素的初始化?我可以从构造函数中删除 PageFactory 的初始化方法,并将其放入其他方法中,稍后我可以调用该方法来实例化它。但我很想知道是否有更好的方法。
该程序应该能够在 Cucumber 的步骤定义类中自动连接页面对象,但每当在浏览器中加载实际页面或调用某些操作方法来与 Web 元素交互时,都应实例化这些对象的元素。
如果您遵循页面对象模型和PageFactory,那么使PageObjects成为春豆是个好主意吗?
似乎PageFactory.initElements()
方法只创建实际 Web 元素的代理而不是缓存它们。因此,无论我何时进行初始化,每次在 WebElement 上调用方法时,驱动程序都会首先在当前页面上找到它,然后在 WebElement 上模拟操作。
唯一会导致状态状态的是页面是否更改或重新加载。感谢您指出这一点。
但是每当我们使用@CacheLookup
注释时,我们将失去页面工厂的好处之一,因为它会找到该元素一次,然后保留对它的引用,因此,我们更有可能看到 StaleElementExceptions。
这个博客可能会帮助其他人 - http://www.seleniumeasy.com/selenium-tutorials/page-factory-pattern-in-selenium-webdriver