Web 自动化神器 TestCafe(二)—元素定位篇
今天主要给大家介绍一下testcafe这个框架元素定位的方法。
一、CSS 选择器定位
使用 testcafe 对元素进行操作的时候,我们可以直接通过 CSS 选择器指定要操作的元素,比如,点击元素,input 输入文本内容,如下:
- 点击 id 为 su 的元素
前段时间写了一篇关于web自动化测试框架TestCafe的安装和入门文档,有部分小伙伴表示对这个框架比较感兴趣,后续有时间会陆续写几篇关于TestCasfe使用的文章。今天主要给大家介绍一下testcafe这个框架元素定位的方法。
- 点类类属性为 btn 的元素
await t.click('.btn');
上面这种基于 CSS 的元素定位方式用起来虽然很便捷, 但是对于更复杂的元素定位,CSS 选择器会变得更长且难以编写和维护,另外 CSS 选择器无法定位父元素,在实际的应用种 CSS 选择器还是会有诸多不便。这边就不做过多的讲解了。
二、Selector 选择元素
由于 CSS 选择器定位元素不是特别方便,因此 testCafe 中提供了一个叫做 Selector 元素定位器函数,接下来就给大家介绍一下 Selector 的使用。
1、选择器基本使用
在使用 Selector 之前我们需要将它导入,然后使用 Selector 的构造函数创建出来一个选择器对象,对于一些简单的元素定位可以直接将 CSS 选择表达式在创建对象时当如参数传入,js 代码如下:
import { Selector } from 'testcafe';
// 定位id为su的元素
const su = Selector('#su');
// 定位class属性为kw的元素
const kw = Selector('.kw');
2、通过文本定位
上面传入css定位表达式这种方式不支持文本定位,对于文本定位元素,Selector对象提供了对应的方法:既可以通过文本内容匹配,也可以通过文本包含匹配。
- 1、文本内容匹配 :withExactText import { Selector } from 'testcafe'; // 定位 文本为百度的元素 const baidu = Selector().withExactText('百度')
- 2、文本包含匹配:withText import { Selector } from 'testcafe'; // 定位 文本包含百度的span标签 const baidu = Selector('span').withText('百度')
3、通过属性定位
关于通过元素属性匹配,Selector定位器,同样也提供了对应的方法(withAttribute),下面我们来演示withAttribute的使用案例。
| 参数 | 说明 |
| attrName | 属性名(可传字符串|正则表达式) |
| attrValue(非必填) | 属性值(可传字符串|正则表达式) |
// 定位包含myAttr属性的div元素
Selector('div').withAttribute('myAttr');// 定位herf属性为http://www.baidu,com的a标签
Selector('a').withAttribute('herf', 'http://www.baidu,com');
4、节点关系定位
- 1、nextSibling:下一个元素同级元素 // 定位a标签的下一个兄弟元素 Selector('a').nextSibling();
- 2、prevSibling:上一个元素同级元素 // 定位p标签的上一个兄弟元素 Selector('p').prevSibling()
- 3、parent:获取父级元素 // 定位id为u的标签的父元素 Selector('#u').parent()
- 4、sibling:所有的兄弟元素 // 定位li标签所有的兄弟元素 Selector('li').sibling()
- 5、child:获取所有的子元素。 // 定位ul标签所有的子标签 Selector('ul').child()
5、过滤方法
当我们通过选择器获取到某个元素或者元素集合的时候,需要过滤出我们想要的元素进行操作时,那么我们就可以通过Selector提供的相关方法来进行过滤操作定位。
- 1、nth:通过下标选择 // 选择第一个div元素 Selector('div').nth(0)
- 2、find: 查找匹配节点的后代节点 查找匹配集中所有节点的后代节点,并使用 CSS 选择器对其进行过滤。 Selector().find(cssSelector) // cssSelector:用于过滤子元素的CSS选择器字符串。
- 2、filter:过滤符合条件的元素。 Selector().filter(cssSelector) // cssSelector:用于过滤元素的CSS选择器字符串。
- 3、filterHidden:仅选择隐藏的元素 具有 display: none 或 visibility: hidden CSS 属性或宽度或高度为零的元素被视为隐藏。 // 定位隐藏的div元素 Selector('div').filterHidden()
- 4、filterVisibl:仅定位显示的元素 不具有 CSS 属性 display: none 或元素的 visibility: hidden 宽度和高度不为零的元素被视为可见。 // 定位处于显示状态class为box的元素 Selector('.box').filterVisible();
6、设置等待时间
在定位元素的时候,我们如果需要等到定位的元素出现,在使用Selector时,可以设置一个等待超时的时间,直到等待的元素超时为止,使用如下:
Selector('#elementId', { timeout: 500 })
三、Seletor 选择器的操作
上面我们讲了创建一个 seletor 对象选择元素,接下来咱们一起来看看 seletor 对象的操作。
1、常用的属性
- exists:判断元素是否存在 // 判断元素是否存在,返回值布尔值 const res = Selector('#submit-button').exists;
- count:获取匹配到的元素数量 // 获取匹配到的数量 const num = Selector('.column.col-2 label').count;
- textContent :获取元素中包含的文本(包含子元素的文本) const text = Selector('.column.col-2 label').textContent;
- visible :元素是否可见 const num = Selector('.column.col-2 label').count;
- tagName :元素名称 const num = Selector('.column.col-2 label').tagName;
2、更多的属性
除了上述常用属性,Selector 的其他属性参考如下:
| 属性 | 描述 |
| attributes | 元素的属性为 { name: value, ... }。您也可以使用该 getAttribute 方法访问属性值。 |
| boundingClientRect | 元素的大小及其相对于视口的位置。包含 left,right,bottom,top,width 和 height 属性。 |
| checked | 对于复选框和单选输入元素,其当前状态。对于其他元素,undefined。 |
| classNames | 元素类的列表。 |
| clientHeight | 元素的内部高度,包括填充,但不包括水平滚动条的高度,边框或边距。 |
| clientLeft | 元素左边框的宽度。 |
| clientTop | 元素顶部边框的宽度。 |
| clientWidth | 元素的内部宽度,包括填充,但不包括垂直滚动条的宽度,边框或边距。 |
| focused | true 如果该元素已聚焦。 |
| id | 元素的标识符。 |
| innerText | 元素的文本内容“呈现”。 |
| namespaceURI | 元素的名称空间 URI。如果元素没有命名空间,则此属性设置为 null |
| offsetHeight | 元素的高度,包括垂直填充和边框。 |
| offsetLeft | 元素左上角在 offsetParent 节点内向左偏移的像素数。 |
| offsetTop | 元素左上角在 offsetParent 节点内偏移到顶部的像素数。 |
| offsetWidth | 元素的宽度,包括垂直填充和边框。 |
| selected | 表示 `` 当前已选择元素。对于其他元素,undefined |
| scrollHeight | 元素内容的高度,包括由于溢出而在屏幕上不可见的内容。 |
| scrollLeft | 元素内容向左滚动的像素数。 |
| scrollTop | 元素内容向上滚动的像素数。 |
| scrollWidth | 元素内容的像素宽度或元素本身的宽度,以较大者为准。 |
| tagName | 元素的名称。 |
看到这里的朋友不妨点个赞,码字不易,谢谢大家。
相关文章:
Web 自动化神器 TestCafe(二)—元素定位篇
今天主要给大家介绍一下testcafe这个框架元素定位的方法。 一、CSS 选择器定位 使用 testcafe 对元素进行操作的时候,我们可以直接通过 CSS 选择器指定要操作的元素,比如,点击元素,input 输入文本内容,如下࿱…...
DRF-通用分页器(PageNumberPagination):ListModelMixin可以使用的通用分页器
一、ListModelMixin 和GenericAPIView源码 ListModelMixin 是一个单一功能类,必须配合GenericAPIView(或其子类)来一起使用,才能完成其视图的功能 class ListModelMixin:"""List a queryset."""d…...
移动机器人,开启智能柔性制造新篇章
智能制造是当今工业发展的必然趋势,而柔性制造则是智能制造的重要组成部分。在这个快速变革的时代,如何提高生产效率、降低成本、增强灵活性成为了制造业的关键挑战。富唯智能移动机器人应运而生,为柔性制造注入了新的活力。 基于富唯智能AI-…...
视频云存储EasyCVR平台国标接入获取通道设备未回复是什么原因?该如何解决?
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
【Web题】狼追兔问题
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
4-Docker命令之docker info
后续为大家逐个讲解一下docker常用命令及其相关用法。docker常用命令查看如下: [root@centos79 ~]# docker --helpUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:run Create and run a new container from an imageexec…...
QT 中的元对象系统
作为一名十几年的 C 程序员,最近一段时间使用 QT 开发程序,发现 QT 中还是有许多值得深入理解的技术。QT 不仅仅是一个应用程序开发框架,还有一些对标准 C 的扩充。本文和大家一起探讨 QT 中的元对象系统。 在分析 QT 中的元对象系统之前&…...
在两个java项目中实现Redis的发布订阅模式
如何在两个java项目中实现Redis的发布订阅模式? 1. Redis简介2. 发布订阅模式介绍3. 实现思路4. 代码实现及详细解释4.1. RedisUtil4.2. Publisher4.3. Subscriber4.4. 运行程序 目录: Redis简介发布订阅模式介绍实现思路代码实现及详细解释 1. Redis简…...
执行shell脚本提示syntax error: unexpected end of file
具体报错如下: ./test.sh: line 36: syntax error: unexpected end of file执行命令时需将test.sh替换为实际的脚本文件名称。 情形一: shell脚本在Windows下编写,上传到Linux上执行,由于 fileformat 类型不同,所以报…...
信也科技发布2023年Q3财报:数字金融服务业务增长稳健,持续拉动实体消费
11月21日,信也科技(NYSE:FINV)公布2023年第三季度未经审计的财务报告。财报显示,信也科技三季度在国内、国际市场延续稳健增长态势,实现季度营收31.98亿元(人民币,下同)&…...
Springcloud可视化物联网智慧工地云SaaS平台源码 支持二开和私有化部署
智慧工地平台围绕建筑施工人、物、事的安全管理为核心,对应研发了劳务实名制、视频监控、扬尘监测、起重机械安全监测、安全帽监测等功能一体化管理的解决方案。 智慧工地是聚焦工程施工现场,紧紧围绕人、机、料、法、环等关键要素,综合运用物…...
51单片机应用从零开始(七)·循环语句(if语句,swtich语句)
51单片机应用从零开始(一)-CSDN博客 51单片机应用从零开始(二)-CSDN博客 51单片机应用从零开始(三)-CSDN博客 51单片机应用从零开始(四)-CSDN博客 51单片机应用从零开始(…...
Web服务器(go net/http) 处理Get、Post请求
大家好 我是寸铁👊 总结了一篇Go Web服务器(go net/http) 处理Get、Post请求的文章✨ 喜欢的小伙伴可以点点关注 💝 前言 go http请求如何编写简单的函数去拿到前端的请求(Get和Post) 服务器(后端)接收到请求后,又是怎么处理请求,…...
Unity中颜色空间Gamma与Linear
文章目录 前言一、人眼对光照的自适应1、光照强度与人眼所见的关系2、巧合的是,早期的电子脉冲显示屏也符合这条曲线3、这两条曲线都巧合的符合 y x^2.2^(Gamma2.2空间) 二、Gamma矫正1、没矫正前,人眼看电子脉冲显示屏ÿ…...
Word/PPT/PDF怎么免费转为JPG图片?
1、打开金鸣表格文字识别网站。 2、点击导航条上的“软件下载” 3、安装并打开金鸣表格文字识别软件。 4、点击顶部导航栏的“文件转图片”。 5、选择需要转换成图片的文件(支持Word/PPT/PDF). 6、点“打开”程序将自动分页转换为图片。...
使用docker命令_进入容器_登录mysql服务_并执行sql语句---Docker工作笔记005
今天就用到了,不得不说用docker用到的还是少,记录一下,常用的也就这些吧. 首先执行: docker ps [root@localhost dataease-1.18.9]# docker ps CONTAINER ID IMAGE COMMAND CREATED …...
PMP 考试的含金量怎么样?
这里可以三个思考题和三个价值点帮你认识PMP考试。 三个思维题 1.工作环境 PMP证书含金量的一个很大因素,就是考证的人是否对PMP证书有比较强的实际需求。相反,如果只是听别人说,PMP证书很好,不管工作中是否有需要,…...
2023亚太杯数学建模A题思路代码分析
已经完成A题完整思路代码,文末名片查看获取 A题就是我们机器学习中的一个图像识别,他是水果图像识别,就是苹果识别的一个问题,我们用到的方法基本是使用深度学习中的卷积神经网络来进行识别和分类 问题一:基于附件1中…...
Qt实现自定义IP地址输入控件(百分百还原Windows 10网络地址输入框)
在开发网络相关的程序时,我们经常需要输入IP地址,例如源地址和目标地址。Qt提供了一些基础的控件,如QLineEdit,但是它们并不能满足我们对IP地址输入的要求,例如限制输入的格式、自动跳转到下一个输入框、处理回车和退格键等。因此,我们需要自己编写一个自定义的IP地址输入…...
Linux下的C++ socket编程实例
服务端: 服务器端先初始化socket,然后与端口绑定,对端口进行监听,调用accept阻塞,等待客户端连接。 socket() -> bind() -> listen() -> accept() 客户端: 客户端先初始化socket,然后…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!
多连接 BLE 怎么设计服务不会乱?分层思维来救场! 作者按: 你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”? 温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。…...
