我非常初学Selenium和Java来编写测试。 我知道我可以使用下面的代码尝试两次点击一个web元素(或者我想要的时间):
for(int i=0;i<2;i++){
try{
wait.until(wait.until(ExpectedConditions.visibilityOfElementLocated
(By.xpath("//button[text()='bla bla ..']"))).click();
break;
}catch(Exception e){ }
}
但是我想知道是否有任何类似的东西,例如将一个可靠的函数传递给等待函数,以使其自行完成,例如:
wait.until(wait.until(ExpectedConditions.visibilityOfElementLocated
(By.xpath("//button[text()='bla bla ..']"),2)).click();
例如,在这里2可能意味着如果失败就尝试两次,我们有这样的事情吗?
答案 0 :(得分:1)
看看FluentWait,我认为这将涵盖指定适当的超时和轮询间隔的用例。 https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html
答案 1 :(得分:0)
如果你无法在 ExpectedConditions 的集合中找到符合你想要的东西,你可以自己编写。
WebDriverWait.until 方法可以通过 com.google.common.base.Function 或 com.google.common.base.Predicate <传递/ em>的。如果您创建自己的Function实现,那么请注意任何非null值都将结束等待条件。对于Predicate,apply方法只需要返回true。
有了这个,我相信你可以用这个API做很少的事情。您提出的功能可能不是现成的,但您可以完全创建它。
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Predicate.html
最好的运气。
未经测试的代码段
final By locator = By.xpath("");
Predicate<WebDriver> loopTest = new Predicate<WebDriver>(){
@Override
public boolean apply(WebDriver t) {
int tryCount = 0;
WebElement element = null;
while (tryCount < 2) {
tryCount++;
try {
element = ExpectedConditions.visibilityOfElementLocated(locator).apply(t);
//If we get this far then the element resolved. Break loop.
break;
} catch (org.openqa.selenium.TimeoutException timeout) {
//FIXME LOG IT
}
}
return element != null;
}
};
WebDriverWait wait;
wait.until(loopTest);