为什么 data-* 属性比普通 ID 属性更适合用于元素选择?

2024-01-09

Cypress https://docs.cypress.io/guides/references/best-practices.html#Selecting-Elements和许多其他关于测试 Web 应用程序的帖子建议依赖像这样的数据属性data-cy or data-test-id用于定位元素而不是依赖于id属性。

我的理解是有两个原因:

  1. 重用组件的现代方式可能会导致拥有多个相同类型的组件,并且可能会导致多个这样的组件IDs在同一页上 - 但这也应该适用于“data-cy”或“data-test-id”属性。
  2. When IDs被束缚于CSS,有一种更频繁地改变它们的趋势,同时data-*属性可能不太容易改变。

有人可以对建议进行更多说明吗?

我正在考虑的另一件事是要求我的开发人员放置data-test*上的属性div将使用组件的标签 - 这样测试属性实际上比组件高一级id属性,即使在使用同一组件的多个实例的情况下也可能派上用场。但我再次不确定为什么id属性div与标签相比,标签很糟糕data-test*属性。


来自 Cypress 官方文档 https://docs.cypress.io/guides/references/best-practices:

反模式:使用容易发生变化的高度脆弱的选择器。

最佳实践:使用 data-* 属性为选择器提供上下文,并将它们与 CSS 或 JS 更改隔离。

您编写的每个测试都将包含元素选择器。为了避免很多麻烦,您应该编写能够适应变化的选择器。

我们经常看到用户在定位其元素时遇到问题,因为:

您的应用程序可能会使用会更改的动态类或 ID 您的选择器会因 CSS 样式或 JS 行为的开发更改而中断 幸运的是,这两个问题都是可以避免的。

不要根据 CSS 属性定位元素,例如:id、class、tag 不要定位可能改变其文本内容的元素 添加 data-* 属性以更轻松地定位元素

关键是 id 和类可以是动态的(也是文本内容),因此您总是希望使用像“data-cy”属性这样的静态选择器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 data-* 属性比普通 ID 属性更适合用于元素选择? 的相关文章

随机推荐

  • 在 iOS 应用程序中捕获签名

    我们需要从 iOS 应用程序捕获签名 用例是让用户用手指直接在屏幕上绘制签名 我更喜欢网络 所以我的默认方法是嵌入网络视图并使用画布让用户绘图 然后捕获 PNGtoDataURL 不过 原生 Cocoa 控件可能会更好 是否有任何预构建的解
  • 如何根据 radioGroupButton 选择在闪亮的仪表板主体中隐藏或显示图表

    我正在尝试创建具有以下结构的仪表板 它的基本结构有 3 个级别 菜单 子菜单和单选组按钮选择 侧边栏 Menu1 有2个子菜单 子菜单1和子菜单2 Menu2 有 2 个子菜单 子菜单 3 和子菜单 4 主体有 radioGroupButt
  • 正则表达式从 XSLT 中删除单词

    我需要帮助编写正则表达式以使用 XSLT 删除单词 我需要将 XML 文件的 详细路径 的输出更改为 活动 262 26207 简单地说 262 26207 XSL 是
  • 为什么进程终止后异步读取仍未完成?

    我编写了一个进程 它从作为参数给出的文件中读取数据 我已异步读取 StandardOutput 和同步读取 StandardError public static string ProcessScript string command st
  • 删除水晶报表中数字字段的小数

    我有一个字段年份 它是来自数据库端的字符串类型 因此我将其转换为数字 并在其中添加 1 年以显示如下 Year 2014 2015 下面是公式 Year tonumber FocusOnCustomer YEAR tonumber Focu
  • Android原生浏览器的引擎是什么?

    Android原生浏览器的引擎是什么 维基说 https en wikipedia org wiki WebKit UseAndroid 在 4 4 之前使用 WebKit 且Blink https en wikipedia org wik
  • C++中的反斜杠是什么意思?

    这段代码的作用是什么 特别是反斜杠 的作用是什么 s23 foo s8 foo s16 bar 我添加了数据类型 因为它们可能是相关的 感谢您的帮助 反斜杠在 C 中表示两种不同的事物 具体取决于上下文 作为行的延续 在引号字符串之外 见下
  • 如何在java客户端中获取HDFS服务器元数据信息?

    我需要构建一个实用程序类来测试与 HDFS 的连接 测试应显示 HDFS 的服务器端版本和任何其他元数据 虽然有很多可用的客户端演示 但没有关于提取服务器元数据的内容 有人可以帮忙吗 请注意 我的客户端是远程 java 客户端 没有 had
  • 如何在 macOS 上以编程方式将文件和文件夹移至垃圾箱?

    我在这个主题上所能找到的只是提到FSMoveObjectToTrashSync函数 现在是已弃用并且没有列出替代方案 https developer apple com documentation coreservices 1566651
  • java xml 删除项目

    我有一个非常简单的 xml 文件 我想创建一个简单的函数来从中删除项目 这是我的 xml 文件
  • 为什么我们需要将压缩对象转换为列表

    我正在尝试完成一个数据营练习 其中我需要将 2 个列表转换为zip object然后进入一个dict最终得到一个dataframe使用熊猫 但是 如果我使用zip 对列表进行函数并将它们转换为字典 然后转换为数据框 我没有得到任何错误 但简
  • 如何检查 bash 脚本中是否以 root 身份运行

    我正在编写一个需要 root 级别权限的脚本 并且我想这样做 以便如果该脚本不以 root 身份运行 它只是回显 请以 root 身份运行 并退出 这是我正在寻找的一些伪代码 if whoami root then echo Please
  • 如何使用 Excel 在 Outlook 365 Exchange 中引用组或共享日历?

    我正在尝试让多个用户能够使用 Excel 将约会添加到共享日历 以下代码对我有用 我拥有共享日历 它位于 Outlook365 中的我的日历文件夹中 Sub CreateAppt Const olFolderCalendar 9 Const
  • 如何在 Dart 中创建一个空白的 Future + 如何返回当前正在进行的 Future?

    我正在尝试创建一个服务器端 Dart 类来执行各种与数据相关的任务 所有这些任务都依赖于首先初始化的数据库 问题是数据库的初始化是异步发生的 返回 Future 我首先尝试将初始化代码放入构造函数中 但放弃了这种方法 因为它似乎不可行 我现
  • 如何通过java代码在属性文件中写入值

    我有一个问题 我有一个属性文件 我想在该文件中存储一些值 并在需要时在代码中实现 有什么办法可以做到这一点吗 我在用Properties类来做到这一点 使用加载属性文件java util Properties http docs oracl
  • 为什么我无法将 firebase 电子邮件密码登录链接到 google 登录?

    我已经成功实施了Firebase Google 登录 https firebase google com docs auth android google signin在我的 Android 应用程序中 它工作正常 但是 我希望用户也使用电
  • 获取与 SIM 卡关联的电话号码

    如何获取与 CMDA 和 GSM 的 SIM 卡关联的电话号码以及服务提供商名称 Android TelephonyManager 可能不会在所有情况下都返回号码 如果运营商未设置号码 它可能不会返回号码 您必须创建一个验证场景 要求用户输
  • 如何向 Spark RDD 添加新列?

    我有一个 RDDMANY列 例如 hundreds 如何在此 RDD 的末尾添加一列 例如 如果我的 RDD 如下所示 123 523 534 893 536 98 1623 98472 537 89 83640 9265 7297 983
  • 更新(重新部署)现有的 azure webjob

    我创建了一个按需网络作业 在管理门户中 没有上传新 zip 或更新它的选项 我可以删除现有的网络作业并创建一个新的网络作业 但我想保留我的日志 有没有办法重新部署它 覆盖旧版本 维护日志 您可以通过 FTP 连接到 Webjob 所在的网站
  • 为什么 data-* 属性比普通 ID 属性更适合用于元素选择?

    Cypress https docs cypress io guides references best practices html Selecting Elements和许多其他关于测试 Web 应用程序的帖子建议依赖像这样的数据属性d