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的更多相关文章

  1. selenium python presence_of_element_located vs visibility_of_element_located

    背景: 用WebDriverWait时,一开始用的是presence_of_element_located,我对它的想法就是他就是用来等待元素出现.结果屡屡出问题.元素默认是隐藏的,导致等待过早的就结 ...

  2. presence_of_element_located与visibility_of_element_located区别

    selenium 问题:加了显性等待后,操作元素依然出错   背景: 用WebDriverWait时,一开始用的是presence_of_element_located,我对它的想法就是他就是用来等待 ...

  3. Selenium与PhantomJS【转】

    爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... Day 1 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpCli ...

  4. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  5. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  6. [原] KVM 环境下MySQL性能对比

    KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...

  7. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

  8. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  9. C#跨平台手机应用开发工具Xamarin尝试 与Eclipse简单对比

    Xamarin 支持使用C#开发基于Android.IOS.WindowsPhone应用开发,最大特点C#+跨平台,详细说明问度娘. 安装 研究 想体验研究的点击查看页面 Xamarin For Vi ...

随机推荐

  1. Windows 数据盘自动分区脚本

    在CMD命令文本下执行,即可: diskpart //1.进入diskpart模式 list disk //2.查询磁盘 select disk 1 //3.选择磁盘 create partition ...

  2. echarts map 地图在react项目中的使用

    需求 展示海南省地图,点击市高亮展示,并在右侧展示对应市的相关数据. 准备工作 Echarts 海南地图json 效果图 代码 index.tsx import React, { useRef, us ...

  3. vc mfc listctrl使用虚拟列表 虚拟列表用法

    note 虚拟列表可有效加载大量数据 需要处理listctrl的 LVN_GETDISPINFO 消息 使用虚拟列表 不能 使用 insert的方法插入数据,而是告诉listctrl 当前要显示多少行 ...

  4. 【LeetCode】758. Bold Words in String 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...

  5. 【LeetCode】872. Leaf-Similar Trees 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 中序遍历 先序遍历 后序遍历 日期 题目地址:htt ...

  6. Rikka with Graph(hdu5631)

    Rikka with Graph  Accepts: 123  Submissions: 525  Time Limit: 2000/1000 MS (Java/Others)  Memory Lim ...

  7. Python pyecharts绘制词云图

    一.pyecharts绘制词云图WordCloud.add()方法简介 WordCloud.add()方法简介 add(name,attr,value, shape="circle" ...

  8. rabbitmq-安装部署及基础操作

    rabbitmq 官网: https://www.rabbitmq.com/ yum 安装 rabbitmq # centos7 # In /etc/yum.repos.d/rabbitmq.repo ...

  9. [算法笔记-题解]问题 C: 例题4-3 比较交换3个实数值,并按序输出

    问题 C: 例题4-3 比较交换3个实数值,并按序输出 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 12 MB 题目描述 从键盘输入3个实数a, b, c,通过比较交换, ...

  10. Spring练习,使用Properties类型注入方式,注入MySQL数据库连接的基本信息,然后使用JDBC方式连接数据库,模拟执行业务代码后释放资源,最后在控制台输出打印结果。

    相关 知识 >>> 相关 练习 >>> 实现要求: 使用Properties类型注入方式,注入MySQL数据库连接的基本信息,然后使用JDBC方式连接数据库,模拟执 ...