1

显式等待示例

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 秒并且控制将移至连续的书面语句,我想了解在这种情况下隐式等待和显式等待有何不同?他们如何在内部工作?

4

2 回答 2

2

隐式等待:

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

参考

几个参考:


显式等待:

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

参考

几个参考:


获得粒度:

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

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

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

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

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

于 2017-09-25T06:20:57.357 回答
0

隐式等待用于在整个测试脚本或程序的每个连续测试步骤之间提供等待时间(例如 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"));
于 2017-09-26T09:05:23.283 回答