一、显示等待(有条件等待)

常见问题:

  1. 定位明明是对的,为什么运行代码没找到定位。
  2. 定位明明是对的,找到定位了,文本信息为什么取到是空的?

分析原因:

  1. 没有处理frame
  2. 页面渲染速度比自动化测试的代码慢,页面还没渲染出来就定位了
  3. 异步请求,后端还未返回给前端,自动化测试代码就去获取页面文本数据

一些同学的解决解决方案:

  1. 加上time.sleep()
  2. 设置全局隐式等待,dr.implicitly_wait()

分析解决方案:

  1. 解决方案一,我们不能够确定准确的强制等待时间(代码休眠时间),导致自动化代码不稳定性大大增加,尤其是网络波动的影响,会导致页面加载速度变慢
  2. 全局等待虽可以解决一部分定位问题,例如需要定位的标签属性显现,但是如果像异步请求,需等待带有文本信息的相应,并渲染在页面上,不能确定在自动化代码执行获取文本信息的时候,页面已经渲染好所需要的文本信息

什么是显示等待?

  • 条件满足后,不再等待

二、显示等待相关类

Wait.py

class WebDriverWait(object):
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
"""构造函数,需要一个WebDriver实例并以秒为单位超时
:参数:
- driver - 传入webdriver实例对象
- timeout - 超时时间,单位 秒
- poll_frequency - 程序休眠时间,默认0.5秒
- ignored_exceptions - 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,
则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。 使用例子:
from selenium.webdriver.support.ui import WebDriverWait \n
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) \n
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\ \n
until_not(lambda x: x.find_element_by_id("someId").is_displayed())
""" def until(self, method, message=''):
"""在规定的超时时间内,调用传入的方法,直到返回的结果为真,否则抛出超时的异常"""
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) def until_not(self, method, message=''):
"""与unitl方法相反,不多解释,项目中基本用不到"""
end_time = time.time() + self._timeout
while True:
try:
value = method(self._driver)
if not value:
return value
except self._ignored_exceptions:
return True
time.sleep(self._poll)
if time.time() > end_time:
break
raise TimeoutException(message)

expected_conditions.py

常用

每个类的具体用法查看源码,写的非常清楚

/Python/Python36/Lib/site-packages/selenium/webdriver/support

# 判断页面title等于预期值
title_is # 判断页面title包含预期字符串
title_contains # 判断当前url等于预期url
url_to_be # 判断当前url包含预期字符串
url_matches # 正则匹配 re
url_contains # 包含 in # 判断当前url不等于预期url
url_changes # 判断元素显现并定位成功
visibility_of_element_located # 判断元素显现(不一定能定位,能定位的元素大小需大于0)
visibility_of # 判断获取文本信息包含预期的文本信息
text_to_be_present_in_element # 判断获取属性值的信息包含预期的文本信息
text_to_be_present_in_element_value # 判断iframe可以切换,如果为真则切换,反之返回False
frame_to_be_available_and_switch_to_it # 判断元素可以点击
element_to_be_clickable # 判断元素被选中
element_to_be_selected
element_located_to_be_selected # 判断窗口数量
number_of_windows_to_be # 判断新窗口打开
number_of_windows_to_be # 警告框显现
alert_is_present

不常用

presence_of_element_located
presence_of_all_elements_located
visibility_of_any_elements_located
visibility_of_all_elements_located
invisibility_of_element_located
invisibility_of_element(invisibility_of_element_located)
staleness_of
element_selection_state_to_be
element_located_selection_state_to_be

三、显示等待使用

demo.py

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome()
driver.get('https://www.baidu.com') # 输入框定位器
locator_of_search = (By.CSS_SELECTOR,'#kw') # 元素显现并定位成功后,不再等待,反则抛出超时异常
WebDriverWait(driver=driver,timeout=10,poll_frequency=0.5).until(EC.visibility_of_element_located(locator_of_search))
driver.find_element(*locator_of_search).send_keys('测试显示等待')

Selenium(七):截图显示等待的更多相关文章

  1. UI自动化学习笔记- Selenium元素等待(强制等待、显示等待、隐式等待)

    一.元素等待 1. 元素等待 1.1 什么是元素等待 概念:在定位页面元素时如果未找到,会在指定时间内一直等待的过程 意思就是:等待指定元素已被加载出来之后,我们才去定位该元素,就不会出现定位失败的现 ...

  2. Selenium中三种等待的使用方式---规避网络延迟、代码不稳定问题

    在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果你不做任何处理的话,代码会由于没有找到元素,而报错.这时我们就要用到wait(等待),而在Selenium中,我们可以用到一共三种等待, ...

  3. python selenium基于显示等待封装的一些常用方法

    import os import time from PIL import Image from selenium import webdriver from appium import webdri ...

  4. selenium显示等待解决浏览器未加载完成查找控件的问题

    问题描述:wap版支付成功后,跳转到支付成功页,查找的元素已出现,如图的:元素1,元素2,但是提示查找的元素超时,失败,并且每到这个页面都会报页面超时,不能查找到页面元素 原始代码: try{ op. ...

  5. [selenium webdriver Java]显示的等待同步

    显示等待可以在执行下一次操作时,自定义等待条件 显示的等待只需要执行在需要同步的地方而不影响脚本的其他地方 Selenium WebDriver提供了WebDriverWait和ExpectedCon ...

  6. Selenium+Java显示等待和隐式等待

    描述:用来操作界面上的等待时间,显示等待是等待某一条件满足,条件满足后进行后面的操作:隐式等待是给出一个等待时间,在时间到达之前若满足条件,则立即执行后续操作. public class TestSe ...

  7. selenium中隐式等待和显示等待的区别

    Selenium显示等待和隐式等待的区别1.selenium的显示等待原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久 ...

  8. Selenium 定位元素原理,基本API,显示等待,隐式等待,重试机制等等

    Selenium  如何定位动态元素: 测试的时候会遇到元素每次变动的情况,例如: <div id="btn-attention_2030295">...</di ...

  9. selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python

    我们在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中 ...

随机推荐

  1. freemarker<三>

    前两篇博客介绍了freemaker是什么以及简单的语法规则,下面我们通过实现一个demo来看在实际应用中如何使用freemaker,本篇博客主要介绍freemaker与spring的整合. 需要的Ja ...

  2. flutter 安装环境 Mac

    1.这是我第二次mac 安装 flutter环境了,但是这种东西记不住.打开写一下 有用的东西 一. ls vi 等命令 command not found原因是因为环境变量的问题,编辑profile ...

  3. 浅谈月薪3万 iOS程序员 的职业规划与成长!(进阶篇)

    前言: 干了这么多年的iOS,虽然接触了许多七七八八的东西.技术,但是感觉本身iOS却没有什么质的飞越,可能跟自己接触的项目深度有关,于是决定在学习其他技术的同时,加强自己在iOS方面的学习,提高自己 ...

  4. Oracle 11g静默安装

    1.检查安装包 安装依赖包 yum -y install gcc make binutils gcc-c++ compat-libstdc++-33 elfutils-libelf-devel elf ...

  5. ELK学习实验001:Elastic Stack简介

    1 背景介绍 在我们日常生活中,我们经常需要回顾以前发生的一些事情:或者,当出现了一些问题的时候,可以从某些地方去查找原因,寻找发生问题的痕迹.无可避免需要用到文字的.图像的等等不同形式的记录.用计算 ...

  6. 闯荡Linux帝国:nginx的创业故事

    前情回顾: NextStep帝国推出的web服务,迅速风靡比特宇宙,各星系帝国均蠢蠢欲动,想在这一波浪潮中掘一桶金. 详情参见:万维网的诞生 初出茅庐 小马哥和他的小伙伴小黑.大黄来到陌生的Linux ...

  7. MySQL 核心三剑客 —— 索引、锁、事务

    一.常见存储引擎 1.1 InnoDB InnoDB 是 MySQL 5.5 之后默认的存储引擎,它具有高可靠.高性能的特点,主要具备以下优势: DML 操作完全遵循 ACID 模型,支持事务,支持崩 ...

  8. 第 426 期 Python 周刊

    文章,教程和讲座 端到端机器学习:从数据收集到模型部署 链接: https://ahmedbesbes.com/end-to-end-ml.html 在本文中,我们将完成构建和部署机器学习应用程序的必 ...

  9. 公子奇带你一步一步了解Java8中Lambda表达式

    在上一篇<公子奇带你一步一步了解Java8中行为参数化>中,我们演示到最后将匿名实现简写为 (Police police) -> "浙江".equals(poli ...

  10. 解决apt-get命令出现的安装源错误

    首先linux环境下打开网页,输入上网账号密码,确保已经联网 直接安装软件或库的时候,在管理员模式下,在终端输入:apt-get install A可以自动安装A 有时会出现下面的安装源错误 这是因为 ...