selenium之python源码解读-WebDriverWait
一、显示等待
所谓显示等待,是针对某一个特定的元素设置等待时间,如果在规定的时间内找到了该元素,就执行相关的操作,如果在规定的时间内没有找到该元素,在抛出异常
PS:注意显示等待和隐身等待的区别,隐身等待是对页面中的所有元素设置加载时间。
二、WebDriverWait类
在selenium框架中显示等待是通过WebDriverWait来实现的
WebDriverWait所在位置:在support包的wait.py文件中,selenium\webdriver\support\wait.py
构成函数:
class WebDriverWait(object):
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
pass
构造函数参数解读:
driver:webdriver实例,可以是Ie, Firefox, Chrome or Remote
timeout:查找特定元素时的最大超时时间,单位seconds
poll_frequency:关键字参数,查找元素的频率,即每隔多少时间回调一次method,默认为 0.5 second
ignored_exceptions:关键字参数,在回调method过程中忽略哪些异常,默认为NoSuchElementException,如果有需要忽略多个异常,可以以iterable的形式传入参数,如tuple 实例方法:
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:循环调用method的方法,直到method返回true()非false,返回结果:method方法返回的结果
until_not:循环调用method的方法,直到method返回false
在这两个方法中,参数methon是必传参数,且传入的是一个functhon对象(注意是函数对象,不带括号的),该method对象的参数是driver
def until(self, method, message=''):
screen = None
stacktrace = None # 设置超时时间
end_time = time.time() + self._timeout
while True: # 循环调用method方法
try:
# 执行传入的methon方法,且参数为driver
value = method(self._driver)
if value: # 如果method方法执行的结果为非false,则停止循环
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, 'screen', None)
stacktrace = getattr(exc, 'stacktrace', None)
time.sleep(self._poll)
if time.time() > end_time:# 如果循环时间超过设置的超时时间,退出需要
break
raise TimeoutException(message, screen, stacktrace)
举个例子:
from selenium.webdriver.support.ui import WebDriverWait # 导入WebDriverWait
# method:参数为driver的lambda匿名函数
# 功能:找到id为someId的元素
# 返回值:x.find_element_by_id("someId")的WebElement对象
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))
总结:
until / until_not方法
参数:method对象(注意是对象,而非调用方法),可以传入lambda匿名函数
method方法的参数为driver
selenium之python源码解读-WebDriverWait的更多相关文章
- selenium之python源码解读-expected_conditions
一.expected_conditions 之前在 selenium之python源码解读-WebDriverWait 中说到,until方法中method参数,需要传入一个function对象,如果 ...
- selenium之python源码解读-webdriver继承关系
一.webdriver继承关系 在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\re ...
- 如何判断一个Http Message的结束——python源码解读
HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1. HTTP协议约定status ...
- python 源码解读2
http://www.jianshu.com/users/4d4a2f26740b/latest_articles http://blog.csdn.net/ssjhust123/article/ca ...
- Apache Beam WordCount编程实战及源码解读
概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流 ...
- 基于Docker的TensorFlow机器学习框架搭建和实例源码解读
概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...
- Spark学习之路 (十六)SparkCore的源码解读(二)spark-submit提交脚本
一.概述 上一篇主要是介绍了spark启动的一些脚本,这篇主要分析一下Spark源码中提交任务脚本的处理逻辑,从spark-submit一步步深入进去看看任务提交的整体流程,首先看一下整体的流程概要图 ...
- ansible源码解读
Ansible源码获取 Ansible Github:https://github.com/ansible Ansible目录结构 $ tree -L 2 ansible-2.0.0.0 ansibl ...
- DRF(1) - REST、DRF(View源码解读、APIView源码解读)
一.REST 1.什么是编程? 数据结构和算法的结合. 2.什么是REST? 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下: /books/ /get_all_books/ 访问所 ...
随机推荐
- [VS] - 手工打开 WCF 客户端调试工具
操作步骤 1. 在开始菜单中找到 Visual Studio 命令行工具 2. 输入命令 wcftestclient 即可打开 WCF 客户端测试工具 参考资料http://www.cnblogs.c ...
- [VS] - EntityFrameworkCore 2.0 安装失败 之解决
背景 在 Visual Studio 2017 中,使用 Nuget 包管理器安装 EntityFrameworkCore 2.0 失败.切换至程序包控制器管理台,查看 Error Message: ...
- 用selenium控制已打开的浏览器
在使用selenium进行自动化测试会遇到,手工打开浏览器,做了一部分操作后,并打开相关页面后再执行相关的自动化脚本. 如何使用selenium来接管先前已打开的浏览器呢?醍提出一个Google Ch ...
- Redis客户端、服务端的安装以及命令操作
目的: redis简介 redis服务端安装 redis客户端安装 redis相关命令操作 redis简介 官网下载(https://redis.io/) Redis 是完全开源免费的,遵守BSD协议 ...
- (转)FFmpeg架构之I/O模块分析
注意:这篇转载的文章比较早,写得很清晰,但是新版的ffmpeg的很多数据结构的名字已经改了.因此只能作参考.(例如ByteIOContext已经改名为AVIOContext) 1概述 ffmpeg项目 ...
- Spring Cloud Alibaba学习笔记(7) - Sentinel规则持久化及生产环境使用
Sentinel 控制台 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则.sentinel-core 提供 API 和扩展接口来接收信息.开发者需要根据自己的环境,选取一个可靠的推送规则方 ...
- Python之Flask
一.Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 .Flask使用 BSD 授权. Flask是一个轻 ...
- Ubuntu install android studio
Ubuntu install android studio 1. 安装 openjdk8,并在配置文件 /etc/profile 中,追加如下内容: sudo aptitude install ope ...
- 大学毕业时成都SAP和深圳腾讯的Offer,我是怎么选择的
2006年校园招聘,我拿到了SAP成都研究院和深圳腾讯的offer,而我最后选择了前者. 当时我主要是基于以下四点考虑. SAP成都有最优秀的人才 2006年SAP成都研究院刚刚成立,对人才的挑选非常 ...
- KVM虚拟化——简介
KVM 基于内核的虚拟机KVM(Kernel-Based Virtual Machine)是2007年问世的开源虚拟化解决方案.KVM需要两个条件: ①硬件支持全虚拟化 ②操作系统为Linux KVM ...