【问题标题】:Design Issue with Automated Test (Selenium WebDriver + Spring Boot + Cucumber + Page Object Model + PageFactory Pattern)自动化测试的设计问题(Selenium WebDriver + Spring Boot + Cucumber + 页面对象模型 + PageFactory 模式)
【发布时间】:2017-07-13 20:34:44
【问题描述】:

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

  • Selenium WebDriver
  • 黄瓜(用于 BDD)
  • 春季启动
  • 页面对象模型
  • PageFactory 模式

一切正常,我对自己构建的东西感到满意。在 Page Object Model 之后,我创建了 PageObject 类,它们基本上是实际网页的模型。我也在使用 PageFactory 模式来自动实例化 WebElements。

我使用了 Spring Boot,非常棒。我所说的出色是指在整个应用程序中自动注入配置、在执行 Cucumber 测试时实现步骤定义类之间共享测试世界所需的依赖注入,以及如果没有它,实现其他目标会有点乏味。

鉴于背景,现在让我们来回答我的问题。

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

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

如果您遵循 Page Object Model 和 PageFactory,制作 PageObjects spring bean 是个好主意吗?

【问题讨论】:

  • 我没有使用java,但我认为页面对象的初始化与StaleStateException无关,据我所知,如果你找到元素,你会得到这个异常(结果在一个对象中),然后页面重新加载/更改,您正在尝试对该对象调用操作。您需要确保页面在查找元素和使用它对其调用操作之间不会更改/重新加载。
  • 检查一下看看是否有帮助peterkedemo.wordpress.com/2013/03/30/…
  • @lauda 你是绝对正确的。而且,感谢您将我重定向到该博客。它看起来真的很有希望。我将尝试这种方法。
  • 您找到问题的合理答案了吗?你最终使用了彼得的方法吗?

标签: spring selenium selenium-webdriver automated-tests pageobjects


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2022-01-26
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2019-04-28
    相关资源
    最近更新 更多