1.强制等待(sleep)
定义:设定⼀个固定的等待时⻓,代码运⾏到此处,会强⾏进⾏等待指定的时间。
缺点:不能准确把握需要等待的时间
1.有时操作还未完成,等待就结束了,导致报错;
2.有时操作已经完成了,但等待时间还没有到,浪费时间;
3.如果在⽤例中⼤量使⽤,会浪费不必要的等待时间,影响测试⽤例的执⾏效率。
优点:使⽤简单,可以在调试时使⽤。
2.隐式等待(implicitly_wait)
定义:设定⼀个固定的等待时间,对整个⽣命周期的元素都起作⽤,每⼀个元素都会等待加 载完全,直到超过设定的等待时间
缺点:使⽤隐式等待,程序会⼀直等待整个⻚⾯加载完成,才会执⾏下⼀步操作;
优点:隐性等待对整个driver的周期都起作⽤,所以只要设置⼀次即可。
示例:
# 隐式等待设定时⻓为5s
driver.implicitly_wait(5)
driver.get('http://www.baidu.com')
# 隐式等待所有元素加载完成,直到超过设定的最⻓时间
driver.find_element_by_id("element_id").click()
隐式等待可能失效的几大原因:
1.元素不存在
2.页面加载时间过长
3.复杂的页面结构(当页面结构非常复杂且包含大量元素时,隐式等待可能无法有效等待所需元素,
因为它会等待整个页面加载完成)
4.混用隐式等待和显式等待(例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时)
3.显式等待
示等待需要⽤到两个类: WebDriverWait和expected_conditions两个类
WebDriverWait:指定轮询间隔、超时时间等
expected_conditions:指定了很多条件函数(也可以⾃定义条件函数)
1) WebDriverWait:
WebDriverWait(driver, timeout=30, poll_frequency=0.5, ignored_exceptions=None)
# 参数含义:
driver:浏览器驱动
timeout:最⻓超时时间,默认以秒为单位
poll_frequency:轮询的间隔步⻓,默认为0.5s
ignored_exceptions:忽略等待时出现的特定类型的异常,默认忽略
NoSuchElementExeception异常
2) until()和until_not():
WebDriverWait ⼀般是配合until() 或 until_not()⽅法,就能够根据判断条件⽽灵活地等 待了。主要的意思就是:程序每隔xx秒看⼀眼,如果条件成⽴了,则执⾏下⼀步;否则 继续等待,直到超过设置的最⻓时间,然后抛出TimeoutException 异常。
until():
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located
((By.XPATH, "//input[@id='txtUName']")))
until_not():
element = WebDriverWait(driver, 10).until_not(EC.presence_of_element_located
((By.XPATH, "//input[@id='11txtUName']")))
3) expected_conditions搭配显示等待使⽤:
from selenium.webdriver.support import expected_conditions as ec
locator:
//定位器
ec.presence_of_element_located((By.ID,'kw'))
element:
//元素本身
ec.visibility_of(driver.find_element(By.ID,'su'))
我们通过ec来配合until使用,我们在 使用下面的显示等待的方法的时候,要区别方法里面是使用的定位器还是元素本身
4)通过⻚⾯标题来判断
title_is (title):判断当前⻚⾯的title是否完全等于(==)预期字符串,返回布尔值
from selenium.webdriver.support import expected_conditions as ec
locator:
ec.presence_of_element_located((By.ID,'kw'))
element:
ec.visibility_of(driver.find_element(By.ID,'su'))
# 元素等待直到标题出现"会员登录_读书屋"
WebDriverWait(driver,3).until(EC.title_is('读书屋_原创小说网站'))
sleep(5)
我们通常使用精简版
el = wait.until(ec.title_is("读书屋_原创小说网站"))
title_contains (title):判断当前⻚⾯的title是否包含预期字符串,返回布尔值
# 元素等待直到标题包含"读书屋"
WebDriverWait(driver, 3).until(EC.title_contains('读书屋'))
5)通过元素是否可⻅来判断
通常在⽹⻚中并不是所有元素都是可⻅的,也有的是初始化时不可⻅,加载完成时则状态⼜变为可⻅,所以在元素等待中以下这些⽅式是经常被⽤到的
presence_of_element_located (locator):判断某个元素是否被加到了dom树⾥,并不代表该元素⼀定可⻅
示例:
# 定位器:定位元素的⽅法
locator = (By.LINK_TEXT, "重生学霸小甜妻")
# locator = ("link text", "重生学霸小甜妻")
# 元素:元素本身
# element = driver.find_element(By.LINK_TEXT, "重生学霸小甜妻")
# el = wait.until(ec.presence_of_element_located(locator))
# print("el: ", el)
visibility_of_element_located (locator):判断某个元素是否可⻅. 可⻅代表元素⾮隐藏,并且元素的宽和⾼都不等于0
el = wait.until(ec.visibility_of_element_located(locator))
# el.click()
6)通过等待的元素包含的内容来判断
text_to_be_present_in_element (locator, text_):判断某个元素中的text是否 包含 了预期的字符串
# 通过等待的元素包含的内容来判断
el = wait.until(ec.text_to_be_present_in_element(locator, "重生学霸小甜妻"))
7)针对下拉框类型的等待,还有可点击的组件,如超链接:
element_to_be_clickable (locator):判断某个元素中是否可⻅并且是enable的,这样的话才叫clickable
# 元素等待直到元素被加载,为可⻅状态,并且是可点击的状态,才会结束等待
el = WebDriverWait(driver,3).until(ECS.element_to_be_clickable((By.LINK_TEXT,"登录")))