关于显示等待WebDriverWait是什么,可以看selenium-wait源码解析

话不多说,先上实现代码:

第一种实现方式(官方提供):

from selenium.webdriver.support.wait import WebDriverWait

element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))

第二种实现方式(民间高手提供):

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'kw')))

一.第一种实现方式分析:

首先介绍下需要用到的lambda表达式:

f= lambda x:x+1

print(f(1))

输出:

2

可理解为:

def f(x):

return x+1

了解了这个之后,我们来看下until是如何执行的:

def until(self, method, message=''):

"""Calls the method provided with the driver as an argument until the \

return value is not False."""

screen = None

stacktrace = None

end_time = time.time() + self._timeout

while True:

try:

value = method(self._driver)

if value:

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)

通过value = method(self._driver)这行,我们可以理解为,我们先通过lambda表达式,定义了一个匿名函数,而入口的传参,正是driver

等价于:

driver.find_element_by_id("someId")

执行后返回一个webelement对象,供我们后续操作

二.第二种实现方式分析:

这里讲两个会引入的文件,expected_conditions.py和by.py

expected_conditions:封装了一些预期结果,通常用来测试

By:支持定位的策略集

我们看下我们引入的EC文件中的presence_of_element_located类:

class presence_of_element_located(object):

""" An expectation for checking that an element is present on the DOM

of a page. This does not necessarily mean that the element is visible.

locator - used to find the element

returns the WebElement once it is located

"""

def __init__(self, locator):

self.locator = locator

def __call__(self, driver):

return _find_element(driver, self.locator)

这俩简单介绍下两种魔法方法的特性:

__init__:初始化时自动载入

__call__:允许类的实例像函数一样被调用

我们debug一下这种方式的执行步骤可以发现:

初始化完成后,until会借助value = method(self.driver),利用我们前面所讲的魔法方法__call_,把presence_of_element_located类当作实例,传递driver对象,调用 _find_element

再看_find_element:

def _find_element(driver, by):

"""Looks up an element. Logs and re-raises ``WebDriverException``

if thrown."""

try:

return driver.find_element(*by)

except NoSuchElementException as e:

raise e

except WebDriverException as e:

raise e

会继续调用driver.find_element,

看下此时_find_element的入参:

driver:method给的driver,也就是WebDriverWait初始化时,我们自己传入的

by:这里可以看到,下面find_element(*by)是*by,所以他可以接收多个参数放到一个数组中,本质是一个tuple

接着看下by入参的是什么:在最开始EC.presence_of_element_located初始化时,locator入参为:(By.ID, ‘kw’),因为是通过__call__执行的,所以现在by的入参是通过locator传入的也是(By.ID, ‘kw’)(到这里发现调用了By类,所以也需要引入此文件)

再往下运行,就到了调用driver.find_element(*by),后续就是正常执行流程了,他会进入到webdriver.py的执行逻辑中selenium-webdriver源码解析

执行后也返回一个webelement对象,供我们后续操作

写在最后:

两种执行方式比较之后,如何选择还请各位小伙伴自行判断~

原文链接:https://blog.csdn.net/m0_37623792/article/details/105124205

python wait until_荐selenium显示等待怎么写之WebDriverWait中until的两种实现方式及原理分析...相关推荐

  1. Selenium显示等待和隐式等待

    在调试代码的时候经常会遇到,selenium元素定位有时有效有时无效,先比较下 Selenium显示等待和隐式等待的区别 1.selenium的显示等待 原理:显示等待,就是明确的要等到某个元素的出现 ...

  2. python多分类混淆矩阵代码_深度学习自学记录(3)——两种多分类混淆矩阵的Python实现(含代码)...

    深度学习自学记录(3)--两种多分类混淆矩阵的Python实现(含代码),矩阵,样本,模型,类别,真实 深度学习自学记录(3)--两种多分类混淆矩阵的Python实现(含代码) 深度学习自学记录(3) ...

  3. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  4. 多线程python实现方式_python多线程的两种实现方式(代码教程)

    本篇文章给大家带来的内容是关于python多线程的两种实现方式(代码教程),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 线程是轻量级的进程,进程中可划分出多个线程,线程可独立的调度 ...

  5. VC++等待光标的两种实现方式

    VC++等待光标的两种实现方式 有时候在做烦琐的工作时,希望鼠标处于忙状态,有两种简单的方法来实现: 1. 采用ApI函数,大多数采用此方法: BeginWaitCursor(); .....处理.. ...

  6. html中img显示图片的两种常用方式

    html中img显示图片的两种常用方式 显示图片,尤其是二维码的时候,大都是自动生成的,所以就需要能够从后台返回字符串,前台浏览器进行解析.好了,下面是这两种方式. 1. <img src=&q ...

  7. python支持的编程方式包括,python的两种编程方式是什么

    一.交互式编程 什么是交互式编程,就是在命令行中输入python 命令即可启动交互式编程,提示窗口如下: 而且还用了Python3的print方法打印出一串字符串. 二.脚本式编程 通过脚本参数调用解 ...

  8. python定义字符串变量有两种常用方式_Python 1基础语法二(标识符、关键字、变量和字符串)...

    一.标识符 标识符就是程序员自己命名的变量名.名字需要有见名知义的效果,不要随意起名 :比如 a=1 a是个变量,a这个变量名属于标识符 1 company = '小米 2 employeeNum = ...

  9. python的两种退出方式

    os._exit() vs sys.exit() 转自: http://www.cnblogs.com/gaott/archive/2013/04/12/3016355.html 概述 python的 ...

最新文章

  1. angular-创建自定义的指令
  2. Java程序员应该知道的10个调试技巧
  3. python的子子孙孙(变种编程语言)
  4. 使用“using” 的 “Cursor”
  5. Win10无法使用小娜搜索本地应用问题的解决方案
  6. java swing 实现下拉列表点击事件
  7. How MapReduce Works
  8. 博途中用的是c吗_博图WINCC里如何添加c脚本
  9. 人工智能将为维护网络安全带来更多可能
  10. 一天一小段js代码(no.4)
  11. 程序员相亲图鉴,太真实了!
  12. 微信小程序中如何使用阿里云iconfont图标
  13. 随机抽奖 php,php随机抽奖
  14. leetcode链表总结
  15. Win 10 + Ubuntu 18.04双系统 卸载Ubuntu
  16. 米家小相机最新固件_不到1000元的米家小相机 都有哪些缺点
  17. 互信息配准matlab,基于图像特征和互信息的图像配准方法
  18. 通讯录的实现(C语言)
  19. 广电为什么禁止投屏_广电的机顶盒怎么投屏
  20. 猴子选大王(c语言)

热门文章

  1. java二级级联_java二级联动实现问题
  2. JavaScript游戏战舰世界的改进
  3. java邮箱发送_java邮箱发送报错
  4. OPPO伸缩屏手机曝光,可长可短,科幻感十足!
  5. iOS应用层架构之CDD
  6. 如何关闭android bt配对窗口,Android 连接SSID隐藏网络以及 LEAP 认证的方法
  7. 【 安信可海思Hi-12F模组】AT指令入门教程 接入鸿蒙智联
  8. 软件开发的形式化方法(Formal Method)之前世今生~
  9. Oracle dg 不能同步原因分析(ORA-1092 : opitsk aborting process)
  10. 什么是框架?框架的作用是什么?为什么要学习框架?