有没有一种方法可以扩展Selenium Page模型,并将动态等待实现为另一个注释。 ..
我已经实现了wait4element(),我只想将其添加为另一个注释,类似于@FindBy。
我怎么做 ?
最佳答案
准金属预期条件库包含类似的解决方案。
您可以使用@ExpectedCondition
注释元素,指定超时和条件,如下所示:
@ExpectedCondition(timeout = 10, condition = Visibility.class)
@FindBy(id = "login-button")
private WebElement loginButton;
在构造函数中,您必须调用负责评估元素的方法:
public PageObject() {
PageFactory.initElements(driver, this);
ConditionEvaluator.evaluate(driver, this);
}
ConditionEvaluator
收集所有带@ExpectedCondition
注释的元素,在内部创建WebDriverWait
实例并评估@ExpectedCondition
中提供的条件。立即执行。没有惰性实例。准金属包含内置的
Visibility.class
,如下所示:public class Visibility extends Condition {
public Visibility(WebDriver driver, WebElement element) {
super(driver, element);
}
@Override
public ExpectedCondition<?> getExpectedCondition() {
return ExpectedConditions.visibilityOf(element);
}
}
构造函数用
Java Reflection API
调用,您不必担心。方法
getExpectedCondition
告诉Metalloid如何评估条件。如果要创建自己的条件,只需像
Condition
一样扩展Visibility.class
类。该库是准金属的一部分:https://github.com/Rafal-Laskowski/Metalloid-Core
但是,就像我所描述的一样,它也可以独立使用。 Wiki:https://github.com/Rafal-Laskowski/Metalloid-Expected-Conditions/wiki