TL;DR:始终使用显式等待。忘记隐式等待的存在。
以下是显式等待和隐式等待之间差异的快速概述:
显式等待:
- 记录和定义的行为。
- 在硒的本地部分运行(以代码的语言)。
- 适用于您能想到的任何条件。
- 返回成功或超时错误。
- 可以将元素的缺失定义为成功条件。
- 可以自定义重试和异常之间的延迟以忽略。
隐式等待:
- 未记录且实际上未定义的行为。
- 在硒的远程部分(控制浏览器的部分)运行。
- 仅适用于查找元素方法。
- 返回找到的元素或(超时后)未找到的元素。
- 如果检查元素是否不存在,则必须始终等到超时。
- 除了全局超时之外,无法自定义。
带说明的代码示例。第一个隐式等待:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
现在显式等待:
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement myDynamicElement = wait.until(
ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
这两个代码示例都执行相同的操作。找到某个元素,如果在10秒后没有找到,就放弃。隐式等待只能执行此操作。它只能尝试查找具有超时的元素。显式等待的优势在于它可以等待各种条件。还可以自定义超时并忽略某些异常。
可能条件的示例:或 。以下是内置预期条件的列表:https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.htmlelementToBeClickable
numberOfElementsToBeMoreThan
invisibilityOf
更多解释:
隐式等待超时仅对方法有效。如果设置,那么所有人都将“等待”设置的时间,然后再声明找不到该元素。findElement*
findElement*
遗嘱等待方式未定义。这取决于浏览器或操作系统或硒的版本。可能的实现包括:findElement*
- 反复尝试查找元素,直到超时。找到元素后立即返回。
- 尝试查找元素。等到超时。再试一次。
- 等到超时。尝试查找元素。
此列表是从观察和阅读错误报告以及粗略阅读硒源代码中收集的。
我的结论是:隐含的等待是不好的。功能有限。该行为是未记录的,并且取决于实现。
显式等待可以完成所有隐式等待可以完成的工作,甚至更多。显式等待的唯一缺点是代码更加冗长。但是这种冗长使代码变得明确。显式比隐式更好。右?
延伸阅读: