《刚刚问世》系列初窥篇-Java+Playwright自动化测试-7-元素基础定位方式-下篇 (详细教程)

news2024/9/29 1:20:59

软件测试微信群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 

1.简介

上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的基础定位方式的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下剩下部分的基础定位方式。

2.过滤器定位

例如以下 DOM 结构,我们要在其中单击第二个产品卡的购买按钮。我们有几个选项来过滤定位器以获得正确的定位器。

2.1按文本过滤

定位器可以使用 locator.filter()方法按文本进行过滤。它将搜索元素内某处的特定字符串,可能在后代元素中,不区分大小写。您还可以传递正则表达式。

1.使用文本

page.getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions().setHasText("Product 2"))
    .getByRole(AriaRole.BUTTON,
               new Page.GetByRoleOptions().setName("Add to cart"))
    .click();

2.使用正则表达式

page.getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions()
        .setHasText(Pattern.compile("Product 2")))
    .getByRole(AriaRole.BUTTON,
               new Page.GetByRoleOptions().setName("Add to cart"))
    .click();
2.2按没有文本进行筛选

 通过没有文本进行筛选:

// 5 in-stock items
assertThat(page.getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions().setHasNotText("Out of stock")))
    .hasCount(5);
2.3子项/后代过滤

定位器支持一个选项,即仅选择具有或没有与另一个定位器匹配的后代的元素的元素。因此,您可以按任何其他定位器进行过滤,例如 Locator.getByRole()、Locator.getByTestId()、Locator.getByText() 等。

page.getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions()
        .setHas(page.GetByRole(AriaRole.HEADING, new Page.GetByRoleOptions()
        .setName("Product 2"))))
    .getByRole(AriaRole.BUTTON,
               new Page.GetByRoleOptions().setName("Add to cart"))
    .click()

我们还可以断言产品卡,以确保只有一个:

assertThat(page
    .getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions()
        .setHas(page.GetByRole(AriaRole.HEADING,
                               new Page.GetByRoleOptions().setName("Product 2"))))
    .hasCount(1);

过滤定位器必须相对于原始定位器进行查询,并且从原始定位器匹配项开始进行查询,而不是从文档根开始进行查询。因此,以下操作将不起作用,因为过滤定位器从列表元素开始匹配,该列表元素位于原始定位器匹配的列表项之外:<ul><li>

// ✖ WRONG
assertThat(page
    .getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions()
        .setHas(page.GetByRole(AriaRole.LIST)
                    .GetByRole(AriaRole.HEADING,
                               new Page.GetByRoleOptions().setName("Product 2"))))
    .hasCount(1);
2.4按没有子项/后代过滤

我们也可以通过内部没有匹配的元素来过滤。

assertThat(page
    .getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions().setHasNot(page.getByText("Product 2")))
    .hasCount(1);

敲黑板!!!!请注意,内部定位器是从外部定位符开始匹配的,而不是从文档根目录开始匹配的。

3.定位器操作员

3.1定位器内部匹配

您可以链接创建定位器的方法,例如 Page.getByText() 或 Locator.getByRole(),以将搜索范围缩小到页面的特定部分。

在此示例中,我们首先通过定位其角色listitem来创建一个名为 product 的定位器。然后,我们按文本进行过滤。我们可以再次使用产品定位器来获取按钮的角色并单击它,然后使用断言来确保只有一个文本为“产品 2”的产品。

Locator product = page
    .getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions().setHasText("Product 2"));

product
    .getByRole(AriaRole.BUTTON,
               new Locator.GetByRoleOptions().setName("Add to cart"))
    .click();

您还可以将两个定位器链接在一起,例如,在特定对话框中查找“保存”按钮:

Locator saveButton = page.getByRole(AriaRole.BUTTON,
                                    new Page.GetByRoleOptions().setName("Save"));
// ...
Locator dialog = page.getByTestId("settings-dialog");
dialog.locator(saveButton).click();
3.2同时匹配两个定位器

方法 Locator.and()通过匹配其他定位器来缩小现有定位器的范围。例如,您可以将 Page.getByRole() 和 Page.getByTitle() 组合在一起,以按角色和标题进行匹配。

Locator button = page.getByRole(AriaRole.BUTTON).and(page.getByTitle("Subscribe"));
3.3匹配两个备选定位器之一

如果您想定位两个或多个元素中的一个,但不知道会是哪一个,请使用 Locator.or() 创建一个与所有备选项匹配的定位器。

例如,考虑这样一种情况:您想单击“新电子邮件”按钮,但有时会出现安全设置对话框。在这种情况下,您可以等待“新电子邮件”按钮或对话框,然后采取相应措施。

敲黑板!!!注意:

如果屏幕上同时出现“新建电子邮件”按钮和安全对话框,则“或”定位器将匹配它们,从而可能引发“严格模式违规”错误。在这种情况下,您可以使用 Locator.first() 仅匹配其中一个。

Locator newEmail = page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("New"));
Locator dialog = page.getByText("Confirm security settings");
assertThat(newEmail.or(dialog).first()).isVisible();
if (dialog.isVisible())
  page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Dismiss")).click();
newEmail.click();
3.4仅匹配可见元素

敲黑板!!!注意:

通常,找到一种更可靠的方法来唯一标识元素,而不是检查可见性。

考虑一个有两个按钮的页面,第一个不可见,第二个可见。

<button style='display: none'>Invisible</button>
<button>Visible</button>

这将找到两个按钮并抛出严格性违规错误:

page.locator("button").click();

这只会找到第二个按钮,因为它是可见的,然后单击它。

page.locator("button").locator("visible=true").click();

4.列表

4.1对列表中的项目进行计数

可以断言定位器以对列表中的项目进行计数。例如:以下DOM结构

 使用count断言确保列表包含 3 个项目。

assertThat(page.getByRole(AriaRole.LISTITEM).hasCount(3);
4.2断言列表中所有文本

可以断言定位器以查找列表中的所有文本。例如:以下DOM结构

使用 assertThat(locator).hasText() 确保列表包含文本“apple”、“banana”和“orange”。

assertThat(page
    .getByRole(AriaRole.LISTITEM))
    .hasText(new String[] { "apple", "banana", "orange" });
4.3定位特定项目

有许多方法可以在列表中定位特定项目。

4.3.1通过文本定位

使用 Page.getByText()方法通过文本内容在列表中查找元素,然后单击它。例如:以下DOM结构

 通过文本内容找到项目并单击它。

page.getByText("orange").click();
4.3.2通过文本过滤定位

使用 locator.filter() 在列表中查找特定项目。例如:以下DOM结构

按“listitem”的角色找到一个项目,然后按“orange”的文本进行筛选,然后单击它。

page.getByRole(AriaRole.LISTITEM)
    .filter(new Locator.FilterOptions().setHasText("orange"))
    .click();
4.3.3通过测试id定位

使用 Page.getByTestId()方法在列表中查找元素。如果您还没有测试 ID,则可能需要修改 html 并添加测试 ID。

通过测试 ID “orange”找到一个项目,然后单击它。

page.getByTestId("orange").click();
4.3.4通过第n项定位

如果您有一个相同元素的列表,并且区分它们的唯一方法是顺序,则可以使用 Locator.first()、Locator.last() 或 Locator.nth() 从列表中选择特定元素。

Locator banana = page.getByRole(AriaRole.LISTITEM).nth(1);

但是,请谨慎使用此方法。通常,页面可能会发生变化,定位器将指向与您预期的完全不同的元素。取而代之的是,尝试提出一个独特的定位器,该定位器将通过严格的标准。

4.4链接过滤器

当您有各种相似性的元素时,可以使用 locator.filter()方法选择正确的元素。您还可以链接多个筛选器以缩小选择范围。

要截取带有“Mary”和“Say goodbye”的行的屏幕截图,请执行以下操作:

Locator rowLocator = page.getByRole(AriaRole.LISTITEM);

rowLocator
    .filter(new Locator.FilterOptions().setHasText("Mary"))
    .filter(new Locator.FilterOptions()
        .setHas(page.getByRole(
            AriaRole.BUTTON,
            new Page.GetByRoleOptions().setName("Say goodbye"))))
    .screenshot(new Page.ScreenshotOptions().setPath("screenshot.png"));

现在,您应该在项目的根目录中有一个“screenshot.png”文件。

4.5罕见例子
4.5.1对列表中每个元素执行某些操作

迭代元素

for (Locator row : page.getByRole(AriaRole.LISTITEM).all())
  System.out.println(row.textContent());

使用常规 for 循环进行迭代:

Locator rows = page.getByRole(AriaRole.LISTITEM);
int count = rows.count();
for (int i = 0; i < count; ++i)
  System.out.println(rows.nth(i).textContent());
4.5.2在页面中评估

locator.evaluate_all()中的代码在页面中运行,您可以在那里调用任何 DOM API。

Locator rows = page.getByRole(AriaRole.LISTITEM);
Object texts = rows.evaluateAll(
    "list => list.map(element => element.textContent)");

5.小结

定位器是非常严格。这意味着,如果多个元素匹配,则对定位器执行暗示某些目标 DOM 元素的所有操作都将引发异常。例如,如果 DOM 中有多个按钮,则会引发以下调用:

如果有多个button,则引发错误

page.getByRole(AriaRole.BUTTON).click();

另一方面,Playwright 了解何时执行多元素操作,因此当定位器解析为多个元素时,以下调用工作正常。

适用于多个元素

page.getByRole(AriaRole.BUTTON).count();

您可以通过 locator.first、locator.last 和 locator.nth() 告诉 Playwright 在多个元素匹配时使用哪个元素来明确选择退出严格性检查。不建议使用这些方法,因为当您的页面更改时,Playwright 可能会单击您不想要的元素。相反,请按照上述最佳实践创建唯一标识目标元素的定位器。

5.1其他定位器

对于不太常用的定位器,请查看官网的其他定位器指南。由于时间关系,宏哥就不在这里对其进行展开介绍和讲解了。好了时间不早了,关于元素基础定位方式今天就分享到这里!!!仅供大家学习参考,感谢您耐心的阅读。

 每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

其他定位器

Pycharm工具基础使用教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1980567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重塑未来体验:边缘计算与云原生的完美邂逅

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、云原生的兴起 2、边缘计算的兴起 二、边缘计算基础 …

LoadRunner12 添加事务并添加检查点

1、先要添加事务开始函数lr_start_transaction("登陆事务");&#xff0c;在接口上方右击点击-插入-开始事务。输入事务名称&#xff1b; 2、在某个接口想法 右击点击-插入-结束事务&#xff0c;输入事务名称&#xff0c;与开始事务名称要保持一致&#xff0c;lr_end_…

springboot自动装配(源码分析)

利用spi机制发现配置类并注册到spring容器中 以下示例使用springboot:3.2.1版本 相关注解 SpringBootApplication EnableAutoConfiguration AutoConfigurationImportSelector 使用Import导入AutoConfigurationImportSelector&#xff0c;随着springboot启动&#xff0c;会…

工业控制常用的EtherNet/IP、OPC UA协议的标签数据转发到另外的PLC寄存器地址

在工业自动化领域&#xff0c;越来越多的碰到标签方式通讯的设备&#xff0c;常用有CIP(基于EtherNet/IP) 的协议、OPCUA协议等&#xff0c;CIP协议主要是罗克韦尔/AB的PLC、欧姆龙NX/NJ系列的PLC等&#xff0c;OPCUA协议常见于工业机器人、智能焊接设备等。在不具备标签协议接…

AI绘画变现也有新思路,国风带你日进斗金!

在中国的文化传承中&#xff0c;古典的风韵总是能引发无尽的遐想和美感。 在现代化的今天&#xff0c;越来越多的人开始重新审视和欣赏那些古老的中国风&#xff0c;发现其中蕴含的深厚文化底蕴与无与伦比的美感。 特别是在影视、音乐、舞蹈等艺术形式中&#xff0c;国风元素…

【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载 本章将分享C增加的几种常见特性&#xff0c;主要内容为引用与内联函数 | auto关键字与for循环 | 指针空值&#xff0c;这些知识看似很多&#xff0c;实际也不少。本章篇幅长&#…

双笼转子三相感应电动机瞬态分析(7):定子绕组短路故障分析

1. 引言 2. 定子绕组短路时端电压约束条件 3. 双笼转子三相感应电动机数学模型 4. 仿真分析 5. 结论 6. 参考文献 1. 引言 定子绕组短路故障是三相感应电动机的典型故障情形之一&#xff0c;但其发生几率比缺相故障要低。根据电力系统的研究报告&#xff0c;单相短路在所有…

在仪器计量校准中,无尘车间洁净室检测有哪些方法和流程?

仪器计量校准行业内&#xff0c;无尘车间洁净室检测可以说是较为热门的业务&#xff0c;因为其预算高&#xff0c;且检测流程不是太繁琐&#xff0c;很多仪器计量校准机构也是设立相关实验室&#xff0c;专门处理相关仪器的检测。不过虽然许多机构想要涉足该领域&#xff0c;但…

ArcGIS自带的python安装第三方库

ArcGIS自带的python安装第三方库 文章目录 ArcGIS自带的python安装第三方库pip库安装安装setuptools库安装pip库 第三方库安装 在做项目时&#xff0c;用到了ArcGIS(非pro)中python中的arcpy库&#xff0c;但是又依赖其他外部库&#xff0c;而 Python2并不像Python3那样自带pip…

gitlab项目添加新成员

gitlab项目添加新成员 1、进入项目&#xff0c;找到settings----->点击Members 2、手动输入要添加成员的账号或者搜索&#xff0c;最后点击Add to project就可以了 choose a role permission 是为要添加的成员选择角色权限 补充&#xff1a; ‌Maintainer&#xff1a;拥…

RabbitMQ未授权访问漏洞

RabbitMQ未授权访问漏洞 RabbitMQ是目前非常热门的一款消息中间件&#xff0c;基于AMQP协议的&#xff0c;可以在发布者和使用者之间交换异步消息。消息可以是人类可读的JSON,简单字符串或可以转换为JSON字符串的值列表 1、使用以下Fofa语法对RabbitMQ产品进行搜索 2、在打开…

【机器学习】回归类算法-一元线性回归(入门)

一、概念 一元线性回归&#xff0c;指的是只研究一个自变量与一个因变量之间的关系。简单来说就是看如何设计出一条理想的直线&#xff08;ykxb&#xff09;。 二、如何确定一条理想的直线&#xff1f; &#xff08;1&#xff09;最小二乘法 通过数学模型&#xff0c;拟合一条…

数字化转型的实践指南:揭开TOGAF®架构开发方法ADM的核心价值

实践应用视角&#xff1a;引领数字化转型的必备工具 《TOGAF架构开发方法》 是为企业数字化转型提供系统化指导的权威指南。无论是企业架构师还是信息技术经理&#xff0c;都能从这本《TOGAF架构开发方法》中找到行之有效的方法和策略&#xff0c;帮助他们在数字化时代实现业务…

open_ai-maddpg_Multiagent-particle-envs环境搭建过程

一.利用Anaconda安装python3.6环境 1.安装 下载源&#xff1a; 利用Anaconda安装python3.6环境_anaconda python3.6-CSDN博客 安装过程&#xff1a; windows下载安装anaconda3.6图文教程 - 简书 (jianshu.com) Python3.6版本anacondaPyCharm环境配置&#xff0c;全网最详细…

Vulnhub入门篇-Kioptrix2014

1.环境配置 下载地址&#xff1a;https://download.vulnhub.com/kioptrix/kiop2014.tar.bz2 攻击机kali&#xff1a;192.168.26.128&#xff08;Nat模式&#xff09; 靶机配置&#xff1a;Nat模式 这里注意&#xff0c;根据官网地址说明&#xff0c;需要我们先将网络适配器…

【机器学习】人工神经网络优化方法及正则化技术

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 人工神经网络优化方法及正则化技术1. 引言2. 神经网络优化的基础2.1 损失函数2.…

vlunstack-2(复现红日安全-ATT CK实战)

环境搭建 配置信息 DC IP&#xff1a;10.10.10.10 OS&#xff1a;Windows 2012(64) 应用&#xff1a;AD域 WEB IP1&#xff1a;10.10.10.80 IP2&#xff1a;192.168.47.131 OS&#xff1a;Windows 2008(64) 应用&#xff1a;Weblogic 10.3.6MSSQL 2008 PC IP1&#xff1a;10.10…

Scrapy入门篇

免责声明 本文的爬虫知识仅用于合法和合理的数据收集&#xff0c;使用者需遵守相关法律法规及目标网站的爬取规则&#xff0c;尊重数据隐私&#xff0c;合理设置访问频率&#xff0c;不得用于非法目的或侵犯他人权益。因使用网络爬虫产生的任何法律纠纷或损失&#xff0c;由使用…

论文解读:LSM Tree 的魔力,提升写入吞吐量的高效数据存储结构

LSM Tree是一种用于高写入吞吐量的数据库存储引擎&#xff0c;广泛应用于现代分布式数据库系统。其核心思想是将写入操作缓存在内存中&#xff0c;并定期批量写入磁盘&#xff0c;减少磁盘 I/O 操作&#xff0c;提高写入性能。因其高效的写入性能和适应大规模数据的能力&#x…

医院客户满意度调查如何开展

深圳满意度咨询有限公司&#xff08;SSC&#xff09;&#xff08;患者第三方满意度测评&#xff09;服务于国内多家医院&#xff0c;辅助医院提高患者满意度、改善医德医风、提高服务水平&#xff0c;调查项目覆盖了国内150余个城市&#xff0c;通过电话调查、网络问卷、现场访…