Python自动化测试学习(七)— 元素等待的三种方式
一、为什么设置元素等待
目前大多数Web应用程序都是使用AJAX技术,当浏览器在加载页面时,页面内的元素可能并不是同时被加载完成的。因此当我们在网页上定位元素时,有可能网页已经打开但是元素未加载出来,定位不到元素就会抛出异常。
二、隐式等待
- 通过一定时长等待页面所有元素加载完成,如果超过设置的时长元素还没有被加载出来则抛出NoSuchElementException异常
- 隐式等待是设置全局等待,默认等待时间是0s,所以只要设置一次。
- 在规定时间范围内,浏览器不停的刷新页面,直到找到相关元素结束
from selenium import webdriver from time import sleep 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.taobao.com/") # 隐式等待10s driver.implicitly_wait(10) driver.maximize_window() # 定位淘宝网页首页轮播图 driver.find_element_by_xpath("//div[@class='mod'][1]/ins/a").click() print("成功") driver.quit()
三、显示等待
- 在设置的时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间后仍检测不到元素则抛出异常。
- 针对某个特定的元素设置等待时间,在设置的时间内,默认每隔一段时间检测一次当前某个元素是否存在,如果找到元素则立即执行,如果超时则抛出NoSuchElementException
from selenium import webdriver from time import sleep 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.taobao.com/") driver.maximize_window() # 显示等待,EC是expected_condition的别名 element = WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located((By.XPATH, "//div[@class='mod'][1]/ins/a"))) print("成功") driver.quit()
WebDriverWait():
由webdriver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。格式如下:
WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None)
参数:
-
- driver: webdriver的驱动程序
- timeout: 设置超时时间,默认以秒为单位
- poll_frequency: 休眠时间(步长)的间隔,默认为0.5秒
- ignored_exceptions: 超时后的异常信息,默认情况下抛 “NoSuchElementException".
until()
WebDriverWait()一般由until或until_not配合使用
until(method,message=’ ’) 调用该方法提供的驱动程序做为一个参数,直到返回值为True
expected_conditions提供一些预期条件的实现
四、强制等待
- 设置固定的休眠时间。脚本执行sleep()后线程休眠,另外两种不休眠
- 缺点:如果指定的时间过长,即使元素已被加载出来了,但还是要继续等,这样会浪费很多时间
sleep(5): 休眠5s