在web UI自动化的时候我们经常需要等待一些dom的元素加载完成才能定位到,所以实际项目中经常需要使用等待,selenium工具中的等待主要有三种方式:
一.强制等待 :time().sleep()
python 的 time 包提供了休眠方法 sleep() ; 导入 time 包后就可以使用 sleep() ,进行脚本的执行过程进行休眠。
wd.find_element(by=By.CSS_SELECTOR,value='span[class^="bg"]>input').send_keys('123')
time.sleep(10)#强制等待10s
二.隐式等待:driver.implicitly_wait(time)
selenium 里面,定位一个元素或者一组元素的时间有个时间段轮训在dom中查找的逻辑,这个轮训的时间默认是0,可以通过implicitly_wait(time)设置,只要设置了这个值,会在一个driver的生命周期中全局生效。
input">#定位
wd.implicitly_wait(10)
wd.find_element(by=By.CSS_SELECTOR,value='span[class^="bg"]>input').send_keys('123')
三.显示等待:WebDriverWait
- WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
主要有4个参数:
driver :浏览器驱动
timeout :等待时间
poll_frequency :检测的间隔时间,默认0.5s
ignored_exceptions :超时后的异常信息,默认抛出NoSuchElementException - WebDriverWait 有两个内置方式:
这样就能够根据设置的条件灵活的等待,即如果条件成立执行下一步,不成立就抛出异常。Unit()/Unit_not方法存在2个参数:
1、method,在等待时间之内,每隔一段时间调用这个方法,直到返回的结果不是False,方式重写了call方法。
2、message,如果超时,抛出TimeoutException
expected_conditions 类提供的预期条件判断的方法 - 常用的判断方法
3.1 title_is(str):判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
from selenium.webdriver.support import expected_conditions as ec
WebDriverWait(wd,5,0.5).until(ec.title_is('百度一下,你就知道'),'等待百度一下页面title失败')
wd.find_element(by=By.CSS_SELECTOR,value='span[class^="bg"]>input').send_keys('123')
3.2 title_contains(str):判断当前页面的 title 是否包含预期字符串,返回布尔值
from selenium.webdriver.support import expected_conditions as ec
WebDriverWait(wd,5,0.5).until(ec.title_contains('百度一下'),'等待百度一下页面title失败')
wd.find_element(by=By.CSS_SELECTOR,value='span[class^="bg"]>input').send_keys('123')
3.3 presence_of_element_located(tuple):判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
from selenium.webdriver.support import expected_conditions as ec
em=wd.find_element(by=By.CSS_SELECTOR,value='span[class^="bg"]>input')
WebDriverWait(wd,5,0.5).until(ec.presence_of_element_located((By.CSS_SELECTOR,'span[class^="bg"]>input')))
3.4visibility_of_element_located(tuple):判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于 0
from selenium.webdriver.support import expected_conditions as ec
em=wd.find_element(by=By.CSS_SELECTOR,value='span[class^="bg"]>input')
WebDriverWait(wd,5,0.5).until(ec.visibility_of_element_located((By.CSS_SELECTOR,'span[class^="bg"]>input')))
3.5 visibility_of(Elenemnt对象):跟上面的方法做一样的事情,只是上面的方法要传入 locator,这个方法直接传定位到的 element 就好了。
from selenium.webdriver.support import expected_conditions as ec
em=wd.find_element(by=By.CSS_SELECTOR,value='span[class^="bg"]>input')
print(ec.visibility_of(em))
WebDriverWait(wd,5,0.5).until(ec.visibility_of(em))
3.6 presence_of_all_elements_located:判断是否至少有 1 个元素存在于 dom 树中。举个例子,如果页面上有 n 个元素的 class 都是'column-md-3',那么只要有 1 个元素存在,这个方法就返回 True
3.7 text_to_be_present_in_element(locator, text_):判断某个元素中的 text 是否 包含 了预期的字符串。
3.8 text_to_be_present_in_element_value(locator, text_):判断某个元素中的 value 属性是否包含 了预期的字符串
3.9 frame_to_be_available_and_switch_to_it(tuple):判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
3.10 invisibility_of_element_located:判断某个元素中是否不存在于dom树或不可见
3.11:element_to_be_clickable:判断某个元素中是否可见并且是 enable 的,这样的话才叫 clickable
3.12staleness_of:等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False
3.13 element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
3.14 element_selection_state_to_be:判断某个元素的选中状态是否符合预期
3.15 element_located_selection_state_to_be:跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
3.16alert_is_present:判断页面上是否存在 alert
3.17 自定义一个匿名类实现定位返回一个driver
WebDriverWait(wd,10).until(lambda x:x.find_element(by=By.CSS_SELECTOR,value='span[class^="bg"]>input')).send_keys("bbb")