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 ...
随机推荐
- IDEA配置连接(自建Maven仓库)私服并打包上传
maven的setting.xml文件配置 在servers标签里配置 <server> <id>privete_maven</id> <!--账号密码需要与 ...
- Xshell连接Ubuntu服务器连接不上 显示拒绝了密码
确保下方两个都安装了 sudo apt-get install openssh-server sudo apt-get install ssh 修改 vim /etc/ssh/sshd_config ...
- ffmpeg、数字音频教程、JUCE、std::tuple
下载网易云音乐的视频 https://yunyinyue.iiilab.com/ 模板教程: https://github.com/wuye9036/CppTemplateTutorial/blob/ ...
- 【LeetCode】243. Shortest Word Distance 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcode ...
- 【九度OJ】题目1137:浮点数加法 解题报告
[九度OJ]题目1137:浮点数加法 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1137 题目描述: 求2个浮点数相加的 ...
- 【LeetCode】149. Max Points on a Line 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典+最大公约数 日期 题目地址:https://l ...
- 牛客练习赛44 B:小y的线段
链接:https://ac.nowcoder.com/acm/contest/634/B 来源:牛客网 题目描述 给出\(n\)条线段,第\(i\)条线段的长度为\(a_i\),每次可以从第\(i\) ...
- Linq和Lambda 性能对比
Linq和Lambda 性能对比 1.Where() 使用LINQ创建一个简单的where查询 var query = from person in PersonCollection where pe ...
- MA8601升级版 PL2586|USB HUB 工控级芯片方案PL2586|可直接替代FE1.1S芯片方案
MA8601升级版 PL2586|USB HUB 工控级芯片方案PL2586|可直接替代FE1.1S芯片方案 旺玖在2022年新推出的一款USB HUB 芯片其性能和参数可以完全替代FE1.1S,是M ...
- MySQL测试题——开发公司人事管理系统,包括 Employee表 和 Department表
一.需求分析 我们的开发团队,计划开发一款公司人事管理软件,用于帮助中小型企业进行更加高效的人事管理.现在需要对数据库部分进行设计和开发,根据对需求和立项的分析,我们确定该数据库中最核心的两个表为员工 ...