Selenium:为什么显式等待优先于隐式等待?

时间:2019-12-22 13:34:53

标签: selenium selenium-webdriver wait

Selenium documentation page on Waits说:

  

默认情况下,隐式等待元素出现是禁用的,需要在每个会话中手动启用。

由此我推断出显式等待通常是首选。我想知道为什么显式等待正式优于隐式等待?

2 个答案:

答案 0 :(得分:2)

隐式等待会持续轮询DOM以查找特定条件,这意味着会话中所有呼叫的通用“最多”时间限制。另一方面,显式等待为特定命令指定“最大”限制。

如Selenium文档所述,不建议混合使用隐式等待和显式等待(有关更多信息,请参见Combining implicit wait and explicit wait together results in unexpected wait times)。

如果在任何地方使用隐式状态,则必须找到“最大”限制的上限。有时,您可能希望为特定元素设置一个下限(您可能正在测试页面打开时间),而不是其他元素。

答案 1 :(得分:0)

隐式等待是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());