在selenium中使用隐式等待

时间:2017-08-14 10:39:11

标签: selenium selenium-webdriver selenium-chromedriver geckodriver implicitwait

我是初学者。我明白什么等待基本上做但我很困惑如何通过互联网的不同教程放置它并解释它。例如,在下面的代码中,它在加载URL之前放置。那么,只是等待加载URL或查找元素或两者兼而有之?如果我在try块中使用一次隐式等待,它是否适用于我在代码中执行的每个元素搜索?

from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

3 个答案:

答案 0 :(得分:3)

ImplicitWait

根据{{​​3}},

ImplicitWait用于指定 WebDriver 实例的时间,即驱动程序在搜索元素时应等待的时间如果它不会立即显示在NANOSECONDS MICROSECONDSMILLISECONDSSECONDSMINUTESHOURS,{{1}中尝试查找一个或多个元素时,如果它们不能立即可用,则为{}}或DAYS。默认设置为 0 ,这意味着driver在找到查找元素的指令时,搜索开始,结果立即可用。

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

因此我们引入了 ImplicitWait 。通过引入 ImplicitWait 驱动程序将轮询ElementNotVisibleException,直到找到元素已经配置的时间量,在投掷{之前查找元素或元素{3}}。到那时,您一直在寻找的元素可以在 HTML DOM 中使用。与您的代码一样,您已将 ImplicitWait 设置为 10 秒的值,驱动程序将轮询 HTML DOM 10 秒。

  • 的Python

    driver.implicitly_wait(10)
    
  • 爪哇

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

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
    

最后,设置 ImplicitWait 后, WebDriver 实例即 driver 能够携带这种配置直到它的生命周期。但是,如果您需要更改 WebDriver 实例的粗略时间,即 driver 更改为 wait 然后你可以按如下方式重新配置它:

  • 的Python

    driver.implicitly_wait(5)
    
  • 爪哇

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

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
    

如果您想在任何时候取消 ImplicitWait ,请按以下步骤重新配置:

  • 的Python

    driver.implicitly_wait(0)
    
  • 爪哇

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

    driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
    

回答你的问题:

  • Wait for the URL:不,ImplicitWait对页面加载没有影响。
  • For finding the element:是的,ImplicitWait将定义WebDriver实例等待查找元素的时间粗略。
  • Implicit wait once:是的,您只需要配置ImplicitWait一次,并且它在WebDriver实例的整个生命周期内都适用。
  • Every element search:是的,在调用findElement()findElements()时适用。

答案 1 :(得分:1)

是的,implicit_wait是全球适用的。所以一旦你设置它应用于所有元素。

我不建议使用explicit wait,除非您的申请太慢。您可以根据以下页面中的要求使用Canvas或任何其他等待。

它是一个JAVADOC,但是python的实现应该是相同的。

https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#implicitlyWait-long-java.util.concurrent.TimeUnit-

答案 2 :(得分:1)

隐式等待适用于所有Web元素,其中显式等待仅适用于指定的元素。

显式等待更智能,并且在处理Ajax时确实使用完全,另一方面隐式等待通常用于处理应用程序同步问题。