1. 为什么要等待
当打开新的页面时,经过请求接口、返回数据、渲染数据等过程之后,页面才会正常显示数据,此过程收软硬件性能影响较大,所花费的时间也不同。若不等待页面加载完成,方法获取到的数据可能与预期不同,甚至出现较严重的bug
2. 等待类型
-
3. 显示等待
查找一个指定的元素之前,指定最长等待时间,如果在该时间内找到元素,则立刻返回元素信息;若找不到,则每隔一定的时间(默认0.5秒)查找一次节点,如果超过杀剑之后仍然没有找到节点信息,则抛出超时异常。
显示等待依赖WebDriverWait类,其构造函数的参数为::Args: - driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote) - timeout - Number of seconds before timing out - poll_frequency - sleep interval between calls By default, it is 0.5 second. - ignored_exceptions - iterable structure of exception classes ignored during calls. By default, it contains NoSuchElementException only.
WebDriverWait类包括2个方法
def until(self, method, message=’’): “””Calls the method provided with the driver as an argument until the \ return value is not False.””” def until_not(self, method, message=’’): “””Calls the method provided with the driver as an argument until the \ return value is False.”””_
该以until方法为例:其传入一个方法method,在超时时间内一直执行method方法,直到返回结果为止,若超过时间,则返回指定的错误信息message
其通常与ExpectedCondition 类配合使用,用过判断某种状况是否存在,来判断节点是否正常。其常见的方法有:
等待条件 | 含义 |
---|---|
title_is | 当前页面的title是否等于预期结果 |
title_contains | 判断当前页面的title是否包含预期字符串 |
presence_of_element_located | 判断某个元素是否被加到了dom树里,若该元素不可见,依然返回True |
visibility_of_element_located | 在上一个的基础上,判断某个元素是否可见. 即元素没有隐藏,并且元素的宽和高都不等于0 |
visibility_of | 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了 |
presence_of_all_elements_located | 判断是否至少有1个元素存在于dom树中 |
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 | 1. 断某个元素中是否不存在于dom树 或者 1. 不可见 |
element_to_be_clickable | 判断某个元素中是否可点击。 条件: 1. 可见 1. enable 1. displayed |
staleness_of | 等某个元素从dom树中移除,注意,这个方法也是返回True或False |
element_to_be_selected | 判断某个元素是否被选中了,传入节点对象。,一般用在下拉列表select、checkbox、radiobutton |
element_located_to_be_selected | 判断某个元素是否被选中了,传入节点定位元组。,一般用在下拉列表select、checkbox、radiobutton |
element_selection_state_to_be | 断某个元素的选中状态是否符合预期,传入对象元素 |
element_located_selection_state_to_be | 断某个元素的选中状态是否符合预期,传入对象节点 |
alert_is_present | 判断页面上是否存在alert |
以上方法种,软需要传为定位的,一定要以元组的方式传入,例如:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By
wait = WebDriverWait(self.browser, 10) element = self.wait.until(EC.presence_of_element_located((By.XPATH, ‘//input[@id=”accountNo”]’)))
4. 隐式等待
隐式等待的英文解释为:
implicitly_wait(self, time_to_wait)
Sets a sticky timeout to implicitly wait for an element to be found, or a command to complete. This method only needs to be called one time per session. To set the timeout for calls to__ execute_async_script, see set_script_timeout.
其大概意思是:在一个完整的会话周期内,设置一个粘性(sticky)等待时间,在该时间内找到指定元素或者执行完指定的命令。所以该等待方式方式只需要在项目运行时设定一次,即可作用与整个会话周期( one__ time per session)
例如:访问百度也买你,并查找”百度一下”按钮
from selenium import webdriver
driver = webdriver.Ie()
driver.implicitly_wait(10) # seconds
driver.get("https://www.baidu.com")
search = driver.find_element_by_id("su")
该程序,初始化driver之后,便设置隐式等待时间为10秒,然后打开百度页面并查找id为”su”的元素。
若不设置等待时间,如果网络较慢,百度主页没能够第一时间打开,则执行find_element_by_id方法必定会报错。
设置等待时间之后,若没有立即在DOM种找到id为”su”的元素,则selenium会继续等待10秒,若10秒之后仍未找到该元素,则抛出找不到节点的异常信息