三种等待方式:强制等待、显式等待、隐式等待


  我们在使用selenium的时候,会遇到一种定位不到的情况,因为web页面有一个加载的过程 当页面元素未出现时,

  去定位肯定是定位不到的,所以我们需要用到了‘等待’,该如何使用等待呢,让我们一起来探讨一下吧!

time.sleep()强制等待

  time模块,是python专门用来处理时间的内建库。

  我们可以使用它时需要导入  import   time

  time.sleep(2) 意思是强制休眠2秒种的时间

  这样等待的弊端是,我们已经定位到元素的时候,还会继续等待,导致我们工作效率很低 所以WebDriver提供了两种类型的等待:隐式等待和显式等待

implicitly_wait()隐式等待

  该方法来实现隐式等待,默认参数的单位为秒,如里面的参数设置等待时长为10秒。  

  当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;

  如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,

  若直到超出设置时长(10秒)还没有定位到元素,则抛出异常  

  该等待设置完是对整个全局起作用,所以只需设置一次即可,不需要导入任何模块,直接使用

WebDriverWait():显式等待

  是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔0.5时间检测一次特定的元素是否存在,

  如果在设置的时间内找到了元素,则直接执行。如果超过设置最长等待时间检测不到则抛出异常。

  默认检测频率为0.5s,默认抛出异常为:NoSuchElementException。

  该方法需要导入By 、WebDriverWait 、expected_conditions

 下面的代码是对三种等待的具体例子:

  from selenium import webdriver

  from selenium.webdriver.common.by import By

  from selenium.webdriver.support.ui import WebDriverWait

  from selenium.webdriver.support import expected_conditions as EC

  import time

  driver=webdriver.Chrome() driver.implicitly_wait(5) #隐式等待

  driver.get('http://www.baidu.com')

  time.sleep(3) #强制等待

  driver.find_element_by_id('kw').send_keys('特朗普')

  #每隔0.5秒检查一次(默认就是0.5秒。也可以修改),最多等待10秒,直到找到ID="su"元素就执行,否则抛出异常

  element=WebDriverWait(driver,10,0.5).until(EC.visibility_of_element_located((By.ID,'su'))) #显式等待

  element.click()

  time.sleep(2)

  driver.quit()

 

补充一点

presence_of_element_located           检查元素是否存在,但是并不一定可见。

visibility_of_element_located              检查元素存在,并且可见于页面,也就是能定位到它


posted @ 2020-08-31 14:42  懒惰的咸鱼  阅读(2528)  评论(0编辑  收藏  举报