学科分类
目录
网络爬虫

页面等待

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

为了解决这个问题,Selenium 提供了两种等待方式,一种是隐式等待,一种是显式等待。

隐式等待是等待特定的时间,显式等待是指定某一条件,直到这个条件成立后才继续执行。

1. 显式等待

显式等待指定某个条件,然后设置最长等待时间。如果这个时间结束时还没有找到元素,那么便会抛出异常了。

显式等待使用WebDriverWait类,它的构造函数定义如下:

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

它有四个参数,分别是:

  • driver:WebDriver的驱动程序(IE,Chrome,PhantomJS等浏览器或远程)。

  • timeout:最长超时时间,默认以秒为单位。

  • poll_frequency:休眠时间的间隔(步长)时间,默认为0.5秒。

  • ignored_exceptions:超时后的异常信息,默认情况下抛 出NoSuchElementException 异常。

WebDriverWait类的对象一般与unit或until_not方法配合使用:

  • until(method, message=’’):调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。

  • until_not(method, message=’’):调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

下面是一个使用WebDriverWait对象的示例,代码如下。

1   from selenium import webdriver
2   from selenium.webdriver.common.by import By
3   # WebDriverWait库,负责循环等待
4   from selenium.webdriver.support.ui import WebDriverWait
5   # expected_conditions类,负责条件出发
6   from selenium.webdriver.support import expected_conditions as EC
7   driver = webdriver.PhantomJS()
8   driver.get("http://www.xxxxx.com/ ")
9   try:
10    #查找页面元素id="myDynamicElement",直到出现则返回,如果超过10s则报出异常
11    element = WebDriverWait(driver, 10).until(
12      EC.presence_of_element_located((By.ID, "myDynamicElement"))
13    )
14  finally:
15    driver.quit()

上述代码中,第9~15行是显式等待的代码,第11行构造了一个WebDriverWait 对象,并设置超时时间为10秒。程序默认会0.5s调用一次来查看元素是否已经生成,如果元素已经生成,那么立即返回;如果超过10秒还没有生成,则报出异常。

下面是一些内置的等待条件,我们可以直接调用这些条件,而不用自己写等待条件了。

title_is
title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value
frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable – it is Displayed and Enabled.
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be
alert_is_present

2. 隐式等待

隐式等待就是设置一个全局的最大等待时间,单位为秒。在定位元素时,对所有元素设置超时时间,超出了设置时间则抛出异常。

隐式等待使用implicitly_wait方法,它使得WebDriver在查找一个Element或者Element数组时,每隔一段特定的时间就会轮询一次DOM,直到Element或数组被发现为止。

隐式等待的时间一旦设置,这个设置会在WebDriver对象实例的整个生命周期起作用。

下面是使用隐式等待的一个小示例,代码如下。

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.implicitly_wait(10)   # 设置等待时间
driver.get("http://www.xxxxx.com/loading")
dynamic_element = driver.find_element_by_id("myDynamicElement")

在上述代码中,将隐式等待的时间设置为10秒。如果不设置,则使用默认的时间0秒,也就是不等待。

点击此处
隐藏目录