如果我的问题听起来很初级,我提前道歉,我是 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();
当然第二个更短,但我不知道它是否更好,换句话说,它们是不同的吗?如果是,怎么办?哪个更好用于哪些目的?
最佳答案
答案you accepted是不正确的。
WebDriverWait
所做的粗略地说与您的代码片段所做的相同:它定期轮询 DOM 以检查您希望它检查的条件是否是真的。如果不是,则它会为您使用Thread.sleep
。 (您可以通过阅读 implementation of FluentWait
来确定我在这里所说的内容,这是 WebDriverWait
所基于的类,并且 Sleeper
是因为 FluentWait
使用 Sleeper.SYSTEM_SLEEPER
在轮询之间 hibernate 。)
与接受的答案所断言的相反(“一旦元素被加载,它就会立即变得棘手”),当您等待的条件变为真时,WebDriverWait
不会立即允许您与元素交互。如果 WebDriverWait
实例在条件变为真时正在 hibernate ,它将继续 hibernate 直到其 hibernate 间隔结束(默认为 0.5 秒),然后它会再次检查条件如果发现条件为真,则立即返回。否则,除非您为其设置的超时已过期,否则它将重新进入休眠状态。
您自制的等待外观与 WebDriverWait
之间的区别在于 WebDriverWait
是可重用的、灵活的,并且旨在处理您的代码无法处理的一系列情况.或者换句话说,它更健壮。特别是,它会让不知道如何处理的异常逐渐出现,而不是像您的代码那样隐藏它们。 我无法想象在哪种情况下您的代码会更可取。
关于java - 等待网页元素的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241083/