我已经使用@FindBy
了一段时间了,我喜欢这样的事实:该元素直到必要时才被定位(不在实例化时)。
但是,该网页可能具有某个元素2-10的任意位置,并且元素上的ID已编号(因此第一个元素的ID为“ element1”,依此类推)
我想编写一个函数,我可以在一个整数关口,它会返回一个WebElement与适当的ID, 和 被懒洋洋地实例化。这意味着具有以下功能将无法正常工作:
public WebElement getElement(int numOnPage){
return driver.findElement(By.id("element"+numOnPage));
}
因为我立即调用该函数,即可找到WebElement。(之所以不能实例化它的原因是因为我有一个函数,可以通过在其上反复调用isDisplayed()来捕获NoSuchElementException
s
,直到该元素存在为止。)
我还意识到,我可以创建一个List<WebElement>
通过CSS选择ID以“ element”开头的每个元素的a
,但是在其他情况下,我想返回一个动态生成的元素,并且还必须使用一种变通方法。
谢谢!
首先,我不太了解为什么您绝对需要WebElement
在元素真正出现在页面中之前获得引用。在正常情况下,您可以检查页面是否已完全加载,然后查找WebElement
。NoSuchElementException
如前所述,通常首先使用html" target="_blank">循环和捕获来完成。
但是,如果需要WebElement
在页面上找不到引用之前的引用,我将简单地创建一个代理(延迟仅在第一次需要时)加载真实WebElement
实例。像这样:
public WebElement getElement(final int numOnPage) {
return (WebElement) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class<?>[] { WebElement.class }, new InvocationHandler() {
// Lazy initialized instance of WebElement
private WebElement webElement;
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (webElement == null) {
webElement = driver.findElement(By.id("element" + numOnPage));
}
return method.invoke(webElement, args);
}
});
}
通过调用getElement
,可以检索类型为的对象WebElement
。调用其方法之一后,就会使用检索它WebDriver.findElement
。请注意,如果在代理实例上调用方法,则该元素必须在页面中,否则当然会得到a
NoSuchElementException
。
问题内容: 如果按以下方式实现单例, 此实现与延迟初始化方法有何不同?在这种情况下,实例将在加载类时创建,并且仅在第一次使用时才加载类本身(例如,Singleton.getInstance(),而当您声明实例Singleton singleton = null;时则不会)。 即使采用惰性初始化方法,该实例也是在对getInstance()的调用上创建的 我在这里想念什么吗? 问题答案: 您也可以调
问题内容: 我有一个让我真正困惑的事情,特别是以下代码触发了编译器错误“ unresolved identifier self”,我不确定为什么会这样,因为懒惰意味着在使用该属性时,该类已经实例化了。我想念什么吗? 提前谢谢了。 这是代码 问题答案: 由于某种原因,如果惰性属性的初始值引用,则需要显式类型注释。在swift- evolution邮件列表中 提到了这一点,但是我无法解释 为什么 这样
问题内容: 当我尝试获取懒惰的初始化实体时,我在IDE中看到以下异常消息(我无法找到它在代理实体中的存储位置,因此无法为该异常提供整个堆栈跟踪): 这是我尝试访问要使用的惰性初始化实体的字段后得到的堆栈跟踪: 我正在使用Spring Data,已配置JpaTransactionManager,数据库是MySql,ORM提供程序是Hibernate4。注释@EnableTransactionMana
问题内容: 返回一个类型列表。但是List是一个接口,那么如何实例化它呢?如果尝试并实例化一个类型化的列表,我会收到一条错误消息,指出这是不可能的。 编辑 没关系,我看到了怎么回事,只是被文档混淆了片刻。 问题答案: 这是一个不应该与混淆。它是数组的包装,这意味着您进行了任何更改,更改了原始数组,并且无法添加或删除条目。通常将其与ArrayList结合使用,例如
问题内容: 返回一个类型列表。但是List是一个接口,那么如何实例化它呢?如果尝试并实例化一个类型化的列表,我会收到一条错误消息,指出这是不可能的。 编辑 没关系,我看到了怎么回事,只是被文档混淆了片刻。 问题答案: 这是一个不应该与混淆。它是数组的包装,这意味着您进行了任何更改,更改了原始数组,并且无法添加或删除条目。通常将其与ArrayList结合使用,例如
问题内容: 创建单例的模式似乎是这样的: 但是我的问题是,如果Singleton构造函数执行的不是单元测试友好的操作,例如如何调用外部服务,jndi查找等,您如何使用这样的类进行单元化? 我想我可以像这样重构它: 现在的问题是,仅出于单元可测试性,我已强制将getInstance同步,因此仅出于测试方面,它将对实际应用程序产生负面影响。有没有解决的办法,由于Java中双重锁定模式的破坏性,似乎其他