【问题标题】:Does the Selenium FindBy instantiate WebElement instances in a PageObject class?Selenium FindBy 是否在 PageObject 类中实例化 WebElement 实例?
【发布时间】:2016-05-31 04:04:53
【问题描述】:

Selenium FindBy 注解是否真的实例化了 WebElement 实例,如果是,那么使用它们的框架的内涵是什么?

我在页面对象中所做的事情现在看起来像这样。我所有的测试框架方法都将 By 定位器作为参数(不是 WebElement 实例)。

//fields in the page
public static final By SEARCH_BOX = By.id("input-what");

我的问题是,在类实例化时是否使用 FindBy 实例化 WebElement 实例?如果是这样,那么我怀疑我的框架方法需要采用 WebElement 实例。这是正确的,并且在框架中是首选的:通过定位器参数或 WebElement 参数?

@FindBy(id = "input-what")
public WebElement SEARCH_BOX_ELEMENT;

我知道我期待一个有点自以为是的答案。如果你给我一个超链接引用你的信念,那么我认为这将是一个合理的答案。我认为这具有深远的影响:例如,Selenide 框架中的方法在其参数中不采用 WebElement 实例,因此使用 FindBy 注释的 PageObjects 将无法传递这些Selenide 方法的元素?

【问题讨论】:

    标签: selenium pageobjects


    【解决方案1】:

    如果我理解您的问题,您的答案就在documentation 的第一行:

    为了使用PageFactory,首先在PageObject上声明一些字段WebElementsList<WebElement>...

    或者可能是同一文档的结尾:

    WebElements 被延迟评估。也就是说,如果您从不在 PageObject 中使用 WebElement 字段,则永远不会为它调用“findElement”。

    编辑: 完成答案:PageObject 是一种编码风格,用于收集有关您的 web 应用程序的信息。为了使这种编码风格不那么冗长,Selenium 提供了一个PageFactory,它使用@FindBy 注释来装饰您的PageObject 类中的WebElements。

    【讨论】:

    • 对不起,我的问题超出了使用 PageFactory 的范围。换句话说,我的问题是在 PageObject 从未调用 PageFactory 的上下文中提出的。
    • @djangofan @FindBy由 PageFactory 使用。使用您自己的 PageObjects 将忽略注释。
    • 啊。这回答了我的部分问题。任何链接到记录的地方?
    • 是的,但我的想法与 SiKing 的思路相同……如果您将您的类传递给 PageFactory 为您实例化 WebElement,那么根据定义,它们之前不是没有实例化吗?至少那是我的答案的方向...... :)
    • @djangofan 如果不使用 PageFactory,@FindBy 注释将被忽略,您将得到nothing
    【解决方案2】:

    我不知道 selenium 中有这些新注释。

    已经看到通过基于 Stand Alone Weld 的框架实现的页面对象模式。

    无论如何,我觉得还是比较清楚的: https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/FindBy.html

    与 PageFactory 结合使用,可以让用户快速轻松地创建 PageObjects。

    当你要求工厂返回一个页面对象时,它会注入页面对象以及在那个时间点读取的 web 元素。 如果您的页面具有类似彗星功能的功能,并且会随着时间的推移而变得陈旧,那么建议您不要期望注入的 Web 元素会变得陈旧。

    据我目前所见,您希望页面对象能够简化您与浏览器内容的交互。但你希望它们是无国籍的。

    根据经验,我会明确地说,启用 ajax 的页面永远不会在我的页面对象上有状态。

    如果想要写入文本框。 我会提供一个api:

    public void writePassword(String password){
        ... callPrivateGetterToGetPasswordField().writeText(password);
    }
    

    等等。我会推广使用短时间读取 dom 内容和写入 dom 内容的方法,并尽量不让页面对象收集陈旧的内容。

    【讨论】:

    • 是的,这回答了我问题的另一部分。谢谢你的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多