python time智能等待_Python Selenium智能等待

0fc5a570aff3c318d94d4f0312c6c728.png

前言

在使用python selenium进行自动化测试实践的过程中,经常会遇到元素定位不到,弹出框定位不到等等各种定位不到的情况,在大多数的情况下,无非是以下两种情况:

1、有frame存在,定位前,未switch到对应的frame内

2、元素未加载完毕(从界面看已经显示),但DOM树还在load状态或在加载js

那对于这类情况,怎么解决呢?

通俗的讲法: 等待。

高大上点:解决自动化测试代码与浏览器加载渲染之间的同步问题。

下面我们分段讲述各种处理方式:

一 强制等待

这种方式简单粗暴直接有效,不足的地方就是不够灵活。下面看下代码片段:

#_*_ coding:utf-8 _*_

__author__ = '苦叶子'

from selenium import webdriver

from time import sleep   # 注意

if __name__ == '__main__':

driver = webdrivrer.Firefox()

driver.get('http://www.testingunion.com')

sleep(3)    # 强制等待3s在执行下一步

print u"当前url:  ", driver.current

sleep(3)   #强制等待3s在执行下一步

driver.quit()

注: 请注意加粗有删除线的代码行,用于实现强制等待

二、隐性等待

webdriver提供了基础的同步方法,隐性等待implicitly_wait(xx),该方式的意义是:不论业务代码运行在那一步,都需要等待webdriver  xx秒,如果在等待的xx秒内 webdriver完成了对应的动作,则业务代码和webdriver都正常继续执行;如果超过了xx秒,webdriver还未完成对应的动作,则业务代码继续执行,而webdriver则会抛出异常(例如timeout或元素未找到等等异常),请看代码实现片段:

#_*_ coding:utf-8 _*_

__author__ = '苦叶子'

from selenium import webdriver

if __name__ == '__main__':

driver = webdrivrer.Firefox()

driver.implicitly_wait(30)   # 隐性等待,最长等30s

driver.get('http://www.testingunion.com')

print u"当前url: ", driver.current_url

driver.quit()

注:上述代码中加粗删除线的代码通过调用webdriver提供的标准隐性等待方式来实现一种同步机制。其设置的是一个最长等待时间,如果在规定的时间未完成,则进入下一步。

不足:在实践中,通常我们需要操作的元素已经显示出来,但因网络或其他因素,浏览器一直处于加载个别js或图片或其他资源时,隐性等待模式下,这时会依旧处于等待状态直至页面全部加载完毕才能进入下一步。那有没有更好的办法呢?当然是有的,请参见下一方式。

重要:隐性等待是全局性质的,只需在driver实例化后,设置一次即可。

在实践中,经常见到新手把隐性等待当做sleep来使用,在每个步骤后都用一次。

三、显性等待

更为强大的方式是显性等待来实现同步机制,需要WebDriverWait类,辅以until()或until_not()方法,根据判断条件进行灵活的同步,它的主要机制是:程序在规定的时间内每个xx秒看一下判断条件是否成立,如果成立则执行下一步,否则继续等待,直至超过设置的最长时间,然后抛出异常。请看具体的代码片段:

#_*_ coding:utf-8 _*_

__author__ = '苦叶子'

from selenium import webdriver

from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

if __name__ == '__main__':

driver = webdrivrer.Firefox()

# 隐性等待和显性等待可以同时用,要注意的是:最大等待时间取决两者之间的大值

driver.implicitly_wait(10)

driver.get('http://www.testingunion.com')

locator = (By.LINK_TEXT,  u'webdriver')

try:

# 在最长20s内,每个0.5秒去检查locator是否存在,如果存在则进入下一步

WebDriverWait(driver, 20, 0.5).until(EC.presence_of_located(locator))

# 提取该文本对应的url,并打印出来

print driver.find_element_by_link_text(u'webdriver').get_attribute('href')

finally:

print u"异常了"

driver.quit()

在本示例中,我们设置了隐性等待和显性等待,在其他的操作中隐性等待起决定性作用,在示例中的WebDriverWait设置了显性等待的地方,则显性等待起决定性作用,但要注意的是:最长等待时间取决于两者之间的大值,所以这里显性等待的最长时间为20s。

在这里我们主要用到了WebDriverWait类和expected_conditions模块,让我们近距离的接触下它们。

WebDriverWait类

定义实现在wait模块中,实现了webdriver的显性等待机制,先看下它有哪些参数和方法:

selenium.webdriver.support.wait.WebDriverWait(类)

__init__(self,

driver,  # 传入实例化的webdriver对象

timeout,  # 超时时间,等待的最大时间(需考虑同时考虑隐性等待时间)

poll_frequency=POLL_FREQUENCY,  # 调用until或until_not方法的间隔时间,上例为0.5s

ignored_exceptions=None  #指定忽略的异常,如果指定了要忽略的异常类型,则在调用until或until_not过程中,捕获该类异常时不中断代码,继续等待。默认只有NoSuchElementException

)

until(self,

method,    # 在等待期间,每个一段时间调用这个传入的方法,直到返回值为false

message='' # 如果超时,则抛出TimeoutException,将message传入给异常

)

until_not 与until相反,until是当某个元素满足某种条件时(出现、存在等等)继续执行;until_not则是当某个元素不满足某种条件时继续执行,参数含义相同

特别注意:

很多时候大家在使用until或until_not时,会将一个WebElement对象传入给method,如下:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))     # 这是错误的用法

这里的参数一定要是可调用的,这个对象一定要有__call__()方法,否则会抛出异常:

TypeError: 'xxx' object is not callable

在这里,也可以用selenium2提供的expected_conditions模块中提供的各种条件,也可用WebElement中的is_displayed(),is_selected(),is_enabled()方法或是自己封装的方法均可。下面我们再看看selenium提供了哪些条件,如图所示:

0c2a38f9f8ea25e3c525b938d498509b.png

结束语

本文就python selenium三种同步解决方式进行了较为详细的说明,这是使用selenium进行自动化测试实践的必备技能,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python存储对象的数组_Python:在2d数组中存储对象并调用其方法

我正在尝试制作一个象棋应用程序。代码如下:#file containing pieces classesclass Piece(object):name "piece"value 0grid_name "____"class Pawn(Piece):# Rules for pawns.#If first move, then can move forward two spacesname "…

python正则表达式匹配括号并删除_如何使用正则表达式删除括号内的文本?

在括号匹配子串的图案不具有其他(和)字符之间(如(xyz 123)在Text (abc(xyz 123))是\([^()]*\)详细资料:\(-圆括号(请注意,在POSIX BRE中(应使用,请参见sed下面的示例)[^()]*-除否定的字符类别 / POSIX括号表达式中定义的字符以外的零个或多个…

现代软件工程 (备份)

自我介绍一下, 我叫邹欣, 是微软亚洲研究院 创新工程中心 首席研发主管 (Principal Development Manager). 我和同事们一起把研究成果转化为商业软件产品和服务。近期主要专注于垂直搜索,企业搜索,软件开发工具和数字娱乐等领域。 在工作之余, 我也写…

java钱_在Java中如何表示钱Money?

为什么不使用float / double?使用java时会遇到money类型的选择问题,首先想到的是float / double。如果只是简单的货币计算,很难发现用float会有问题。出现问题的原因是使用float / double(已经相应的包装类Float / Double)会出现舍入误差(rou…

期望

把原来一些关于软件工程,教学,和程序设计相关的博客搬过来。 [http://yishan.cc/blogs/xin/archive/2009/04/12/1058.aspx] 学校的期望 我在BBS 看到有人感慨说- 有家长让小孩在大学里专心学习,不要想别的。等到一毕业,就希望小孩…

java 数值变量_Java 中数值变量赋值问题

写了一段判断数值相等判断方法的程序://在-128~127 之外的数Integer i1 200;Integer i2 200;System.out.println("i1i2: "(i1i2));//false// 在-128~127 之内的数Integer i3 100;Integer i4 100;System.out.println("i3i4: "(i3i4));//true…

软件教育随想

[由于工作的关系,我在过去的几年中访问了十二三所软件学院/计算机学院,和不少老师,学生座谈过。我在研究院里也碰到了不少各个学校来的学生,谈得多了,就有下面的随想。] 想来的人来不了 学校里都是按照高考/考研的成绩…

java获取当前电脑的ip_使用Java获取当前计算机的IP地址

问题我正在尝试开发一个系统,其中有不同的节点在不同的系统上或在同一系统上的不同端口上运行。现在所有节点都创建一个Socket,其目标IP作为称为自举节点的特殊节点的IP。然后节点创建自己的ServerSocket并开始侦听连接。引导节点维护一个节点列表&#…

两千块钱带来的 希望

几年以前,我参加过一个全国 “软件学院” 的评审,得到两千块现金和一些希望。我后来把钱和希望都还给同学们了,现在说明一下。 [这是个人回忆,不代表任何组织,也不确保所有信息的完全准确] 我先…

java 内部变量_java 中的内置数据类型

1, 基本数据类型Java是强类型语言, 对于每一种数据都定义了类型,基本数据类型分为数值型,字符型,布尔型。数值型又分为了整型和浮点型。整型又分为byte, int, short long.浮点型又分为了float 和double.字符型是char 类型&#x…

DG导入mysql依赖包_MySql导入导出数据库(含远程导入导出)

1、先运行cmd,cd 到mysql安装目录中的bin文件夹2、mysqldump -u root -p 数据库名 > 导出文件名.sql其他情况下:1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql2.导出一个表m…

java线程的优点_Java使用多线程的优势

Java使用多线程的优势如果使用得当,线程可以有效地降低程序的开发和维护等成本,同时提升复杂应用程序的性能。那么Java使用多线程的优势具体有哪些呢,一起来了解一下!1、发挥多处理器的强大能力现在,多处理器系统正日益盛行&#…

开发软件不是闭卷考试

有人问我这个问题: “你正在做一个项目,这个项目有一项关键的feature需要实现,这个feature有一定的技术难度,你调试了很久,都没找到实现的途径,这时你已经在这个feature上花了很多时间了,而且无…

go语言mysql删除记录_MySQL数据库删除操作-Go语言中文社区

删除数据库DROP DATABASE [IF EXISTS] 数据库名;例如:删除school数据库IF EXISTS 为可选,判断是否存在,如果不存在则会抛出异常删除数据表DROP TABLE [IF EXISTS] 表名;例如:删除student表注意:删除具有主外键关系的表…

java csv下载_java 生成csv文件,弹出下载对话框。。。

1.最直接最简单的,方式是把文件地址直接放到html页面的一个链接中。这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。这个就不写示例了。2.在服务器端把文件转换成输出流,写…

中科大在50年代的教学理念

给中科大的学生上课, 得了解这个学校的教学理念,我从网上找到了一篇: 中国科学技术大学里的基础课中国科学技术大学力学和力学工程系系主任 钱学森中国科学技术大学是为我国培养尖端科学研究技术干部的,因此学生必需在学校里打下将来作研究工作的基础。…

软件工程 团队博客作业 如何评价个人在团队中的绩效

在现实社会中有很多团队合作的项目, 他们是如何评价个人在团队中的绩效呢? 例如下面的情况:•一群人把一堆砖头从A地搬到B地•一个剧组排演话剧•一群队员在职业球队踢球•医生和护士做手术•计算机系的一群老师教课•一群学生做软工项目 (PM, Dev, Test) (这是重点)如何衡量…

java中的位移运算符_java中的移位运算符(, , )

java中有3种移位运算符<>> : 右移运算符&#xff0c;不改变符号位&#xff0c;num >> n 表示二进制右移n位&#xff0c;结果相当于 num / (2的n次方)>>> : 无符号右移&#xff0c;长度扩展为4字节&#xff0c;最高位都为0&#xff0c;但正数扩展位补…

现代软件工程系列 软件 = 程序 + 软件工程

软件随想: 软件 程序 软件工程 最近和几个同道谈论了一些程序&#xff0c;架构&#xff0c;软件的问题&#xff0c;大家身在此山中&#xff0c;绕来绕去&#xff0c;始终没有能有明确清晰的结论。我把一些想法写在这里&#xff0c;供专家指正。 几乎所有程序员都知道“程序…

java 参数代替所有类_Java中的常用类

1 常用类NO13【Int Intergershort Shortbyte Bytedouble Doublefloat FloatBoolean BooleanChar Character】封装类都是引用类型&#xff0c;并且也具有对应基本数据类型的数学运算特征装箱&#xff1a;将基本数据类型的值装进封装类对象中去&#xff0c;也可以…