显式等待与隐式的except(有条件的等待)有什么不同,因为这两个等待都在指定的时间完成之前执行下一步?

时间:2018-12-12 06:57:58

标签: selenium-webdriver webdriver webdriverwait

据我所知,显式等待是有条件的等待,如果在指定时间之前找到该元素,它将继续执行下一步。如代码中所示,即使在10秒之前找到元素,隐式等待也不应该执行下一步,而是立即执行下一步,即2秒以内。它不会在整个10秒内继续轮询DOM。还请根据示例建议如何决定要使用哪个等待时间?我经历了许多问题,但所有问题都是复制粘贴,期望在体系结构级别得到答案。

WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
String appUrl = "https://www.facebook.com/";
driver.get(appUrl);
driver.manage().window().maximize();
WebElement username = driver.findElement(By.xpath("//input[@id='email']"));

1 个答案:

答案 0 :(得分:0)

ImplicitWait

ImplicitWait用于指定 WebDriver 实例(即 driver )在搜索元素时应等待的时间(如果元素不立即出现在列表中)。 HTML DOMNANOSECONDSMICROSECONDSMILLISECONDSSECONDSMINUTESHOURSDAYS的项尝试查找一个或多个元素(如果不是立即可用)时。默认设置为 0 ,这意味着driver会在找到一条或多条元素的指令时开始搜索并立即提供结果。

在这种情况下,在重新加载网页后,可能立即搜索到一个或多个元素。因此,您的Automation Script可能面临以下任何例外情况:

因此,我们介绍 ImplicitWait 。通过引入 ImplicitWait driver 将轮询DOM Tree,直到找到该元素已配置的时间,然后在抛出{之前寻找一个或多个元素。 {3}}。到那时,您一直在寻找的一个或多个元素可以在 HTML DOM 中使用。就像在您的代码中一样,您已经将 ImplicitWait 设置为 10 秒,驱动程序将轮询 HTML DOM 10 秒。

  • Java

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

最后,一旦您设置了 ImplicitWait ,即 WebDriver 实例,即 driver 能够一直使用此配置直到其使用寿命。但是如果您需要将 WebDriver 实例的粗略时间(即 driver )更改为 wait ,则可以按如下所示重新配置它:

  • Java

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

如果您想随时取消 ImplicitWait ,可以按以下方式重新配置它:

  • Java

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

您可以在NoSuchElementException

中找到详细的讨论

ExplicitWait

Using implicit wait in selenium是您为 WebDriver 实例定义,配置和实现的代码块,以等待满足特定条件后再继续下一行代码。有一些方法可以帮助我们实施 ExplicitWait ,该方法只会等待所需的时间。 WebDriverWait ExpectedCondition 相结合是实现 ExplicitWait 的方法之一。

一个例子:

  • Java

    driver.get("http://www.example.com/");
    new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("element_css"))).click();
    

说明:

此实现 ExplicitWait 最多等待10秒,然后抛出TimeoutException,如果找到该元素,它将在0到10秒内返回。 WebDriverWait 默认情况下每500毫秒调用一次ExpectedCondition,直到成功返回为止。 ExpectedCondition函数类型的成功返回值是Boolean值为true或非空对象。

预期条件:

自动化Testing Web/Mobile Applications的Web浏览器时会遇到一些经常遇到的情况。 Java,C#和Python绑定包括这些便捷的方法,因此我们不必自己编写 ExpectedCondition 类或为它们创建我们自己的实用程序包。一些 Expected Conditions 是:

  • alertIsPresent()
  • elementToBeClickable(locator)
  • elementToBeSelected(WebElement)
  • frameToBeAvailableAndSwitchToIt(locator)
  • invisibilityOf(element)

在这里您可以找到ExplicitWait支持的所有方法。

您可以在Expected Conditions中找到详细的讨论。


  

Note 请勿混用 implicit and explicit waits 。这样做可能导致 unpredictable wait times 。例如,将隐式等待设置为10秒,将显式等待设置为15秒,则可能导致20秒后发生超时。