Selenium自动化测试中的等待时间
我们在做Web UI自动化测试过程中经常需要使用到等待时间,为什么呢?因为对于自动化来说,它不会像人在做手工测试过程一样,等到控件加载出来才去操作,
往往自动化测试执行过程中执行时间是毫秒级的,所以如果不加等待时间的话,经常就会因为控件还未加载出来,导致自动化用例大批量的失败。所以我们就会
用到等待时间。
等待时间一般有三种:
1、time.sleep()
第一种就是Python time模块的等待方法,其实就是线程休眠,我们来看下源码:
def sleep(seconds): # real signature unknown; restored from doc
“”"
sleep(seconds)
Delay execution for a given number of seconds. The argument may be
a floating point number for subsecond precision.
"""
pass
复制代码
其实通过源码就可以看到它的使用,比如我们要去操作某个控件,可以在这个控件代码的上一行加time.sleep(5),这样再执行控件操作之前就会等待5秒才会去执行它。
那么有的同学就回去问了,那么我应该写几秒呢?其实就根据你在调式过程中,比如第一次调试这个控件加载用了5秒,第二次用了3秒,第三次用了8秒,那么你就应该
给一个这个控件加载需要消耗的最大时间,那么具体怎么实现呢?下边通过打开论坛,等待输入框加载出来再输入内容给大家进行演示:
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get(‘http://www.bcbxhome.com’)
driver.maximize_window()
time.sleep(5)
driver.find_element_by_id(“scbar_txt”).send_keys(“selenium”)
复制代码
2、隐式等待driver.implicitly_wait()当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常换句话说,当查找元素或元素并没
有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一
个正常响应的应用的测试变慢,它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
隐式等待时间和time.sleep的区别在于,time.sleep的等待是必须把你代码写的时间完全等待完后才会继续执行,而隐式等待时间只要你控件加载出来了,它就会继续执行
往下执行,比如虽然你写的等待10秒,但是控件要是2秒加载完毕了,那么实际你等待的时间就只有2秒。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(‘http://www.bcbxhome.com’)
driver.maximize_window()
driver.implicitly_wait(10)
driver.find_element_by_id(“scbar_txt”).send_keys(“selenium”)
复制代码
3、显示等待WebDriverWait()
首先看下WebDriverWait类的__init__方法:
def init(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
“”"Constructor, takes a WebDriver instance and timeout in seconds.
: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.
Example:
from selenium.webdriver.support.ui import WebDriverWait \n
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) \n
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\ \n
until_not(lambda x: x.find_element_by_id("someId").is_displayed())
"""
复制代码
需要通过from selenium.webdriver.support.wait import WebDriverWait导入模块
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
需要与until()或者until_not()方法结合使用
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_not是直到这个控件不存在了怎么怎么样…
WebDriverWait与expected_conditions结合使用
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
wait = WebDriverWait(driver,10,0.5)
element =waite.until(EC.presence_of_element_located((By.ID,“kw”),message="")
复制代码
最终webdriverwait的使用方法是怎么样的呢?
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
复制代码
我们再解读下此方法,5就是最大等待时间,0.5就是每隔多久去dom树检测一次,检测的是当前页面是否已经有了属性为ID的属性值是scbar_txt的控件,如果有了查找结束。
如果没有需要把5秒等待完成。
例外我们再看一下By这个类,点到源码可以看到如下:
class By(object):
“”"
Set of supported locator strategies.
“”"
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
复制代码
其实这个就是说你查找定位的方法可以使用之前讲的8大定位方法的任何一种定位,至此三种等待时间就介绍完了。
上一篇: Python函数传参位置关系总结