Python+Selenium笔记(十):元素等待机制

 (一) 前言

突然的资源受限或网络延迟,可能导致找不到目标元素,这时测试报告会显示测试失败。这时需要一种延时机制,来使脚本的运行速度与程序的响应速度相匹配,WebDriver为这种情况提供了隐式等待和显式等待两种机制。

(二) 隐式等待

一旦设置隐式等待时间,就会作用于这个WebDriver实例的整个生命周期(对所有的元素查找都生效),设置隐式等待时间后,Webdriver会在一定时间内持续检测和搜寻DOM,以便于查找一个或多个不是立即加载成功并可用的元素。隐式等待的默认时间是0. WebDriver使用implicitly_wait()来设置等待时间,单位秒。超过等待时间还没找到,就报NoSuchElementException异常。

#设置超时时间为10秒

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 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())
        """

示例:(等待博客园个人主页(点击首页的园子跳转到的页面)的下拉菜单有5个可选项)

#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()

(八) 总结

应用元素等待机制,对于构建高度稳定可靠的测试是必不可少的。在使用过程中,应该尽量避免隐式等待和显示等待混合使用。至于隐式等待和显示等待的优缺点,看书上和网上一般是比较推荐使用显示等待,不过我自己试了下,暂时是没看出在运行速度方面有多大区别(可能等以后有比较丰富的项目经验后,再回头来说说隐式等待和显示等待的优缺点)。

原文地址:https://www.cnblogs.com/simple-free/p/8458361.html

时间: 2024-07-30 23:49:45

Python+Selenium笔记(十):元素等待机制的相关文章

Python +selenium之设置元素等待

当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给元素的定位增加了困难.如果因为在加载某个元素时延迟而造成ElementNotVisibleException 的情况出现,那么就会降低自动化脚本的稳定性,我们可以设置元素等待时间改善这种问题造成的不稳定性. WebDriver提供了两种类型的等待,显示等待和隐式等待  显示等待: 显示等待使WebDriver等待某个条件成立时继续执行,否者在达到最大时长事会抛出超时异常(TimeoutException)

python学习笔记十——异常处理

1.try: command except 错误类型,记录错误信息变量: command finally: command try...finally的用处是无论是否发生异常都要确保资源释放代码的执行.一般来说,如果没有发生错误,执行过try语句块之后执行finally语句块,完成整个流程.如果try语句块发生了异常,抛出了这个异常,此时就马上进入finally语句块进行资源释放处理.如下从几个细节讨论finally的特性. 1).try中的return: 当在try语句块中含有return语句

Python+Selenium笔记(十四)鼠标与键盘事件

 (一) 前言 Webdriver高级应用的API,允许我们模拟简单到复杂的键盘和鼠标事件,如拖拽操作.快捷键组合.长按以及鼠标右键操作,都是通过使用webdriver的Python API 中的ActionChains类实现的. 调用ActionChains类方法时,不会立即执行,而是将所有操作都存放在一个队列里,当调用perform()方法时,队列里的操作会依次执行 (二) 与键盘和鼠标事件有关的一些重要的方法 方法 简单说明 click(on_element=None) 单击元素 on_e

Python+Selenium笔记(九):操作警告和弹出框

#之前发的 driver.switch_to_alert() 这句虽然可以运行通过,但是会弹出警告信息(这种写法3.x不建议使用)  改成 driver.switch_to.alert就不会了. (一) 前言 开发人员使用JavaScript 警告或者模态对话框来提示校验错误信息.报警信息.执行操作后的返回信息,甚至用来接收输入值等. (二) Alert类 Selenium WebDriver 通过Alert 类来操控 JavaScript 警告. (三) Alert功能及方法 功能/属性 简单

【selenium学习笔记一】python + selenium定位页面元素的办法。

1.什么是Selenium,为什么web测试,大家都用它? Selenium设计初衷就是为web项目的验收测试再开发.内核使用的是javaScript语言编写,几乎支持所以能运行javaScript的浏览器,支持windows\linux\macos等各种平台. Selenium 脚本是用多种受支持的编程语言中的一种编写的 —— 目前可用的有 Java.Ruby 和 Python 驱动程序.这些脚本在浏览器之外的一个单独的进程中运行.驱动程序的任务是执行测试脚本,并通过与运行在浏览器中的 bro

Python+Selenium笔记(十五)调用JS

(一) 方法 方法 简单说明 execute_async_script(script, args) 异步执行JS代码 script:被执行的JS代码 args:js代码中的任意参数 execute_script(script, args) 同步执行JS代码 script:被执行的JS代码 args:js代码中的任意参数 (二) 示例 from selenium.webdriver.common.action_chains import ActionChains from selenium imp

Python+Selenium笔记(十八):持续集成jenkins

(一)安装xmlrunner 使用Jenkins执行测试时,测试代码中会用到这个模块. pip install xmlrunner (二)安装jenkins (1)   下载jekins https://jenkins.io/download/ 下载适合自己的,我是下载长期稳定版的. (2)   解压后运行jenkins.msi这个文件,然后一直下一步就是了. (3)   http://localhost:8080 登录 (4)   根据提示输入密码后,下一步. (6)   这里第一个应该是默认

Python+Selenium笔记(十二):数据驱动测试

(一)   前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化.(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二)   ddt 使用ddt执行数据驱动测试,ddt库可以将测试中的变量参数化.使用ddt的时候,在测试类上使用@ddt装饰符,在测试方法上使用@data装饰符.@data装饰符将参数当作测试数据,参数可以是单个值.列表.元组.字典.对于列表和元组,需要用@unpack装饰符把列表和元组解析成多个参数. 使用下面的命令安装ddt库 pip install ddt

Python+Selenium:3种等待设置

1.强制等待—sleep() 设置固定休眠时间,python 的time 包提供了休眠方法sleep() ,导入time 包后就可以使用sleep()进行脚本的执行过程进行休眠.无论浏览器加载是否完成,程序都要等待设定的时间,继续执行下面的代码 import time time.sleep(3) 2.隐式等待—implicitly_wait() implicitly_wait(xx):设置等待时间为xx秒,等待元素加载完成,如果到了时间元素没有加载出,就抛出一个NoSuchElementExce