当前位置: 首页 > 知识库问答 >
问题:

Selenium FindBy是否在PageObject类中实例化WebElement实例?

公羊浩气
2023-03-14

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

我在我的页面对象中所做的事情现在看起来是这样的。我的所有测试框架方法都将定位器作为参数(而不是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注释的PageObject将无法将这些元素传递给Selenide方法?

共有2个答案

华凡
2023-03-14

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

我们已经看到了通过独立的基于Weld的框架实现的页面对象模式。

无论如何,我认为这是相对清楚的:https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/FindBy.html

与PageFactory结合使用,使用户可以快速轻松地创建页面对象。

当您要求工厂返回一个页面对象时,它将在该时间点用读取的网络注入页面对象。如果你的页面有一些类似彗星的功能,并且随着时间的推移会变得陈旧,你最好不要期望你注入的网页元素会变得陈旧。

从我到目前为止看到的情况来看,您希望页面对象简化与浏览器内容的交互。但你希望他们是无国籍的。

作为经验法则,对于启用ajax的页面,我绝对不会在我的页面对象上有状态。

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

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

等等我将推广使用读dom内容和写dom内容的短突发的方法,并尝试不让页面对象获取过时的内容。

张子墨
2023-03-14

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

为了使用PageFactory,首先在PageObject上声明一些字段,这些字段是WebElementsList

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

Web元素的评估是惰性的。也就是说,如果您从未在PageObject中使用WebElement字段,则永远不会为其调用“findElement”。

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

 类似资料:
  • ApplicationContext是否在spring中自动实例化? 如果像这样定义bean 然后我有了我的config类,它告诉spring容器在哪里通过注释@ComponentScan查找bean spring正在自动创建一个上下文,加载我所有的bean吗?还是我必须以编程方式创建它?如果是这样,我该怎么做,用这样的东西? 即使这样做,也可能会有一个问题,因为每次我需要上下文时都必须调用新的A

  • 问题内容: 我已经在python中编写了一个类,希望通过IronPython包装到.net程序集中,并在C#应用程序中实例化。我已经将该类迁移到IronPython,创建了一个库程序集并对其进行了引用。现在,我实际上如何获得该类的实例? 该类看起来(部分地)是这样的: 我用C#编写的测试存根是: 为了在C#中实例化此类,我必须做什么? 问题答案: IronPython类 不是.NET类。它们是Ir

  • 我有一些。 不是像、、之类的任何类型的元素定位器,而是本身。 我如何检查是否存在/呈现等? 我可以在-块中应用类似或之类的这也应该是一些通用的东西,而不是所有的元素都是可见的或可点击的。 再一次,我问的是实例本身,所以所有这些关于元素定位器的问题都是无关的。

  • 我有一个抽象类及其具体子类,当我创建子类的对象时,它会自动调用超级构造函数。JVM是否在内部创建抽象类的对象? 那么在JVM中没有对象的情况下构造函数是如何存在的??(对于抽象类) 同样,构造函数在创建对象之后执行,然后不创建抽象类的对象,默认构造函数是如何执行的??(这在Java文档中有所提及)

  • 问题内容: 我知道Java的泛型在某种程度上逊于.Net。 我有一个泛型类,我确实需要使用无参数构造函数实例化。如何解决Java的局限性? 问题答案: 一种选择是传递(或你感兴趣的任何类型-以任何方式指定适当的引用)并将该值保留为字段: 另一种选择是具有“工厂”接口,然后将工厂传递给泛型类的构造函数。这更加灵活,你无需担心反射异常。

  • 对于这个示例: null 是否有类似这样的语句用于此检查?或者我应该使用