Selenium documentation page on Waits说:
默认情况下,隐式等待元素出现是禁用的,需要在每个会话中手动启用。
由此,我推断出显式等待通常比隐式等待更可取。我想知道为什么吗?
隐式等待会持续轮询DOM,以查找特定条件,这意味着会话中所有呼叫的通用“最多”时间限制。另一方面,显式等待为特定命令指定“最大”限制。正如Selenium文档所述,不建议将隐式和显式等待混合使用(有关更多信息,请参见Combining implicit wait and explicit wait together results in unexpected wait times)。如果在任何地方使用隐式状态,则必须找到“最大”限制的上限。有时,您可能希望为特定元素设置一个下限(您可能正在测试页面打开时间),而不是其他元素。
隐式等待是DOM中元素查找的最长时间。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
意味着WebElement element = driver.findElement(By.id("someId"))
将查找ID为"someId"
直到 10秒的元素,并在DOM中存在该元素后立即返回。
明确等待使用ExpectedConditions,这意味着您可以等待元素处于特定状态
WebDriverWait wait = new WebDriverWait(WebDriverRefrence, 10);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("someId")));
类似,等待元素在DOM中存在,但是有更多选项,例如
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("someId")));
这将等待该元素可见。它还为您提供了等待与定位元素无关的其他条件的选项,例如等待url更改或提醒出现。
wait.until(ExpectedConditions.urlToBe("someUrl"));
wait.until(ExpectedConditions.alertIsPresent());