龙空技术网

Selenium自动化测试中的等待时间

软件测试架构师刀锋 92

前言:

此时我们对“js等待控件加载”大概比较关怀,各位老铁们都想要学习一些“js等待控件加载”的相关内容。那么小编也在网上汇集了一些有关“js等待控件加载””的相关知识,希望小伙伴们能喜欢,大家快快来了解一下吧!

我们在做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 bea floating point number for subsecond precision."""pass

复制代码其实通过源码就可以看到它的使用,比如我们要去操作某个控件,可以在这个控件代码的上一行加time.sleep(5),这样再执行控件操作之前就会等待5秒才会去执行它。那么有的同学就回去问了,那么我应该写几秒呢?其实就根据你在调式过程中,比如第一次调试这个控件加载用了5秒,第二次用了3秒,第三次用了8秒,那么你就应该给一个这个控件加载需要消耗的最大时间,那么具体怎么实现呢?下边通过打开论坛,等待输入框加载出来再输入内容给大家进行演示:

from selenium import webdriverimport timefrom selenium.webdriver.common.keys import Keysdriver = webdriver.Chrome()driver.get(';)

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 webdriverdriver = webdriver.Chrome()driver.get(';)

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 callsBy 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 \nelement = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) \nis_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\ \nuntil_not(lambda x: x.find_element_by_id("someId").is_displayed())"""

复制代码需要通过from selenium.webdriver.support.wait import WebDriverWait导入模块driver:浏览器驱动timeout:最长超时时间,默认以秒为单位poll_frequency:检测的间隔步长,默认为0.5signored_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 ECfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom 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大定位方法的任何一种定位,至此三种等待时间就介绍完了。

标签: #js等待控件加载 #python等待1秒 #selenium加载超时