如果Implicit,Explicit和fluent等待在超时之前找到元素会发生什么?

时间:2017-08-10 08:59:13

标签: selenium-webdriver

让我们考虑超时是10秒。

元素在3秒内找到。

在所有三个等待案例中,webdriver的响应是什么

1 个答案:

答案 0 :(得分:0)

一般情况下,尽管您选择了哪种方法,但只要找到元素,程序就会继续。

其三种方法之间的区别是WHEN,驱动程序会找到该元素。

  1. Fluent wait和Explicit wait之间的区别(在Java中)是您可以设置轮询间隔并使用Fluent wait忽略异常。
    (但在python中,当使用WebDriverWait类时,这些设置是可选的。在大多数情况下,您可以将此类用作Fluent和Explicit实现的组合。请参阅https://stackoverflow.com/a/25784321/8186183
  2. 显式和隐式等待之间的差异是隐式等待时间是全局设置选项。每次调用find元素或其他预期条件时,它都会生效。
  3. 另见Differences between impilicit, explicit and fluentwait

    我只是做了一个例子,将这些方法与python进行比较(如果有任何不同的结果使用Java来实现这个,请告诉我)
    **我建立一个空白页面和一个一块脚本产生一个id =" new_elem" 3秒后。**我用PhantomJS作为硒驱动剂。

    我想首先介绍处理find元素任务的方法。

    Fluent wait, 1s interval: waited 3.076176 seconds
    Fluent wait, 5s interval: waited 5.587320 seconds
    Explicit wait, 10s wait time: waited 3.105178 seconds
    Implicit wait, 10s wait time: waited 3.138179 seconds
    

    1.1流利等待1秒间隔

    start = time.time()
    driver.get('http://127.0.0.1:5000')
    element = WebDriverWait(driver, 10, poll_frequency=1).until(EC.presence_of_element_located((By.ID, 'new_elem')))
    print("Fluent wait, 1s interval: waited %f seconds" % (time.time()-start))
    

    3秒后,驾驶员找到了该元素。

    1.2流利等待,间隔为5秒

    start = time.time()
    driver.get('http://127.0.0.1:5000')
    element = WebDriverWait(driver, 10, poll_frequency=5).until(EC.presence_of_element_located((By.ID, 'new_elem')))
    print("Fluent wait, 5s interval: waited %f seconds" % (time.time()-start))
    

    在元素出现后,驱动程序没有立即找到元素,但是在5秒间隔之后。

    <强> 2。明确等待,等待时间为10秒

    start = time.time()
    driver.get('http://127.0.0.1:5000')
    element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'new_elem')))
    print("Explicit wait, 10s wait time: waited %f seconds" % (time.time()-start))
    

    默认情况下,WebDriverWait的轮询间隔为0.5秒。所以司机在3秒后发现了这个元素。

    3隐含等待,等待时间为10秒

    start = time.time()
    driver.implicitly_wait(10)
    driver.get('http://127.0.0.1:5000')
    element = driver.find_element_by_id('new_elem')
    print("Implicit wait, 10s wait time: waited %f seconds" % (time.time()-start))
    

    请注意,隐含的等待时间是全局设置选项。一旦设置,每当调用find_element方法时,它会等待等待时间才能找到元素。但是一旦找到了目标,它就会返回结果而不再等待时间 此外,您无法通过隐式等待设置轮询间隔。它将继续尝试以较短的时间间隔从DOM中轮询某些元素。