1. 为什么要等待

  • 当打开新的页面时,经过请求接口、返回数据、渲染数据等过程之后,页面才会正常显示数据,此过程收软硬件性能影响较大,所花费的时间也不同。若不等待页面加载完成,方法获取到的数据可能与预期不同,甚至出现较严重的bug

    2. 等待类型

  • selenium提供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)
例如:访问百度也买你,并查找”百度一下”按钮

  1. from selenium import webdriver
  2. driver = webdriver.Ie()
  3. driver.implicitly_wait(10) # seconds
  4. driver.get("https://www.baidu.com")
  5. search = driver.find_element_by_id("su")

该程序,初始化driver之后,便设置隐式等待时间为10秒,然后打开百度页面并查找id为”su”的元素。
若不设置等待时间,如果网络较慢,百度主页没能够第一时间打开,则执行find_element_by_id方法必定会报错。
设置等待时间之后,若没有立即在DOM种找到id为”su”的元素,则selenium会继续等待10秒,若10秒之后仍未找到该元素,则抛出找不到节点的异常信息