python 爬虫selenium自动化操作

selenium自动化操作之五:显示等待

2019-08-21  本文已影响1人  52d19f475fe5

现在的网页越来越多采用了Ajax技术,这样程序便不能确定何时某个元素完全加载出来。如果实际页面等待时间过长导致某个元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出异常。

为了解决这个问题。所以selenium提供了两种等待方式:隐式等待和显示等待。显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。 而隐式等待让Webdriver等待一定的时间后再才是查找某元素。


1 固定休眠:time.sleep()。它将条件设置为等待一个确切的时间段。

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
time.sleep(10)
element = driver.find_element_by_id('kw')
print(element)

10秒后,才开始找元素


2 隐式等待:driver.implicitly_wait(seconds) 。在获取不可用的元素之前,会先等待10秒的时间,示例代码如下:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.baidu.com')
element = driver.find_element_by_id('123456')
print(element)

10秒后,element没有找到,抛出异常NoSuchElementException。如果去掉代码driver.implicitly_wait(10),则马上抛出异常。

注意:implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。


3 显示等待:driver.WebDriverWait() 。显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待selenium.webdriver.support.ui.WebDriverWait需要结合selenium.webdriver.support.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

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'kw'))
    )
finally:
    driver.quit()

在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。 WebDriverWai()调用unit()方法提供的驱动程序作为一个参数,直到返回值不为 False。


WebDriverWait() 详细格式如下:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

driver - WebDriver 的驱动程序(Firefox, Chrome)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。



expected_conditions 期望的条件:

上一篇下一篇

猜你喜欢

热点阅读