隐式,显式,流利的等待有什么区别?
如果我们在隐式等待中设置 10 秒并且在 10 秒之前,则在 3 秒内只有元素被定位。
到时候会发生什么?它将等待 10 秒或继续进行。
隐式,显式,流利的等待有什么区别?
如果我们在隐式等待中设置 10 秒并且在 10 秒之前,则在 3 秒内只有元素被定位。
到时候会发生什么?它将等待 10 秒或继续进行。
ImplicitWait是一种配置WebDriver实例的实现,即驱动程序在尝试查找一个或多个元素(如果它们不是立即可用的)时轮询HTML DOM一定时间(中间是NANOSECONDS
, MICROSECONDS
, MILLISECONDS
, SECONDS
,或)。默认设置为0,这意味着驱动程序在找到查找一个或多个元素的指令时,将开始搜索并立即获得结果。MINUTES
HOURS
DAYS
在这种情况下,在重新加载网页后,一个或多个元素可能会/可能不会在立即搜索中找到。因此,您的自动化框架可能面临以下任何异常:
NoSuchElementException
TimeoutException
ElementNotVisibleException
ElementNotSelectableException
因此,您需要诱导ImplicitWait。通过引入ImplicitWait,驱动程序将在配置的时间内轮询DOM 树,以查找一个或多个元素。到那时,您一直在寻找的一个或多个元素可能在 DOM 中可用。在您的代码中,您已经将ImplicitWait设置为10秒的值,驱动程序将轮询 DOM 10秒。
Python:
driver.implicitly_wait(10)
爪哇:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
最后,一旦您设置了ImplicitWait,WebDriver实例(即驱动程序)就能够携带此配置直到其生命周期。但是,如果您需要更改WebDriver实例的粗略时间,即驱动程序等待,那么您可以重新配置它,如下所示:
Python:
driver.implicitly_wait(5)
爪哇:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
如果您想在任何时候取消ImplicitWait,您可以按如下方式重新配置它:
Python:
driver.implicitly_wait(0)
爪哇:
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
Fluent Wait是Wait接口的实现,通过它我们可以动态配置超时和轮询间隔。可以定义FluentWait的实例来配置等待条件的最长时间以及必须检查条件的频率。用户还可以配置等待以在等待元素时忽略特定类型的异常,例如页面上的NoSuchElementException。
用法:
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
ExplicitWait俗称WebDriverWait是FluentWait的一种特殊实现,用户可以通过它定义、配置和实现WebDriver实例,等待满足一定条件后再进行下一行代码。有一些方法可以帮助我们实现ExplicitWait,它只会在需要的时候等待。WebDriverWait与ExpectedConditions的结合是可以实现ExplicitWait的方式之一。
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
.
.
.
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));
element.click();
ExplicitWait的这种实现在抛出 a 之前最多等待 10 秒,TimeoutException
或者如果它找到元素,那么它将在 0 到 10 秒内返回。默认情况下, WebDriverWait每 500 毫秒调用一次ExpectedCondition,直到它成功返回。ExpectedCondition函数类型的成功返回值是Boolean
true 值或非空对象。
在自动化 Web 浏览器以测试 Web/移动应用程序时,经常会遇到一些情况。Java、C# 和 Python 绑定包括那些方便的方法,因此我们不必自己编写ExpectedCondition类或为它们创建自己的实用程序包。一些预期的条件是:
alertIsPresent()
elementToBeClickable(locator)
elementToBeSelected(WebElement)
frameToBeAvailableAndSwitchToIt(locator)
invisibilityOf(element)
您可以在此处找到有关预期条件支持的所有方法。
NoSuchElementException
.因此,根据第一种情况,司机只会等待3 秒。
如果我们在隐式等待中设置 10 秒并且在 10 秒之前,则在 3 秒内只有元素被定位。
到时候它将继续进行而不是等待设定的时间..
隐式等待将告诉 Web 驱动程序在抛出“NoSuchElementException”之前等待一定的时间。默认设置为 0。一旦我们设置了时间,Web 驱动程序将在抛出异常之前等待该时间。如果您给定 10 秒作为等待时间,但在 3 秒时识别出元素,则它将在 3 秒后进入下一步。
显式等待是您定义的代码,用于在继续执行代码之前等待某个条件发生。显式等待将告诉 Web 驱动程序在抛出 NoSuchElementException 异常之前等待某些条件,例如 visibilityOfElementLocated 和最长时间。你可以参考这个 - https://qaautomation.expert/2019/07/18/implicit-explicit-fluent-wait-in-selenium-webdriver/