一、显示等待

所谓显示等待,是针对某一个特定的元素设置等待时间,如果在规定的时间内找到了该元素,就执行相关的操作,如果在规定的时间内没有找到该元素,在抛出异常

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的更多相关文章

  1. selenium之python源码解读-expected_conditions

    一.expected_conditions 之前在 selenium之python源码解读-WebDriverWait 中说到,until方法中method参数,需要传入一个function对象,如果 ...

  2. selenium之python源码解读-webdriver继承关系

    一.webdriver继承关系 在selenium中,无论是常用的Firefox Driver 还是Chrome Driver和Ie Drive,他们都继承至selenium\webdriver\re ...

  3. 如何判断一个Http Message的结束——python源码解读

    HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1.      HTTP协议约定status ...

  4. python 源码解读2

    http://www.jianshu.com/users/4d4a2f26740b/latest_articles http://blog.csdn.net/ssjhust123/article/ca ...

  5. Apache Beam WordCount编程实战及源码解读

    概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流 ...

  6. 基于Docker的TensorFlow机器学习框架搭建和实例源码解读

    概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...

  7. Spark学习之路 (十六)SparkCore的源码解读(二)spark-submit提交脚本

    一.概述 上一篇主要是介绍了spark启动的一些脚本,这篇主要分析一下Spark源码中提交任务脚本的处理逻辑,从spark-submit一步步深入进去看看任务提交的整体流程,首先看一下整体的流程概要图 ...

  8. ansible源码解读

    Ansible源码获取 Ansible Github:https://github.com/ansible Ansible目录结构 $ tree -L 2 ansible-2.0.0.0 ansibl ...

  9. DRF(1) - REST、DRF(View源码解读、APIView源码解读)

    一.REST 1.什么是编程? 数据结构和算法的结合. 2.什么是REST? 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下: /books/ /get_all_books/ 访问所 ...

随机推荐

  1. [VS] - 手工打开 WCF 客户端调试工具

    操作步骤 1. 在开始菜单中找到 Visual Studio 命令行工具 2. 输入命令 wcftestclient 即可打开 WCF 客户端测试工具 参考资料http://www.cnblogs.c ...

  2. [VS] - EntityFrameworkCore 2.0 安装失败 之解决

    背景 在 Visual Studio 2017 中,使用 Nuget 包管理器安装 EntityFrameworkCore 2.0 失败.切换至程序包控制器管理台,查看 Error Message: ...

  3. 用selenium控制已打开的浏览器

    在使用selenium进行自动化测试会遇到,手工打开浏览器,做了一部分操作后,并打开相关页面后再执行相关的自动化脚本. 如何使用selenium来接管先前已打开的浏览器呢?醍提出一个Google Ch ...

  4. Redis客户端、服务端的安装以及命令操作

    目的: redis简介 redis服务端安装 redis客户端安装 redis相关命令操作 redis简介 官网下载(https://redis.io/) Redis 是完全开源免费的,遵守BSD协议 ...

  5. (转)FFmpeg架构之I/O模块分析

    注意:这篇转载的文章比较早,写得很清晰,但是新版的ffmpeg的很多数据结构的名字已经改了.因此只能作参考.(例如ByteIOContext已经改名为AVIOContext) 1概述 ffmpeg项目 ...

  6. Spring Cloud Alibaba学习笔记(7) - Sentinel规则持久化及生产环境使用

    Sentinel 控制台 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则.sentinel-core 提供 API 和扩展接口来接收信息.开发者需要根据自己的环境,选取一个可靠的推送规则方 ...

  7. Python之Flask

    一.Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 .Flask使用 BSD 授权. Flask是一个轻 ...

  8. Ubuntu install android studio

    Ubuntu install android studio 1. 安装 openjdk8,并在配置文件 /etc/profile 中,追加如下内容: sudo aptitude install ope ...

  9. 大学毕业时成都SAP和深圳腾讯的Offer,我是怎么选择的

    2006年校园招聘,我拿到了SAP成都研究院和深圳腾讯的offer,而我最后选择了前者. 当时我主要是基于以下四点考虑. SAP成都有最优秀的人才 2006年SAP成都研究院刚刚成立,对人才的挑选非常 ...

  10. KVM虚拟化——简介

    KVM 基于内核的虚拟机KVM(Kernel-Based Virtual Machine)是2007年问世的开源虚拟化解决方案.KVM需要两个条件: ①硬件支持全虚拟化 ②操作系统为Linux KVM ...