设置隐式等待
1、一次设置,后边的代码全部生效(全局生效,可修改)
2、在元素定位的时候,如果找不到元素,轮询查询(每0.5秒查询一次),直到元素出现
3、元素出现就不会再等了
4、如果元素超时没有出现,就报错
driver.implicitly_wait(10)
设置显示等待
1、每隔一段时间检测一次当前页面元素是否存在,
2、如果元素出现就不再等了,继续执行后边的代码
3、如果超过设置时间检测不到则抛出异常(TimeoutException)
4、只对设置的元素生效
操作格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔(步长)时间,默认为0.5S (也就是轮询时间)
WebDriverWait()一般由until()或 until_not()方法配合使用
expected_conditions类提供的预期条件判断的方法(这里介绍几种常用的)
presence_of_element_located | 判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见 |
visibility_of_element_located | 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于 0 |
visibility_of | 跟上面的方法做一样的事情,只是上面的方法要传入 locator,这个方法直接传定位到的 element 就好了 |
text_to_be_present_in_element | 判断某个元素中的 text 是否 包含 了预期的字符串 |
text_to_be_present_in_element_value | 判断某个元素中的 value 属性是否包含 了预期的字符串 |
frame_to_be_available_and_switch_to_it | 判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False |
invisibility_of_element_located | 判断某个元素中是否不存在于dom树或不可见 |
element_to_be_clickable | 判断某个元素中是否可见并且是 enable 的,这样的话才叫 clickable |
------------------
应用:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
#元素是否可见
element = WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.ID, "kw")))
element.send_keys('selenium')