如今多数的Web程序都是用ajax技术,浏览器加载页面时,页面的元素可能并不是同事被加载的,因此要定位这些元素就非常困难,
如果因为在加载某个元素时延迟而造成ElementNotVisibleException的情况出现,那么就会降低自动化脚本的稳定性,这个情况可以通过设置元素等待
改善这种问题。
显式等待--使WebDriver等待某个条件成立时继续执行,否则达到最大时长时抛出超时异常timeoutexception
‘‘‘代码‘‘‘
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
from time import ctime
#WebDriverWait类由webdriver提供的等待方法,在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超时检测不到则抛出异常,
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
element = WebDriverWait(driver,5,0.5).until(
EC.presence_of_element_located((By.ID,"kw"))
element.send_keys("the walking dead")
driver.quit()
‘‘‘代码‘‘‘
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exception=None)
driver:浏览器驱动
timeout:等待的最长时长默认秒
poll_frequency:步长0.5
ignored_exception:超时后的异常信息,,默认nosuchelementexception
WebDriverWait()一般搭配until()和until_not()使用
until(method,message=‘‘) 调用该方法提供的驱动程序作为一个参数,直到返回值为true
until_not(method,message=‘‘)调用该方法提供的驱动程序作为一个参数,直到返回值为false
presence_of_element_located()该方法判断元素是否存在或者是否被加载在dom树中,并不代表该元素一定可见
expected_conditions类提供了类似以上的处理方法,见书p97页
隐式等待--通过一定的时长等待页面上某元素加载完成,如果超出了设置的时长元素还没有被加载,则抛出nosuchelementexception异常
webdriver提供了implicitly_wait()方法来实现隐式等待,用法相对来说简单