我是初学者。我了解等待基本上的作用,但我对互联网上的不同教程如何放置和解释它感到困惑。例如,在下面的代码中,它被放置在加载 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")
ImplicitWait
根据 Java 文档,ImplicitWait是指定WebDriver实例的时间量,即驱动程序在搜索元素时应该等待,如果它没有立即出现在 HTML DOM 中,则在尝试查找一个或多个元素时,如果它们不是立即可用。默认设置为0,这意味着driver
当找到查找一个或多个元素的指令时,搜索开始并立即提供结果。
在这种情况下,在重新加载网页后,可能无法在立即搜索中找到一个或多个元素。因此,您的自动化框架可能会面临以下任何异常:
NoSuchElementException
TimeoutException
ElementNotVisibleException
ElementNotSelectableException
因此,我们引入了ImplicitWait。通过诱导ImplicitWait,驱动程序将轮询 DOM 树,直到在配置的时间内找到该元素,以查找一个或多个元素,然后再抛出 NoSuchElementException。到那时,您一直在寻找的一个或多个元素可能在HTML DOM中可用。与在代码中一样,你已将ImplicitWait设置为10秒的值,驱动程序将轮询HTML DOM10秒。
蟒蛇:
driver.implicitly_wait(10)
爪哇:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
点网:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
最后,一旦你设置了隐式等待,WebDriver实例,即驱动程序能够携带这个配置直到它的生存期。但是,如果您需要更改WebDriver实例的粗略时间,即等待驱动程序,则可以按如下方式重新配置它:
蟒蛇:
driver.implicitly_wait(5)
爪哇:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
点网:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
如果要在任何时候取消ImplicitWait
可以按如下方式重新配置它:
蟒蛇:
driver.implicitly_wait(0)
爪哇:
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
点网:
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
回答您的问题
- 。等待网址...:否,隐式等待对页面加载没有影响。
- 。为了查找元素...:是的,ImplicitWait将定义
WebDriver
实例等待查找一个或多个元素的粗略时间。 - 。隐式等待一次...:是的,您只需配置一次隐式等待,它适用于WebDriver实例的整个生命周期。
- 。每个元素搜索...:是的,适用于调用
findElement()
或findElements()
。
是的,implicit_wait
是全局适用的。 因此,一旦您设置了它,它就会应用于所有元素。
我不建议使用implicit_wait
,除非您的应用程序太慢。您可以从以下页面根据您的要求使用explicit wait
或任何其他等待。
它是一个JAVADOC,但Python的实现也应该相同。
https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#implicitlyWait-long-java.util.concurrent.TimeUnit-
隐式等待适用于所有 Web 元素,而显式等待仅适用于指定的元素。
显式等待更智能,并且在处理 Ajax 时真正使用完整,另一方面隐式等待通常用于处理应用程序同步问题。