使用selenium 等待可避免因页面尚未加载完成就执行下一步出现了错误。

selenium 的等待:

  • 强制等待 time.sleep(3)
  • 显示等待 driver.implicitly_wait(3)
  • 隐式等待 WebDriverWait(driver, 3, 0.5).until()

强制等待 time.sleep(3)
不管浏览器是否完全加载完,我们都要等待指定的秒数。

隐式**等待 driver.implicitly_wait(3) **
相当于设置全局的等待,在定位元素时,对所有元素设置超时时间。隐式等待是等页面加载,而不是元素加载!!!(隐式等待就是针对页面的,显式等待是针对元素的。)

  1. #打开浏览器,设置隐式等待,打开页面
  2. dr = webdriver.Chrome()
  3. dr.implicitly_wait(30) # 隐性等待,最长等 30 秒
  4. dr.get('https://www.csdn.net/')

特别说明一下,隐性等待设置一次对整个程序运行过程全部起作用,只要设置一次即可,不需要每次都写。

显示**等待 WebDriverWait(driver, 3, 0.5).u**ntil()
一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。显式等待是等元素加载!!!

  1. from selenium.webdriver.support import expected_conditions as EC
  2. #使用显式等待
  3. try:
  4. WebDriverWait(dr, 20, 0.5).until(EC.presence_of_element_located((By.LINK_TEXT,u'首页')))
  5. finally:
  6. 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 树里,并不代表该元素一定可见