我们在使用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 检查元素存在,并且可见于页面,也就是能定位到它