Selenium

来源:互联网 发布:windows重启数据库 编辑:程序博客网 时间:2024/06/07 02:09

UI层面的自动化的测试,由于网络、电脑配置等因素的不同,导致页面的加载速度不同,因此为了保证测试脚本的稳定性,需要在脚本中添加相应的等待时间。
1. 休眠等待
添加休眠非常简单,只需要引入python的time包,调用其中的sleep()方法。
这一种休眠方式会强制休眠对应的时间长度,不管页面或元素是否显示,因此会出现影响运行效率的问题,长时间的休眠不建议使用。

用法:

# -*- coding:utf-8 -*-from selenium import webdriverimport time  time.sleep(0.1)   # 休眠0.1秒time.sleep(3)   # 休眠3秒

2. 智能等待-隐式等待
通过添加implicitly_wait()方法就可以实现智能等待,其为是 webdirver 提供的一个超时等待,文档中的解释:隐式地等待一个元素被发现,或命令来完成。
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常。
换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM。一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。

用法:

driver.implicitly_wait(30)

3. 智能等待-显示等待
WebDriverWait()类: webdirver 提供的方法。简单来说就是WebDriver每隔一段时间就对页面元素进行检测,直到达到设定条件或超过设定时间,默认会抛出NoSuchElementException的异常。

文档解释:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)timeout - 超时时间,默认以秒为单位poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
WebDriverWait()一般由 until()或 until_not()方法配合使用,下面是 until()和 until_not()方法的说明。until(method, message=’’)调用该方法提供的驱动程序作为一个参数,直到返回值不为 Falseuntil_not(method, message=’’)调用该方法提供的驱动程序作为一个参数,直到返回值为 False

文档中提供的实例

from selenium.webdriver.support.ui import WebDriverWait element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id("someId").is_displayed())

同城WebDriverWait要和expected_conditions.py文件配合使用,expected_conditions.py提供了一系列用于元素判断的方法,按需使用对应的方法即可。

几个方法实例:

from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import By# 等待元素出现在DOMWebDriverWait(self._driver).until(EC.presence_of_element_located((By.ID, value)))# 等待元素显示在页面WebDriverWait(self._driver,10).until(EC.visibility_of_element_located((By.NAME, value)))# 等待元素从页面消失WebDriverWait(self._driver, 10, 0.2).until_not(EC.visibility_of_element_located((By.CLASS_NAME, value))))# 等待页面的title显示WebDriverWait(self._driver, 5,0.2).until(EC.title_contains(title))

另外:
隐式等待和显示等待的策略都是一样的,第一次找不到元素后都会继续重试直至超时。区别是显示等待是针对特定元素,隐式等待是针对所有元素(相当于在 webdriver api 的所有 find 方法里加了等待)。

0 0