如果我的问题听起来很重要,我提前道歉,我在QA和Selenium都很新。
我使用Java和Selenium编写测试,有时我需要等待Web元素可访问,下面是我以前使用的代码片段:
int counter = 0;
while (true) {
counter++;
boolean breakIt = false;
try {
WebElement element= driverChrome.findElement(By.xpath("bla bla"));
element.click();
breakIt = true;
} catch (Exception e) {
Thread.sleep(1000);
}
if (breakIt) {
break;
}
if (counter > 4) {
System.out.println("Failed");
tearDown();
System.exit(1);
}
}
但现在我看到了这个地方:
WebDriverWait wait = new WebDriverWait(driverChrome, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("bla bla"))).click();
肯定第二个更短但我不知道它是否更好,换句话说,它们是不同的吗?如果是,怎么样?哪个更好用于哪些目的?
答案 0 :(得分:5)
答案you accepted不正确。
WebDriverWait
所做的粗略地说与您的代码段的作用相同:它定期轮询DOM以检查您希望它检查的条件是否为真。如果不是,那么就会使用Thread.sleep
。 (您可以通过阅读implementation of FluentWait
,WebDriverWait
所基于的类以及Sleeper
来确定我在说什么,因为FluentWait
使用{{1}在民意调查之间进入睡眠状态。)
与接受的答案断言相反(“一旦元素被加载然后立即变得难以处理”),当您等待的条件变为真时,Sleeper.SYSTEM_SLEEPER
将不会立即允许您与元件。如果WebDriverWait
实例在条件成立时处于休眠状态,将继续休眠,直到其休眠间隔结束(默认为0.5秒),然后它将再次检查条件并立即返回如果发现条件是真的。否则,它会重新进入睡眠状态,除非你给它的超时时间已经过期。
您的自制等待外观与WebDriverWait
之间的区别在于WebDriverWait
可重用,灵活,旨在处理您的代码无法处理的一系列条件。或者换句话说,它更强大。特别是,它会让它不知道如何处理涓流而不是像代码那样隐藏它们的异常。 我无法想象你的代码会更好。
答案 1 :(得分:1)
使用WebDriverWait始终是睡眠声明的理想选择。一旦元素被加载,它就会立即变得难以处理,而不是等待一段时间。特别是如果您有许多使用相同步骤的测试,从长远来看可以节省大量时间。
对于ExpectedConditions,我建议this page,。