隐式等待和显式等待之间的内部工作区别是啥

Posted

技术标签:

【中文标题】隐式等待和显式等待之间的内部工作区别是啥【英文标题】:What is the internal working difference between Implicit Wait and Explicit Wait隐式等待和显式等待之间的内部工作区别是什么 【发布时间】:2018-03-04 01:15:12 【问题描述】:

显式等待示例

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement myDynamicElement= wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

隐式等待示例

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"));

假设 myDynamicElement 在第 6 秒可见, 所以在这两种情况下,驱动程序都会等到第 6 秒,控制将转移到连续的书面语句,我想了解在这种情况下,隐式等待和显式等待有何不同?他们如何在内部工作?

【问题讨论】:

What is difference between Implicit wait Vs. Explicit wait in selenium webdriver?的可能重复 网上已经有很多信息了。你读了什么?具体有什么不明白的。您似乎没有做过任何关于 SO 问题的研究。 【参考方案1】:

隐式等待:

Implicit Wait 是配置WebDriver 实例以在配置的时间内轮询html DOM 的方法,当它尝试查找元素或查找元素组/集合(如果它们不是立即可用)时。根据当前的 W3C 规范,默认时间配置为 0。我们可以在脚本/程序中的任何位置配置Implicit Wait 的时间,并可以根据需要重新配置它。一旦我们设置了Implicit Wait,它将在 WebDriver 实例的生命周期内有效。

参考文献

几个参考:

Detailed discussion Detailed documentation。

显式等待:

Explicit Wait 是您为 WebDriver 实例定义、配置和实现的代码块,以等待满足特定条件,然后再继续执行下一行代码。 WebDriverWait 以及ExpectedConditions 的某些方法/子句是实现Explicit Wait 的一种方式。

参考文献

几个参考:

Detailed discussion Detailed documentation。

获得粒度:

根据您的查询 ...假设 myDynamicElement 在第 6 秒可见,因此在这两种情况下,驱动程序将等到第 6 秒,并且控制将移至连续的书面语句...

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Implicit Wait 将在整个 10 秒 内轮询 DOM Tree,无论 myDynamicElement(或与您的定位器匹配的多个元素)是否在第 4 / 6 / 8 秒可见。因此,在这种情况下,您的脚本会延迟 4

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement myDynamicElement= wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

显式等待 将等待 最多 10 秒 让元素 someid 变为可点击(显示并启用)。 WebElement 只要满足 ExpectedConditions 就会返回。如果在配置的时间线的整个持续时间内未满足 ExpectedConditions,您会看到正确的 Exception

【讨论】:

您好,您必须在几天前指导我了解显式优于隐式的优势是什么。我认为前两段并没有指出重要的区别,而详细的答案是完全错误的。让我解释一下……(在下一条评论中继续) 首先,隐式等待和显式等待的区别在于,隐式等待是在驱动内部设置的,而显式等待不是在驱动内部设置的,而是在本地语言绑定中设置的。第二个错误是,两个等待都不是静态等待,如果时间设置为 10 秒,如果元素在 5 秒内可用,则两者都会立即允许进一步的操作发生。【参考方案2】:

隐式等待用于在整个测试脚本或程序的每个连续测试步骤之间提供等待时间(例如 30 秒)。仅在执行上一步后的 30 秒(或给定的任何时间)后执行下一步

语法:

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

显式等待用于暂停执行,直到满足特定条件或定义的最长时间已经过去。隐式等待应用于整个测试脚本或程序的每个连续测试步骤之间,而显式等待仅应用于特定实例。

语法:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.elementToBeClickable("Locator"));

【讨论】:

以上是关于隐式等待和显式等待之间的内部工作区别是啥的主要内容,如果未能解决你的问题,请参考以下文章

Selenium 隐式和显式等待,未找到超时异常元素

爬虫之selenium和webdriver—基础:操作cookie和显式等待与隐式等待

activity的隐式和显式启动

C#接口的隐式和显式实现之间的区别[重复]

元素操作

它们在隐式 ctor、无参数空体 ctor 和显式默认 ctor 之间是不是等效?