presence_of_element_located对比visibility_of_element_located
presence_of_element_located和visibility_of_element_located都是selenium里判断元素展示的方法,相信做ui自动化的小伙伴一定被这俩困扰过,本期做了一个方法测试。
结论
先说结论:
- presence_of_element_located: 是否加载到dom树
- visibility_of_element_located:是否加载到dom树且长宽大于0。
说明:
- visibility_of_element_located为判断是否"可见",可见还是不可见并不是以人眼为标准,而是页面层级里是否有,包括被遮罩的层级,可以理解为加载到dom树且长宽大于0。
- presence_of_element_located的校验程度轻一些,在页面跳转之后判断某种标志是否出现用这个快一些;特殊情况下校验无边框的元素也会用到这个。
源码查看
不少小伙伴为一探究竟,看源码怎么写的,源码里调了js,也看不出个所以然,所以还得实际测试一下。。。
测试两个方法
测试中选择了一个可见元素,一个部分可见元素,一个隐藏(人眼看不到,被遮住)的元素进行测试。
而 百度翻译 网站刚好满足这样的场景。
选择弹窗为可见的元素,搜索框为部分可见的元素,后面按钮为看不见的元素。
下面通过代码验证:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec bs = webdriver.Chrome()
bs.get("https://fanyi.baidu.com/#zh/en/%E4%BD%93%E9%AD%84%2C%E6%8A%80%E6%9C%AF%2C%E8%8B%B1%E8%AF%AD") 弹窗 = '//span[@class="app-guide-close"]'
半可见的输入框 = '//textarea[@id="baidu_translate_input"]'
被遮住的按钮 = '//span[@class="op-check"]' # 弹窗:完全展示
try:
x1 = WebDriverWait(bs, 3).until(
ec.presence_of_element_located((By.XPATH, 弹窗)))
print("弹窗加载到dom: ", x1)
x1.click()
except TimeoutException:
print("弹窗没加载到dom:") try:
x1 = WebDriverWait(bs, 3).until(
ec.visibility_of_element_located((By.XPATH, 弹窗)))
print("弹窗可见: ", x1) # 确实可见
x1.click()
except TimeoutException:
print("弹窗没加载到dom:") # 输入框:展示了一半。本来就加载至dom了,只需测试visibility_of_element_located
try:
x2 = WebDriverWait(bs, 3).until(
ec.visibility_of_element_located((By.XPATH, 半可见的输入框)))
print("输入框可见: ", x2) # 此时输入框被遮住了但还是显示可见。由此得知,可见还是不可见并不是以人眼为标准,而是以层级里的元素是否展示了为准。
x2.click()
x2.send_keys("你好世界")
except (TimeoutException, ElementClickInterceptedException):
print("输入框不可见或被遮住了,或不可点击") # 对照按钮:根本看不到。本来就加载至dom了,只需测试visibility_of_element_located
try:
x2 = WebDriverWait(bs, 10).until(
ec.visibility_of_element_located((By.XPATH, 被遮住的按钮)))
print("隐藏按钮可见: ", x2) # 完全遮住的元素还是可见的,说明上面推断正确。结论在下方。
x2.click()
except (TimeoutException, ElementClickInterceptedException):
print("隐藏按钮不可见或被遮住了,或不可点击") """
结论:
1:presence_of_element_located: 是否加载到dom树
2:visibility_of_element_located:是否"可见",可见还是不可见并不是以人眼为标准,加载到dom树且长宽大于0。
ui自动化中操作的元素一般都是有长宽的,所以绝大大部分情况下,用2更好。
presence_of_element_located的校验程度轻一些,在页面跳转之后判断某种标志是否出现用这个快一些;特殊情况下校验无边框的元素也会用到这个。
"""
通过测试,证实了结论中的猜想。仔细想想这也很符合逻辑,如果调整一下窗口大小、或者分辨率从而隐藏了元素,从而人眼看不到,如果这种情况下程序也知道你看不到,那么这个程序至少和浏览器外部环境交互了,显然是不可能也很没有必要的。
最后再次说一下结论:
- presence_of_element_located: 是否加载到dom树
- visibility_of_element_located:是否加载到dom树且长宽大于0。
- visibility_of_element_located为判断是否"可见",可见还是不可见并不是以人眼为标准,而是页面层级里是否有,包括被遮罩的层级,可以理解为加载到dom树且长宽大于0。
- presence_of_element_located的校验程度轻一些,在页面跳转之后判断某种标志是否出现用这个快一些;特殊情况下校验无边框的元素也会用到这个。
presence_of_element_located对比visibility_of_element_located的更多相关文章
- selenium python presence_of_element_located vs visibility_of_element_located
背景: 用WebDriverWait时,一开始用的是presence_of_element_located,我对它的想法就是他就是用来等待元素出现.结果屡屡出问题.元素默认是隐藏的,导致等待过早的就结 ...
- presence_of_element_located与visibility_of_element_located区别
selenium 问题:加了显性等待后,操作元素依然出错 背景: 用WebDriverWait时,一开始用的是presence_of_element_located,我对它的想法就是他就是用来等待 ...
- Selenium与PhantomJS【转】
爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... Day 1 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpCli ...
- Ignite性能测试以及对redis的对比
测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- [原] KVM 环境下MySQL性能对比
KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...
- arcgis api for js入门开发系列六地图分屏对比(含源代码)
上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...
- 嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
- C#跨平台手机应用开发工具Xamarin尝试 与Eclipse简单对比
Xamarin 支持使用C#开发基于Android.IOS.WindowsPhone应用开发,最大特点C#+跨平台,详细说明问度娘. 安装 研究 想体验研究的点击查看页面 Xamarin For Vi ...
随机推荐
- win10+vs2015编译nanogui
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 说明: A.OS : win10 1909 ,没有配置OpenGL开发环境的 经历. B. ...
- 【LeetCode】118. Pascal's Triangle 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 [LeetCo ...
- 【LeetCode】952. Largest Component Size by Common Factor 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 并查集 日期 题目地址:https://leetco ...
- 【LeetCode】689. Maximum Sum of 3 Non-Overlapping Subarrays 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/maximum- ...
- 【LeetCode】672. Bulb Switcher II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- A. Watchmen(Codeforces 650A)
A. Watchmen time limit per test 3 seconds memory limit per test 256 megabytes input standard input o ...
- 『学了就忘』vim编辑器基础 — 96、末行模式中的相关命令
目录 1.在文档中显示行号 2.是否显示文档内容相关颜色 3.是否将查找的字符串高亮显示 4.是否显示右下角的状态栏 5.是否在左下角显示如"--INSERT--"之类的状态栏 6 ...
- Netty源码分析之ByteBuf引用计数
引用计数是一种常用的内存管理机制,是指将资源的被引用次数保存起来,当被引用次数变为零时就将其释放的过程.Netty在4.x版本开始使用引用计数机制进行部分对象的管理,其实现思路并不是特别复杂,它主要涉 ...
- Adversarial Training with Rectified Rejection
目录 概 主要内容 rejection 实际使用 代码 Pang T., Zhang H., He D., Dong Y., Su H., Chen W., Zhu J., Liu T. Advers ...
- [opencv]计算多边形逼近曲线的长度
//利用曲线逼近,计算逼近曲线的长度 //首先创建一个逼近曲线 vector<Point2f> approx; approxPolyDP(contours[i], approx, 2, t ...