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

news/2024/12/18 16:27:10/文章来源:https://www.cnblogs.com/du-hong/p/18323542

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其他定位器

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实景三维赋能智慧城市时空基础设施建设

随着信息技术的飞速发展,智慧城市建设已成为全球城市发展的新趋势。实景三维技术作为智慧城市建设的重要支撑,对于构建时空基础设施具有不可替代的作用。本文将探讨实景三维技术如何为智慧城市的时空基础设施建设提供强大动力。一、智慧城市时空基础设施的挑战智慧城市的时空…

没有域名如何申请SSL证书

SSL证书一般多应用于域名上,可以保证网站里面的数据不会被泄露,加强网站安全,也加强浏览者的信任度。但是有一种特殊的情况,在网站没有域名或者域名还没有准备好的时候,只有IP地址,能否安装SSL证书呢,答案是可以的,本文将介绍IP SSL证书的应用场景和申请方式。 IP SSL证…

《DNK210使用指南 -CanMV版 V1.0》第四十四章 人脸68关键点检测实验

第四十四章 人脸68关键点检测实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/board…

性能优化相关总结

一、性能优化要从何入手1. 让加载更快2. 让渲染更快下面看一下这两方面分别要怎么优化 二、加载方面的优化想要页面加载更快,需要从资源体积、访问次数、网络入手1、减少资源体积压缩代码       2、减少访问次数资源合并多个js文件合并 多个css文件合并 多个小图标合并…

摄像机实时接入分析平台视频分析网关安防监控施工摄像头与录像机混搭需注意的要点总结

在现代安防监控系统中,摄像头和录像机的混搭使用已成为一种常态,这种组合不仅能够提升监控系统的灵活性,还能根据具体需求和预算进行优化配置。然而,为了确保系统的高效运行和最佳效果,有几个关键点需要在施工和配置过程中特别注意。以下是一些重要的考虑因素,它们将帮助…

冬季游戏协作挑战,6 款办公软件能否成为团队的坚实后盾?

在游戏行业的节日盛宴中,每一个新游戏的上线或重大更新都是一场与时间赛跑的挑战,需要开发团队、测试团队和运营团队如同精密齿轮般紧密协作。而可视化团队协作办公软件则成为了推动这一复杂机器高效运转的润滑剂。本文将站在全 J 人游戏公司的视角,深入剖析 6 款此类办公软…

打架监测报警摄像机

打架监测报警摄像机是一种专门用于监测和预警打架事件的安全设备。这种摄像机一般配备高清摄像头和智能分析算法,可以实时监测监控区域内的人员活动,并在检测到打架行为时立即触发警报系统。打架监测报警摄像机是现代安防领域中一种重要的监控设备,主要用于预防和打击暴力事…

火情监测报警摄像机

火情监测报警摄像机是一种专门用于监测火灾并发出警报的安全设备,通常安装在建筑物、工厂、仓库等易发生火灾的地方,用于实时监测火情并及时通知相关人员。火情监测报警摄像机是一种结合了视频监控和火灾报警功能的智能安全设备,旨在实时监测和检测火情,提前发现和预警火灾…

241218_GIS要素内点要素提取平均值

当一个面要素中有多个点要素时,需要提取点要素的平均值并赋值到面要素中方法使用空间连接 空间连接存在一个功能右键字段-属性2.选择平均值本文来自博客园,作者:我在乎的,转载请注明原文链接:https://www.cnblogs.com/wzh/p/18615058

流动商贩乱摆摊占道智能监控系统

流动商贩乱摆摊占道智能监控系统核心在于深度学习算法的运用,流动商贩乱摆摊占道智能监控系统对高清摄像头捕捉到的图像进行深度分析,识别出违规撑伞、出店经营、车辆占道违停以及违规广告牌等行为。这些行为往往是城市管理中的顽疾,传统方法难以有效监管,而智能监控系统则…

鸿蒙开发之无须申请权限访问相册图片

访问相册图片介绍 在应用开发中,很多场景需要我们需要访问相册中的图片。例如:上传头像、上传银行卡、身份证资料、扫描文件功能、美颜功能等 所以访问相册里的图片成为我们必须要学习和掌握的内容。那如何访问相册图片呢? 在HarmonyOS中,鉴于对用户隐私的高度保护,要方便…

鸿蒙开发之不申请权限写入图片到相册

写入图片到相册介绍 在上一篇中,猫林老师给大家分享了如何在不申请权限的情况下读取相册内容。这一篇教大家如何写入图片到相册。 这在应用开发中,也是一个很常见的场景,比如我们要做一个文件扫描的功能。那是不是得把扫描的结果保存到图库呢?再比如我们做一个美颜的功能,…