使用selenium 等待可避免因页面尚未加载完成就执行下一步出现了错误。
selenium 的等待:
- 强制等待 time.sleep(3)
- 显示等待 driver.implicitly_wait(3)
- 隐式等待 WebDriverWait(driver, 3, 0.5).until()
强制等待 time.sleep(3)
不管浏览器是否完全加载完,我们都要等待指定的秒数。
隐式**等待 driver.implicitly_wait(3) **
相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。隐式等待是等页面加载,而不是元素加载!!!(隐式等待就是针对页面的,显式等待是针对元素的。)
#打开浏览器,设置隐式等待,打开页面
dr = webdriver.Chrome()
dr.implicitly_wait(30) # 隐性等待,最长等 30 秒
dr.get('https://www.csdn.net/')
特别说明一下,隐性等待设置一次对整个程序运行过程全部起作用,只要设置一次即可,不需要每次都写。
显示**等待 WebDriverWait(driver, 3, 0.5).u**ntil()
一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。显式等待是等元素加载!!!
from selenium.webdriver.support import expected_conditions as EC
#使用显式等待
try:
WebDriverWait(dr, 20, 0.5).until(EC.presence_of_element_located((By.LINK_TEXT,u'首页')))
finally:
print(dr.find_element_by_link_text('首页').get_attribute('href'))
WebDriverWait()可选择的参数有四个,但一般情况下,我们只会用到其中三个,第一个参数设置的是打开的浏览器,第二个参数设置超时时间,第三个参数设置的是检查频率,比如说,刚刚我们写的是 0.5s,那么就每隔 0.5s 进行一次检查。 后面的 until() 或 until_not() ,方法均是(method, message=””),message 返回的是如果返回结果为 0(即失败)后弹出的信息,不同的是 until 检查的是直到返回值为 True,until_not 直到返回值为 False。
EC.presence_of_element_located,判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见