Selenium - 元素等待

显式等待

  • 显式等待是一种灵活的等待方式,需要声明等待的结束条件,当满足条件时会自动结束等待;

    • 需要引入WebDriverWait包以及exception_conditionswait方法配合ec的until或者until_not

    • 可以实现针对于某一个元素等待,每经过多少秒就查看一次元素是否可见;

      • 如果可见就停止等待;

      • 如果不可见就继续等待直到超过规定的时间后,报超时异常;

  • WebDriverWait:声明需要等待的条件,可以设置为元素显示后;

  • until():直到条件成立返回为真,等待结束。如果超时,抛出TimeoutException,将message传入异常。

  • until_not():直到条件不成立返回为真,是当某元素消失或什么条件不成立则继续执行,等待结束。如果超时,抛出TimeoutException,将message传入异常。

  • expected_conditions:是selenium的一个模块,其中包含一系列可用于判断的条件方法。

# 导入显示等待函数
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('python')
driver.find_element_by_id('su').click() # 设置等待15秒,等待浏览器标题为python_百度搜索,结束等待,继续运行;
WebDriverWait(driver, 15).until(EC.title_is('python_百度搜索')) # 设置等待8秒,等待浏览器标题不为selenium后,结束等待,继续运行;
WebDriverWait(driver, 8).until_bot(EC.title_is('selenium')) print(driver.title)
driver.quit()

EC等待场景

转载:https://blog.csdn.net/kelanmomo/article/details/82886718

介绍

  • EC 全称为 expected_conditions

    • 是Selenium的一个子模块 —— selenium.webdriver.support.expected_conditions

    • 可以对网页上元素是否存在,可点击等等进行判断,一般用于断言或与WebDriverWait配合使用;

  • 引用模块

    from selenium.webdriver.support import expected_conditions as EC

网页信息

# 判断当前页面的titlt完全等于(==)预期字符(区分大小写);
# 若等于则返回True,不等于返回False;
EC.title_is(value) # 判断当前页面的titlt包含预期字符(区分大小写);
# 若包含则返回True,不包含返回False;
EC.title_contains(value) # 判断网页是否为特定网页(必须完全符合),
# 是则返回True,否则返回False
EC.url_to_be(url) # 判断网页地址完全等于(==)预期字符(区分大小写),
# 若等于则返回True,不等于返回False;
EC.url_changes(url) # 判断网址地址是否包含特定文本(区分大小写);
# 若包含则返回True,不包含返回False;
EC.url_contains(url) # 判断网址是否符合特定格式,
# 符合则返回True,不符合则返回False
pattern = r'(https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?' #使用正则表达式,规定网址格式(格使要求以https开头)
EC.url_matches(pattern)

文本判断

# 判断给定文本是否出现在特定元素中;
# 若存在则返回True,不存在返回False;
## locator:定位所有class="wd"的元素
from selenium.webdriver.common.by import BY
locator = (By.CLASS_NAME, "wd")
EC.text_to_be_present_in_element(locator, value) # 判断某文本是否是存在于特定元素的value值中,
# 存在则返回True,不存在则返回False,
## 对于查看没有value值的元素,也会返回False
EC.text_to_be_present_in_element_value(locator, value)

窗口信息

# 判断alert弹窗是否存在;
# 若存在则返回True,不存在返回False;
EC.alert_is_present() # 判断某个frame是否可以切换过去,
# 若可以则切换到该frame,否则返回False
## locator:XPATH="html/body/iframe"的元素
from selenium.webdriver.common.by import BY
locator = (By.XPATH, "html/body/iframe")
EC.frame_to_be_available_and_switch_to_it(locator) # 通过是否增加了句柄数量判断是否打开新窗口,
# 有新窗口则返回True,没有新窗口返回False
current_handles = driver.window_handles
EC.new_window_is_opened(current_handles) # 判断窗口数量是否是特定数值,
# 是该数值则返回True,否则返回False
EC.number_of_windows_to_be(num_windows)

元素状态

# 判断某元祖是否被选中;
# 选中则返回True,未选则返回False;
## locator:定位所有class="wd"的元素
from selenium.webdriver.common.by import BY
locator = (By.CLASS_NAME, "wd")
EC.element_located_to_be_selected(locator) # 判断某元祖是否与预期相同,
# 相同则返回True,不同则返回False
EC.element_located_selection_state_to_be(locator, BOOLE) # 判断某元素是否被选中;
# 选中则返回True,未选则返回False;
element = driver.find_element_by_id('kw')
EC.element_to_be_selected(element) # 判断某元素的选中状态是否与预期相同;
# 相同则返回True,不同则返回False;
EC.element_selection_state_to_be(element, BOOLE) # 判断某元祖是否可访问并且可启用,比如能够点击;
# 若可以则返回元素本身,否则返回False
from selenium.webdriver.common.by import BY
locator = (By.CLASS_NAME, "wd")
EC.element_to_be_clickable(locator) # 判断某个元祖是不是不可访问或者不存在在DOM树中;
# 不存在则返回True,存在则返回False
EC.invisibility_of_element_located(locator)

元素可见

# 判断一个元素存在于页面DOM树中;
# 存在则返回元素本身,不存在则报错。
## locator:定位所有class="wd"的元素
from selenium.webdriver.common.by import BY
locator = (By.CLASS_NAME, "wd")
EC.presence_of_element_located(locator) # 判断定位的元素范围内,至少有一个元素存在于页面当中
# 存在则以list形式返回元素本身,不存在则报错;
EC.presence_of_all_elements_located(locator) # ============================================================= # 判断特定元素是否存在于DOM树中并且可见,可见意为元素的高和宽都大于0;
# 元素存在返回元素本身,否则返回False;
element = driver.find_element_by_id('kw')
EC.visibility_of(element) # 判断特定元素是否存在于DOM树中并且可见,可见意为元素的高和宽都大于0;
# 元素存在返回元素本身,否则返回False;
EC.visibility_of_element_located(locator) # 判断locator定位的所有元素都存在于DOM树中并且可见,可见意为元素高和宽都大于0;
# 存在则以list形式返回元素,否则返回False;
EC.visibility_of_all_elements_located(loccator) # 判断locator定位的所有元素中,至少有一个存在于DOM树中并且可见,可见意为元素高和宽都大于0;
# 存在则以list形式返回存在的元素,一个元素都不存在的情况下返回空list;
EC.visibility_of_any_elements_located(locator)
  • 注:presencevisibility有点相像,区别在于:

    • presence 强调元素存在于DOM树中,可见不可见无所谓;(性能上会稍微快一点点)

    • visibility要求必须高和宽必须都大于0;

Selenium - 元素等待(2) - 显式等待/EC等待的更多相关文章

  1. selenium—隐式等待和显式等待

    一.隐式等待和显式等待的区别 隐式等待:是整个页面的等待.设置一个最长的等待时间,在规定时间内整个页面加载完成,则执行下一步,否则继续等待直到最长等待时间结束. 显式等待:是针对某个元素的等待.在设置 ...

  2. Selenium系列(六) - 强制等待、隐式等待、显式等待

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  3. selenium(5)-解读强制等待,隐式等待,显式等待的区别

    背景 为什么要设置元素等待 因为,目前大多数Web应用程序都是使用Ajax和Javascript开发的:每次加载一个网页,就会加载各种HTML标签.JS文件 但是,加载肯定有加载顺序,大型网站很难说一 ...

  4. Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待

    为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...

  5. selenium的webdriver三种等待方式(显式等待WebDriverWait+implicitly_wait隐式等待+sleep强制等待)

    隐式等待是等页面加载,不是等元素!!! 1.显式等待 一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码.显式等待是等元素加载!!! 2.隐式等待,相当于设置全局的等待,在定位 ...

  6. “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. selenium 隐式等待与显式等待

    1.隐式等待:driver.implicitly_wait() driver = webdriver.Chrome()driver.implicitly_wait(10)     #获取元素时最多会等 ...

  8. Selenium+Java(六)Selenium 强制等待、显式等待、隐实等待

    前言 在实际测试过程中,由于网速或性能方面的原因,打开相应的网页后或在网页上做了相应的操作,网页上的元素可能不会马上加载出来,这个时候需要在定位元素前等待一下,等元素加载出来后再进行定位,根据实际使用 ...

  9. 【亲测显式等待】Selenium:元素等待的4种方法

    Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用.   2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...

  10. 显式等待-----Selenium快速入门(十)

    上一篇说了元素定位过程中的隐式等待,今天我们来探讨一下显示等待.显式等待,其实就是在使用WebDriverWait这个对象,进行等待.显式等待对比隐式等待,多了一些人性化的设置,可以说是更细化的隐式等 ...

随机推荐

  1. 第八次团队作业:Beta冲刺(凡事预则立)

    这个作业属于哪个课程 2018级计算机和综合实验班 这个作业要求在哪里 Beta冲刺要求 这个作业的目标 Beta冲刺 改进完善的功能 完善之前年度报告功能 尽快上线小程序 增加的新功能 小程序打卡功 ...

  2. django+easyui

    django+easyui 快速构建网站 演示地址:http://demo.topjui.com/?from=360tg

  3. linux 查看进程的启动开始时间

    先使用命令查看需要查看的进程 ps -ef | grep java root 29861 13755 2 09:42 pts/0 00:10:48 java -jar XXXX.jar ps axo ...

  4. unlua

    安装 复制 Plugins 目录到你的UE工程根目录. 重新启动你的UE工程 注意点 新建工程后,必须重新拷贝插件,重新编译.不能从老项目中拷贝,会崩溃~ 加载c++类和蓝图类 -- c++类 loc ...

  5. 自己动手从零写桌面操作系统GrapeOS系列教程——13.向MBR中写入程序

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 前面铺垫了这么久,今天终于开始写程序了.本讲将介绍3个逐步深入但非常简单的程序,一方面是让大家熟悉开发流程,另一方面是顺便解决前面遇到的CPU占 ...

  6. PicGo + Gitee(码云)实现markdown图床 (转载)

    https://zhuanlan.zhihu.com/p/102594554 备忘录 我配置图床的时候参考的是这篇文章.我暂时使用的是这种方案. 因为考虑到有的文章要多平台发布,我建议你选择markd ...

  7. 宝塔上部署FastAPI的步骤和一些注意点

    为了运维方便,选择直接用宝塔来管理python fastapi的项目,虽然直接部署可能性能更好更灵活,但是我选择了低层本,每个人的选择可能是不一样的,各有 考虑吧. 本文的大逻辑是先写一个hellow ...

  8. 2020寒假学习笔记12------Python基础语法学习(一)

    代码的组织和缩进 Python 语言直接通过缩进来组织 代码块."缩进"成为了 Python 语法强制的规定.缩进时,几个空格都是允许的,但是数目必须统一.我们通常采用" ...

  9. 别逛了,送你一份2023年Java核心篇JVM(虚拟机)面试题整理

    Java内存区域 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载).Execution engine(执行引擎):两个组件为Ru ...

  10. 垃圾回收之三色标记法(Tri-color Marking)

    关于垃圾回收算法,基本就是那么几种:标记-清除.标记-复制.标记-整理.在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率. 无论使用哪种算法,标记总是必要的 ...