威尼斯人线上娱乐

要素等待机制,自动化测试

13 4月 , 2019  

 (一) 前言

Python+Selenium笔记(十):成分等待机制,pythonselenium

 (一) 前言

爆冷门的财富受限或网络延迟,恐怕导致找不到对象成分,那时测试报告会显示测试战败。那时急需1种延时机制,来使脚本的运作速度与程序的响应速度相相称,WebDriver为那种状态提供了隐式等待和显式等待二种体制。

(二) 隐式等待

比方设置隐式等待时间,就会功效于那几个WebDriver实例的任何生命周期(对负有的要素查找都见效),设置隐式等待时间后,Webdriver会在肯定时间内连发检测和查找DOM,以便于查找三个或五个不是即刻加载成功并可用的成分。隐式等待的私下认可时间是0.
WebDriver使用implicitly_wait()来安装等待时间,单位秒。抢先等待时间还没找到,就报NoSuchElementException至极。

#设置超时时间为10秒

driver.implicitly_wait(10)

(三) 显式等待

WebDriver提供了WebDriverWait类和expected_conditions模块来促成显式等待。相比较隐式等待,呈现等待进一步智能。呈现等待正是设置三个平放条件,在守候时间内,每隔1段时间检查1回停放条件是或不是满意,满意则履行下一步,超时则报提姆eoutException分外。

(四) WebDriverWait类

WebDriverWait(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

driver:浏览器驱动实例

timeout:等待时间,单位秒

poll_frequency:每隔多长时间检查一次,默认0.5秒

ignored_exceptions:忽略的异常,默认只有NoSuchElementException

until方法 和 until_not方法:

until(method, message=''):method指要执行的方法(等待时间内每隔一段时间,执行一次),直到返回值为true,超时则报TimeoutException异常,message将传入异常(message参数可不填)

until_not(method, message=):直到重临值为false,其余和until相同

(五) expected_conditions模块

  
 expected_conditions模块提供了三种定义好的内置条件,供给优异WebDriverWait使用。

预期等待条件(前置条件)

简单说明

element_to_be_clickable(locator)

参数:locator,指一组(By,locator)

例如:WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable((By.NAME,'11')))
下面的都是以这种方式,只是前置条件不同,传的参数也可能不同
WebDriverWait(driver,10).until()
等待查找的元素可见并且可用,以便可以点击,返回定位到的元素

 

element_to_be_selected(locator)
等待直到元素被选中
invisibility_of_element_located(locator)

 

等待一个元素在DOM中不可见 或不存在

 

presence_of_all_elements_located(locator)

 

等待至少有一个定位器查找的元素出现在网页中,返回一组元素

 

presence_of_element_located(locator)

 

等待定位器查找的元素出现在网页中,或者可以在DOM中找到,返回一个被定位到的元素

 

text_to_be_present_in_element(locator,text)
参数:text,指定的文本
等待元素能被定位,并且带有指定的文本信息
 
title_contains(title)
参数:title,指要校验标题包含的字符串
等待网页标题包含指定的字符串,成功时返回True,否则返回false
 
title_is(title)
参数:title,指要校验的标题
等待网页标题与预期一致,成功时返回True,否则返回false
 
visibility_of(element)
参数:element,指一个元素
 
等待元素出现在DOM中,是可见的,并且宽和高都大于0,变为可见的,将返回一个元素(同一个)
 
visibility_of_element_located(locator)
 
等待元素出现在DOM中,是可见的,并且宽和高都大于0,变为可见的,将返回一个元素
 
alert_is_present()
 
判断是否存在警告窗口

 

(六) expected_conditions 示例

上面包车型地铁代码,try:
部分,每一某些都以单身可用的(作者只是表明不一致前置条件的用法后就注释掉)。此外那里只对艺术的应用办法(方法的功效)实行求证,不对使用情状举行认证(比如有未有不可或缺那样做什么样的)。

 1 from selenium import webdriver
 2 from selenium.webdriver.support.ui import WebDriverWait
 3 from selenium.webdriver.support import expected_conditions
 4 from selenium.webdriver.common.by import By
 5 
 6 driver = webdriver.Firefox()
 7 driver.maximize_window()
 8 driver.get('https://www.cnblogs.com/')
 9 
10 # try:
11 #     #等待博客园首页的【找找看】按钮可见并可用
12 #     search_btn = WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable((By.CLASS_NAME,'search_btn')))
13 #     print(search_btn.get_attribute('value'))
14 
15 # try:
16 #     login_area = driver.find_element_by_css_selector('#login_area')
17 #     login = login_area.find_element_by_link_text('登录')
18 #     login.click()
19 #     remember_me = driver.find_element_by_id('remember_me')
20 #     remember_me.click()
21 #     #等待直到登录页面的复选框被选中
22 #     WebDriverWait(driver, 10).until(expected_conditions.element_located_to_be_selected((By.ID, 'remember_me')))
23 
24 # try:
25 #     search_file = driver.find_element_by_id('zzk_q')
26 #     search_btn = driver.find_element_by_class_name('search_btn')
27 #     search_file.send_keys('python')
28 #     search_btn.click()
29 #     #网页标题是否包含 python
30 #     WebDriverWait(driver, 10).until(expected_conditions.title_contains('python'))
31 
32 try:
33     search_file = driver.find_element_by_id('zzk_q')
34     #检查元素是否出现在DOM中,是可见的,并且宽和高都大于0
35     search_file = WebDriverWait(driver,10).until(expected_conditions.visibility_of(search_file))
36     print(search_file)
37 finally:
38     driver.quit()

 

(七) 以身作则(自定义前置条件)

expected_conditions类提供了两种定义好的放置条件(预期等待条件),没有内置条件符合时,也能够通过WebDriverWait自定义前置条件。

上面那一个是WebDriverWait类自带的部分注释。

class WebDriverWait(object):
    def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
        """
           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())
        """

示范:(等待今日头条个人主页(点击首页的园子跳转到的页面)的下拉菜单有多少个可挑选)

#lambda表明式其实正是2个匿名函数,冒号右边的能够领会为函数名及参数,左边的可以精晓为函数的重回值,具体能够百度python
lambda

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select

profile = webdriver.FirefoxProfile\
    (r'C:\Users\quanhua\AppData\Roaming\Mozilla\Firefox\Profiles\tnwjkr4m.selenium')
driver = webdriver.Firefox(profile)
driver.maximize_window()
driver.get('https://home.cnblogs.com/')
try:
    #等待 博客园个人主页中的下拉菜单有5个可选项
    WebDriverWait(driver,10).until(lambda l:len(Select(l.find_element_by_id('sel_application')).options) == 5)
finally:
    driver.quit()

要素等待机制,自动化测试。(八) 总结

使用成分等待机制,对于营造中度稳定可信赖的测试是不可缺少的。在利用进度中,应该尽量幸免隐式等待和出示等待混合使用。至于隐式等待和突显等待的利弊,看书上和网上1般是比较推荐应用显示等待,但是自个儿要好试了下,权且是没看到在运营速度方面有多大分别(只怕等之后有相比较丰富的花色经验后,再回头来说说隐式等待和出示等待的利害)。

(1) 前言
突然的财富受限或互联网延迟,恐怕造成找不到对象元素,那时测试报告会…

一、time.sleep(seconds) 固定等待

import time

time.sleep(3) #等待3秒

time.sleep(seconds) seconds参数为整数,单位(秒)。

它是Python的time提供的蛰伏方法。

常用于长时间的守候,为了自动测试用例的履行作用固定等待的岁月必要控制在3秒内。在用例中尽量少用固定等待。在爬虫应用中,为模拟用户操作浏览器,防止过快操作,可选拔一定等待。

selenium文书档案中关于等待第6章有特意的辨证

始料比不上的资源受限或互联网延迟,可能造成找不到对象成分,那时测试报告会展现测试失败。这时急需壹种延时机制,来使脚本的运维速度与程序的响应速度相相称,WebDriver为那种场地提供了隐式等待和显式等待三种体制。

二、智能隐性的守候implicitly_wait(回应超时等待)

driver.implicitly_wait(time_to_wait)

回应超时等待,隐性的,设置后对应的是全局,如搜寻成分。

driver.implicitly_wait(10)  # 设置全局隐性等待时间,单位秒

每趟driver执行
找不到成分都会等待安装的年月,它的值设置的过长对用例执行功能有相当大的震慑,必须在实行到位今后复苏回来。driver.implicitly_wait()
要慎之又慎的施用。

driver对它的默许值为0,driver.implicitly_wait(0)能回复隐性等待的设置时间。

方今的大部分的Web应用程序是利用Ajax技术。当2个页面被加载到浏览器时,
该页面内的因素得以在分化的光阴点被加载。那使得定位元素变得紧Baba,
假设成分不再页面之中,会抛出 ElementNotVisibleException 十分。 使用
waits, 我们得以消除那几个标题。waits提供了一些操作之间的年月距离-
首如若一直成分或针对该因素的别样其它操作。
Selenium Webdriver 提供二种档次的waits – 隐式和显式。
显式等待会让WebDriver等待满意一定的尺码之后再进一步的执行。
而隐式等待让Webdriver等待一定的小运后再才是寻找某成分。

(二) 隐式等待

三、智能显性等待WebDriverWait

from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait(driver, timeout, poll_frequency=0.5,
ignored_exceptions=None)

参数表达:

driver 为webdriver驱动

timeout 最长超时时间,单位(秒)

poll_frequency 循环查找成分每一遍间隔的小运,私下认可0.5秒

ignored_exceptions 超时后须要输出的13分音讯

WebDriverWait()上边有多少个法子可用until()和until_not()

WebDriverWait(driver, timeout).until(method, message=”)

method
函数或然实例__call__()方法再次来到True时结束,不然超时后抛出拾1分。

参数表达:

method
在等待时间内调用的方法恐怕函数,该方法或函数必要有再次回到值,并且只收取二个参数driver。

message 超时时抛出TimeoutException,将message传入非凡显示出来

WebDriverWait(driver, timeout).until_not(method, message=”)

于地点的until() 相反,until_not
中的method函数恐怕实例__call__()方法再次来到False截至,不然抛出分外。

until方法运用的method 的函数或许类__call()__格局详解:

函数我们壹般采用匿名函数lambda 。

lambda driver:driver.find_element(<定位成分>) #
当定位的成分时为True,无成分时为False。如示例1、二:

WebDriverWait示例1:

WebDriverWait(driver,5).until(lambda
driver:driver.find_element_by_id(‘query’))

伍秒内等候成分(id=’query’)出现,lambda
driver:driver.find_element_by_id(‘query’)
为2个匿名函数,唯有二个driver参数,重返的是寻觅的要素对象。

WebDriverWait示例2:

WebDriverWait(driver, 5).until_not(lambda
driver:driver.find_element_by_name(‘query’))

伍秒内等待成分消失,同示例1 until_not
供给无成分重回即成分不存在于该页面。

显式等待:

显式等待是你在代码中定义等待一定条件发出后再进一步执行你的代码。
最糟糕的案例是利用time.sleep(),它将标准设置为等候三个合适的时间段。
这里有一些有益的法子让您只等待需求的时刻。WebDriverWait结合ExpectedCondition
是兑现的1种艺术。

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

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

WebDriverWait(driver, 十)设置了三个十秒上限的等待时间
自动化的Web浏览器中壹些常用的预料条件,下边列出的是每二个达成, Selenium
Python binding都提供了有的有益的办法,那样您就不用去编写
expected_condition类或是创制到现在的工具包去实现他们。传入的参数都以元组类型的locator,如(By.ID,
‘kw’)
expected_conditions as EC前面最最常接的预料条件:

#frame可见并切换到该frame上
EC.frame_to_be_available_and_switch_to_it
#元素可以点击,常用于按键
EC.element_to_be_clickable
#元素出现,只要一个符合条件的元素加载出来就通过
EC.presence_of_element_located
#元素出现,须所有符合条件的元素都加载出来,这个基本上就是你爬取的最主要内容了
EC.presence_of_all_elements_located
#判断某段文本是否出现在某元素中,常用于判断输入页数与实际高亮页数是否一致
EC.text_to_be_present_in_element

By前边常接的选项格局(未列出总体,全体请dir(By)查看):

By.CLASS_NAME #根据class的名称
By.ID #根据id的名称
By.TAG_NAME #根据标签的名称

#最最无敌的两个,直接从开发者工具中就可以无脑用css或xpath方法复制元素的位置
By.CSS_SELECTOR #应用CSS选择器方法
By.XPATH #应用XPATH选择器方法

如上壹篇作品的登录QQ空间为例,大家用显式等待修改下代码:

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


url = 'http://user.qzone.qq.com/'
driver = webdriver.Chrome()
driver.get(url)
#设置等待上限10秒
timeout = WebDriverWait(driver, 10)

#切换到登录框中的frame
timeout.until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'login_frame')))

switcher_plogin = timeout.until(EC.element_to_be_clickable((By.ID, 'switcher_plogin')))
#点击“帐号密码登录”按钮
switcher_plogin.click()
#定位帐号输入框
username = timeout.until(EC.presence_of_element_located((By.ID, 'u')))
#username = driver.find_element_by_id('u')
#清空帐号输入框内容
username.clear()
#填写帐号
username.send_keys('你的账号')
password = timeout.until(EC.presence_of_element_located((By.ID, 'p')))
#password = driver.find_element_by_id('p')
password.clear()
password.send_keys('你的密码')
#点击“登录”按钮
log_in = timeout.until(EC.element_to_be_clickable((By.ID, 'login_button'))).click()
#driver.quit()

还足以用username.text获得标签中的文字新闻。

固然设置隐式等待时间,就会功能于那一个WebDriver实例的全部生命周期(对持有的因素查找都见效),设置隐式等待时间后,Webdriver会在自然时间内连发检查评定和寻找DOM,以便于查找一个或多少个不是当下加载成功并可用的因素。隐式等待的私下认可时间是0.
WebDriver使用implicitly_wait()来安装等待时间,单位秒。超过等待时间还没找到,就报NoSuchElementException极度。

四、expected_conditions 类库

from selenium.webdriver.support import expected_conditions as
ec,它归纳了我们要求利用等待的有所意况。

ec.title_is(‘title’)认清页面标题等于title

ec.title_contains(‘title’)判断页面题目包蕴title

ec.presence_of_element_located(locator)伺机locator成分是还是不是出现

ec.presence_of_all_elements_located(locator)等候全数locator成分是或不是出现

ec.visibility_of_element_located(locator)伺机locator元素可见

ec.invisibility_of_element_located(locator)等候locator成分隐藏

ec.visibility_of(element)等待element成分可知

ec.text_to_be_present_in_element(locator,text)等待locator的成分中涵盖text文本

ec.text_to_be_present_in_element_value(locator,value)等待locator元素的value属性为value

ec.frame_to_be_available_and_switch_to_it(locator)等待frame可切入

ec.element_to_be_clickable(locator)等候locator成分可点击

等待成分被选中,一般用于复选框,单选框

ec.element_to_be_selected(element)等待element成分是被入选

ec.element_located_to_be_selected(locator)等待locator成分是被入选ec.element_selection_state_to_be(element,
is_selected)
等待element成分的值被选中为is_selected(布尔值)

ec.element_located_selection_state_to_be(locator,is_selected)等待locator成分的值是或不是被入选is_selected(布尔值)

隐式等待

假如某个因素不是即时可用的,隐式等待是报告WebDriver去等待一定的岁月后去探寻成分。
默许等待时间是0秒,1旦设置该值,隐式等待是安装该WebDriver的实例的生命周期。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
#设置超时时间为10秒

5、什么日期利用等待

固化等待sleep与隐性等待implicitly_wait尽量少用,它会对测试用例的履行功用有震慑。

显性的等待WebDriverWait能够灵活运用,何时供给接纳?

一、页面加载的时候,确认页面成分是不是加载成功足以采纳WebDriverWait

贰、页面跳转的时候,等待跳转页面包车型客车因素出现,要求选叁个在跳转前的页面不存在的要素

三、下拉菜单的时候,如过江之鲫度搜索设置的下拉菜单,须求充裕个时刻断的守候成分可点击

四、页面刷新的时候

总的说来,页面存在改变的时候;页面上圈套然没的要素,然后再冒出的要素


参照来源:https://zhuanlan.zhihu.com/p/30854637

driver.implicitly_wait(10)

(三) 显式等待

WebDriver提供了WebDriverWait类和expected_conditions模块来兑现显式等待。比较隐式等待,展现等待进一步智能。展现等待正是设置贰个内置条件,在等待时间内,每隔一段时间检查二遍停放条件是或不是满意,知足则实施下一步,超时则报TimeoutException格外。

(四) WebDriverWait类

WebDriverWait(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

driver:浏览器驱动实例

timeout:等待时间,单位秒

poll_frequency:每隔多长时间检查一次,默认0.5秒

ignored_exceptions:忽略的异常,默认只有NoSuchElementException

until方法 和 until_not方法:

until(method, message=''):method指要执行的方法(等待时间内每隔一段时间,执行一次),直到返回值为true,超时则报TimeoutException异常,message将传入异常(message参数可不填)

until_not(method, message=):直到重返值为false,其余和until相同

(五) expected_conditions模块

  
 expected_conditions模块提供了两种定义好的放权条件,须求合作WebDriverWait使用。

预期等待条件(前置条件)

简单说明

element_to_be_clickable(locator)

参数:locator,指一组(By,locator)

例如:WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable((By.NAME,'11')))
下面的都是以这种方式,只是前置条件不同,传的参数也可能不同
WebDriverWait(driver,10).until()
等待查找的元素可见并且可用,以便可以点击,返回定位到的元素

 

element_to_be_selected(locator)
等待直到元素被选中
invisibility_of_element_located(locator)

 

等待一个元素在DOM中不可见 或不存在

 

presence_of_all_elements_located(locator)

 

等待至少有一个定位器查找的元素出现在网页中,返回一组元素

 

presence_of_element_located(locator)

 

等待定位器查找的元素出现在网页中,或者可以在DOM中找到,返回一个被定位到的元素

 

text_to_be_present_in_element(locator,text)
参数:text,指定的文本
等待元素能被定位,并且带有指定的文本信息
 
title_contains(title)
参数:title,指要校验标题包含的字符串
等待网页标题包含指定的字符串,成功时返回True,否则返回false
 
title_is(title)
参数:title,指要校验的标题
等待网页标题与预期一致,成功时返回True,否则返回false
 
visibility_of(element)
参数:element,指一个元素
 
等待元素出现在DOM中,是可见的,并且宽和高都大于0,变为可见的,将返回一个元素(同一个)
 
visibility_of_element_located(locator)
 
等待元素出现在DOM中,是可见的,并且宽和高都大于0,变为可见的,将返回一个元素
 
alert_is_present()
 
判断是否存在警告窗口

威尼斯人线上娱乐, 

(六) expected_conditions 示例

上边的代码,try:
部分,每1有个别都以独自可用的(我只是表明分裂前置条件的用法后就注释掉)。其余那里只对章程的利用办法(方法的作用)举办认证,不对使用情形举行验证(比如有未有需要那样做什么的)。

 1 from selenium import webdriver
 2 from selenium.webdriver.support.ui import WebDriverWait
 3 from selenium.webdriver.support import expected_conditions
 4 from selenium.webdriver.common.by import By
 5 
 6 driver = webdriver.Firefox()
 7 driver.maximize_window()
 8 driver.get('https://www.cnblogs.com/')
 9 
10 # try:
11 #     #等待博客园首页的【找找看】按钮可见并可用
12 #     search_btn = WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable((By.CLASS_NAME,'search_btn')))
13 #     print(search_btn.get_attribute('value'))
14 
15 # try:
16 #     login_area = driver.find_element_by_css_selector('#login_area')
17 #     login = login_area.find_element_by_link_text('登录')
18 #     login.click()
19 #     remember_me = driver.find_element_by_id('remember_me')
20 #     remember_me.click()
21 #     #等待直到登录页面的复选框被选中
22 #     WebDriverWait(driver, 10).until(expected_conditions.element_located_to_be_selected((By.ID, 'remember_me')))
23 
24 # try:
25 #     search_file = driver.find_element_by_id('zzk_q')
26 #     search_btn = driver.find_element_by_class_name('search_btn')
27 #     search_file.send_keys('python')
28 #     search_btn.click()
29 #     #网页标题是否包含 python
30 #     WebDriverWait(driver, 10).until(expected_conditions.title_contains('python'))
31 
32 try:
33     search_file = driver.find_element_by_id('zzk_q')
34     #检查元素是否出现在DOM中,是可见的,并且宽和高都大于0
35     search_file = WebDriverWait(driver,10).until(expected_conditions.visibility_of(search_file))
36     print(search_file)
37 finally:
38     driver.quit()

 

(七) 以身作则(自定义前置条件)

expected_conditions类提供了三种概念好的内置条件(预期等待条件),未有松开条件适合时,也足以因而WebDriverWait自定义前置条件。

上面这些是WebDriverWait类自带的局地注释。

class WebDriverWait(object):
    def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
        """
           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())
        """

演示:(等待和讯个人主页(点击首页的园圃跳转到的页面)的下拉菜单有八个可选取)

#lambda表明式其实正是贰个匿名函数,冒号左侧的能够明白为函数名及参数,左边的能够知晓为函数的再次回到值,具体能够百度python
lambda

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select

profile = webdriver.FirefoxProfile\
    (r'C:\Users\quanhua\AppData\Roaming\Mozilla\Firefox\Profiles\tnwjkr4m.selenium')
driver = webdriver.Firefox(profile)
driver.maximize_window()
driver.get('https://home.cnblogs.com/')
try:
    #等待 博客园个人主页中的下拉菜单有5个可选项
    WebDriverWait(driver,10).until(lambda l:len(Select(l.find_element_by_id('sel_application')).options) == 5)
finally:
    driver.quit()

(八) 总结

运用成分等待机制,对于创设中度稳定可靠的测试是不可缺少的。在动用进程中,应该尽量防止隐式等待和出示等待混合使用。至于隐式等待和显示等待的利害,看书上和网上一般是比较推荐使用彰显等待,然而笔者本身试了下,一时半刻是没见到在运转速度方面有多大分别(可能等随后有相比较丰富的品种经验后,再回头来说说隐式等待和呈现等待的利弊)。


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图