Cypress 测试中 Shadow DOM 元素定位策略与实践

Cypress 测试中 Shadow DOM 元素定位策略与实践

本文详细阐述了在 cypress 测试中,当目标元素位于 shadow dom 内部时,标准选择器失效的原因及解决方案。教程将指导读者如何识别 shadow host 并利用 cypress 的 `.shadow()` 命令,有效定位并与 shadow dom 中的表单元素进行交互,确保测试的准确性和稳定性。

在现代 Web 开发中,组件化和封装性变得越来越重要。Shadow DOM 作为 Web Components 技术栈的一部分,提供了一种强大的方式来封装组件的结构、样式和行为,使其与文档的其他部分完全隔离。然而,这种封装性也给自动化测试工具带来了挑战,尤其是在使用 Cypress 这类工具进行元素定位时。

理解 Shadow DOM 及其对 Cypress 的影响

Shadow DOM 允许浏览器将一个 DOM 子树(称为 Shadow Tree)附加到一个常规 DOM 元素(称为 Shadow Host)上。这个 Shadow Tree 是独立于主文档 DOM 的,其内部的元素默认不会被主文档的 CSS 或 JavaScript 直接访问。对于 Cypress 而言,这意味着标准的 cy.get() 命令在尝试定位 Shadow DOM 内部的元素时会失败,因为它只能在主文档 DOM 中进行查找。

当 Cypress 尝试使用 cy.get(‘input[name=firstName]’) 这样的选择器去定位一个位于 Shadow DOM 内部的输入框时,如果该输入框不直接存在于主文档 DOM 中,Cypress 将无法找到它,并最终抛出超时错误,提示“Expected to find element: input[name=firstName], but never found it.”。

解决方案:使用 Cypress 的 .shadow() 命令

Cypress 提供了专门的 .shadow() 命令来解决 Shadow DOM 的元素定位问题。.shadow() 命令允许您穿透 Shadow DOM 的边界,进入 Shadow Tree 内部进行元素操作。

.shadow() 命令的工作原理

要成功使用 .shadow() 命令,关键在于两步:

定位 Shadow Host: 首先,您需要使用常规的 Cypress 选择器定位到承载 Shadow DOM 的宿主元素(Shadow Host)。这个 Shadow Host 必须是主文档 DOM 中的一个可见元素。进入 Shadow DOM 并定位内部元素: 一旦定位到 Shadow Host,您可以链式调用 .shadow() 命令。此命令会改变 Cypress 的上下文,使其能够在 Shadow Tree 内部进行操作。之后,您可以使用 .find() 命令(而不是 cy.get())来定位 Shadow DOM 内部的元素。

示例代码

假设我们有一个 Web 页面,其中包含一个自定义组件 array-account-enroll,而 firstName 输入框位于其 Shadow DOM 内部。以下是使用 .shadow() 命令进行定位的 Cypress 测试代码:

describe('Verify identity data within Shadow DOM', () => {  it('Successfully finds and interacts with form elements in Shadow DOM', function () {    // 访问目标页面    cy.visit('https://whitelabel.sandbox.array.io/signup?platform=v3');    // 1. 定位 Shadow Host 元素    // 'array-account-enroll' 是承载 Shadow DOM 的自定义元素标签    cy.get('array-account-enroll')      // 2. 使用 .shadow() 命令进入 Shadow DOM 内部      .shadow()      // 3. 在 Shadow DOM 内部使用 .find() 定位目标元素      .find('input[name="firstName"]')      // 4. 对定位到的元素进行操作,例如输入文本      .type('John')      .should('have.value', 'John');    // 可以继续定位其他 Shadow DOM 内部的元素    cy.get('array-account-enroll')      .shadow()      .find('input[name="lastName"]')      .type('Doe')      .should('have.value', 'Doe');    // 如果有按钮也在 Shadow DOM 内部,同样可以定位并点击    // cy.get('array-account-enroll').shadow().find('button[type="submit"]').click();  });});

在上述代码中:

cy.get(‘array-account-enroll’) 定位了 Shadow Host 元素。.shadow() 命令将 Cypress 的查询范围切换到 array-account-enroll 元素的 Shadow Tree 内部。.find(‘input[name=”firstName”]’) 则在 Shadow Tree 内部查找名为 firstName 的输入框。

注意事项与最佳实践

识别 Shadow Host: 正确识别 Shadow Host 是使用 .shadow() 的第一步也是最关键的一步。通常,Shadow Host 是一个自定义元素(如 )或具有 shadowRoot 属性的常规元素。您可以使用浏览器的开发者工具来检查元素结构,确认哪个元素是 Shadow Host。.shadow() 只能在 Shadow Host 上调用: 确保您在 .shadow() 命令之前定位的元素确实是一个 Shadow Host。如果在非 Shadow Host 元素上调用 .shadow(),Cypress 将会报错。链式调用 find(): 一旦进入 Shadow DOM,您应该使用 .find() 命令来定位内部元素,而不是 cy.get()。cy.get() 总是从根 DOM 开始查询,而 .find() 是从当前主题(即 Shadow Root)开始查询。多次进入 Shadow DOM: 如果页面中有多个独立的 Shadow DOM 实例,或者您需要操作不同 Shadow DOM 中的元素,您可能需要多次重复 cy.get(‘shadow-host’).shadow().find(‘element’) 的模式。调试技巧: 在 Cypress 测试运行时,打开浏览器开发者工具,检查元素的 DOM 结构。带有 #shadow-root 标记的元素就是 Shadow Host。展开它,您就能看到 Shadow DOM 内部的元素结构。这对于编写正确的选择器非常有帮助。

总结

处理 Shadow DOM 是 Cypress 高级测试场景中常见的挑战。通过理解 Shadow DOM 的封装特性以及 Cypress 提供的 .shadow() 命令,测试工程师可以有效地穿透 Shadow DOM 边界,精准定位并与内部元素进行交互。遵循先定位 Shadow Host、再使用 .shadow() 进入,最后用 .find() 定位内部元素的策略,将确保您的 Cypress 测试在面对复杂 Web 组件时依然保持高效和稳定。

以上就是Cypress 测试中 Shadow DOM 元素定位策略与实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1588416.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CSS文件加载失败时动态替换方案:利用onerror事件实现优雅降级
上一篇 2025年12月23日 04:15:24
怎么在HTML中插入表格数据_HTML table/tr/td标签与数据填充技巧
下一篇 2025年12月23日 04:15:35

相关推荐

  • C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

    C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

    本文旨在提供一个简洁明了的教程,指导开发者如何在C# .NET应用中,以纯资源服务器模式,通过外部授权服务器(如AWS Cognito或Asgardeo)实现REST API的安全保护。文章将重点介绍如何利用JWT Bearer认证机制,通过最小化配置,快速构建一个能够验证传入访问令牌的API服务,…

    2026年9月27日 • 用户投稿
    000
  • 京东拼购入驻,所需条件与费用有哪些?详解商家资质、经验要求及质保金、平台费、扣点明细!

    京东拼购入驻,所需条件与费用有哪些?详解商家资质、经验要求及质保金、平台费、扣点明细!京东拼购入驻,所需条件与费用有哪些?详解商家资质、经验要求及质保金、平台费、扣点明细!京东拼购入驻,所需条件与费用有哪些?详解商家资质、经验要求及质保金、平台费、扣点明细!京东拼购入驻,所需条件与费用有哪些?详解商家资质、经验要求及质保金、平台费、扣点明细!

    在电商迅猛发展的当下,京东拼购为大量商家开辟了一个充满潜力的销售渠道。然而,若想成功入驻该平台,商家必须清楚了解其入驻门槛及相关费用信息。这不仅有助于提前筹备相关材料,还能有效提升审核通过率,助力商家快速切入这一活跃市场,开启线上增长新篇章。 一、京东拼购入驻条件 (一)基本资质要求 1. 持有有效…

    2026年9月27日 • 用户投稿
    200
  • linux Kernel

    linux Kernellinux Kernellinux Kernellinux Kernel

    探索linux内核的奥秘,从基础到高级,逐步揭开其神秘面纱。无论你是初学者还是资深开发者,本文都将为你提供深入了解linux内核所需的知识和工具。 以上就是linux Kernel的详细内容,更多请关注创想鸟其它相关文章!

    2026年9月27日 • 用户投稿
    100
  • Codename One:实现安全的数字密码输入框

    Codename One:实现安全的数字密码输入框Codename One:实现安全的数字密码输入框Codename One:实现安全的数字密码输入框Codename One:实现安全的数字密码输入框

    本文详细介绍了在Codename One中创建既能接受纯数字输入又能进行密码遮罩的文本输入框的方法。通过使用位或运算符(|)组合TextArea.NUMERIC和TextArea.PASSWORD约束,可以有效地实现这一需求,避免了链式调用constraint()的常见误区,从而提升用户体验和输入安…

    2026年9月27日 • 用户投稿
    000
  • AZ录屏画笔使用技巧

    AZ录屏画笔使用技巧AZ录屏画笔使用技巧AZ录屏画笔使用技巧AZ录屏画笔使用技巧

    az屏幕录制是一款功能多样的录屏软件,除了提供常规的录屏操作外,还拥有许多实用的附加功能,比如在录制时可使用的画笔标注功能。 1、 打开手机中的AZ屏幕录制应用 2、 进入应用设置界面后向下滑动,找到“录制工具”相关选项 3、 开启画笔功能后,屏幕上将会出现画笔图标 笔魂AI 笔魂AI绘画-在线AI…

    2026年9月27日 • 用户投稿
    000
  • win8如何查看windows体验指数_Win8体验指数查看方法

    win8如何查看windows体验指数_Win8体验指数查看方法win8如何查看windows体验指数_Win8体验指数查看方法win8如何查看windows体验指数_Win8体验指数查看方法win8如何查看windows体验指数_Win8体验指数查看方法

    1、可通过控制面板或运行命令查看Windows体验指数。首先在控制面板中进入“系统和安全”→“操作中心”→“维护”→“查看性能信息”,即可查看总分及各硬件子分数;或使用“Win+R”输入“shell:games”打开游戏文件夹,右键空白处选择“属性”,直接查看Windows体验指数的基准分数和各项子…

    2026年9月27日 • 用户投稿
    100
  • 豆包AI如何实现智能排版 豆包AI文档自动格式化功能

    豆包AI提供的智能排版功能,能够显著提升文档处理效率。本文将详细介绍如何利用豆包AI的文档自动格式化能力,解决文档排版耗时的问题。我们将逐步解析使用该功能的过程,包括如何启用、输入内容以及完成格式化,以便用户能够轻松掌握并应用。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 …

    2026年9月27日
    000
  • VSCode如何实现代码片段云端同步 VSCode代码片段跨设备同步方案

    vscode实现代码片段云端同步的核心是将代码片段存储于云端并通过扩展或服务在多设备间同步;2. 可通过settings sync扩展结合github gist同步设置与代码片段;3. 可将代码片段文件夹置于dropbox、google drive等云存储服务中实现自动同步;4. 可使用git私有仓…

    2026年9月27日
    200
  • Java Swing GUI:构建交互式逻辑门(AND门示例)

    Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)Java Swing GUI:构建交互式逻辑门(AND门示例)

    本文详细介绍了如何使用Java Swing构建一个简单的AND逻辑门GUI应用。通过结合JCheckBox作为输入和JLabel作为视觉输出,并利用ChangeListener监听组件状态变化,实现当两个复选框都被选中时显示“绿色”,否则显示“红色”的功能。教程涵盖了组件创建、事件监听以及将自定义面…

    2026年9月27日 • 用户投稿
    100
  • AI Overviews如何设置智能告警 AI Overviews异常检测阈值

    AI Overviews如何设置智能告警 AI Overviews异常检测阈值AI Overviews如何设置智能告警 AI Overviews异常检测阈值AI Overviews如何设置智能告警 AI Overviews异常检测阈值AI Overviews如何设置智能告警 AI Overviews异常检测阈值

    本文将详细指导您如何在AI Overviews中设置智能告警以及调整异常检测阈值,帮助您及时发现并响应潜在问题。我们将分步骤讲解具体操作过程,确保您能够顺利配置这些关键功能,从而实现更主动、更精准的系统监控。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年9月27日 • 用户投稿
    000
  • 360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法

    360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法360极速浏览器收藏夹栏怎么显示_360极速浏览器显示或隐藏书签栏的方法

    360极速浏览器书签栏未显示时,可通过快捷键Ctrl+Shift+B切换,或在菜单“工具”中点击“显示书签栏”,也可在“设置-外观”中开启默认显示。 如果您希望在浏览网页时快速访问常用网站,但发现360极速浏览器的收藏夹栏未显示,可能是书签栏被隐藏了。以下是恢复显示书签栏的操作方法。 本文运行环境:…

    2026年9月27日 • 用户投稿
    100
  • MAC怎么完全重置恢复到出厂设置_macOS恢复出厂设置与抹掉所有内容指南

    MAC怎么完全重置恢复到出厂设置_macOS恢复出厂设置与抹掉所有内容指南MAC怎么完全重置恢复到出厂设置_macOS恢复出厂设置与抹掉所有内容指南MAC怎么完全重置恢复到出厂设置_macOS恢复出厂设置与抹掉所有内容指南MAC怎么完全重置恢复到出厂设置_macOS恢复出厂设置与抹掉所有内容指南

    推荐使用“抹掉所有内容和设置”功能,进入系统设置-通用-传输或还原,点击抹掉按钮并输入密码,Mac将自动清除数据并重装系统;02. 若无法正常启动,可尝试通过恢复模式手动操作,关机后长按电源键进入启动选项,选择“选项”进入恢复模式,使用磁盘工具抹掉硬盘(格式选APFS),再重新安装macOS;03.…

    2026年9月27日 • 用户投稿
    000
  • uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法

    uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法uc浏览器如何开启阅读模式_UC浏览器网页纯净阅读模式使用方法

    开启UC浏览器阅读模式可去除广告并优化排版,具体操作包括:通过地址栏书本图标一键启用、从菜单手动开启,或在设置中开启自动进入功能,提升阅读体验。 如果您在浏览网页时希望减少广告和无关内容的干扰,可以启用UC浏览器的阅读模式来获得更清晰的阅读体验。该功能会自动提取网页正文并优化排版,使文字更加易读。 …

    2026年9月27日 • 用户投稿
    100
  • Java Swing 实现带复选框和图像的逻辑门

    Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门Java Swing 实现带复选框和图像的逻辑门

    本文介绍了如何使用 Java Swing 创建一个简单的 AND 逻辑门 GUI,该 GUI 包含两个复选框和一个图像。当两个复选框都被选中时,图像变为绿色;否则,图像变为红色。我们将使用 JCheckBox、JLabel 和 ChangeListener 来实现这一功能,并提供完整的代码示例。 创…

    2026年9月27日 • 用户投稿
    000
  • Perplexity AI如何实现考古鉴定 Perplexity AI文物真伪辨别

    Perplexity AI如何实现考古鉴定 Perplexity AI文物真伪辨别Perplexity AI如何实现考古鉴定 Perplexity AI文物真伪辨别Perplexity AI如何实现考古鉴定 Perplexity AI文物真伪辨别Perplexity AI如何实现考古鉴定 Perplexity AI文物真伪辨别

    本文将探讨 Perplexity AI 在考古鉴定和文物真伪辨别中扮演的角色。我们将详细讲解如何利用这一工具辅助考古研究人员和鉴定专家进行初步的信息检索和分析,为文物的真伪判断提供参考依据。文章会分步骤指导用户如何操作,以便更好地理解和应用 Perplexity AI 的功能。 ☞☞☞AI 智能聊天…

    2026年9月27日 • 用户投稿
    000
  • 生日蛋糕馒头做法

    生日蛋糕馒头做法生日蛋糕馒头做法生日蛋糕馒头做法生日蛋糕馒头做法

    1、将面粉、水、酵母与白砂糖混合均匀,揉成光滑面团。取其中五分之三的面团擀成比面碗稍大的厚圆片,用面碗压出圆形,作为蛋糕馒头的底部坯体。另准备一张油纸,模仿剪纸手法折叠后剪出细密小孔,展开铺平,放上坯体备用。 2、将剩下的面团中取出三分之二,加入三滴大红色食用色素,充分揉匀,调制成柔和的淡粉色面团,…

    2026年9月27日 • 用户投稿
    200
  • uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程

    uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程uc浏览器首页的新闻怎么关闭_UC浏览器关闭首页新闻资讯教程

    如果您在使用UC浏览器时,希望减少首页的新闻资讯干扰,以获得更专注的浏览体验,可以通过以下方法进行设置。 本文运行环境:小米14 Pro,Android 14 一、关闭资讯推送通知 此操作将阻止UC浏览器向您发送弹出式新闻提醒,从系统层面减少打扰。 1、打开手机上的UC浏览器应用。 2、点击屏幕右下…

    2026年9月27日 • 用户投稿
    000
  • 跨平台无纸化会议安装指南

    跨平台无纸化会议安装指南跨平台无纸化会议安装指南跨平台无纸化会议安装指南跨平台无纸化会议安装指南

    无纸化会议的投屏功能通常依赖于windows或安卓系统,但本文提供一种兼容多种操作系统的部署方案,实现跨平台应用。无论使用windows、安卓、ios还是mac设备,均可顺利安装并运行无纸化会议系统,显著提升会议的便捷性与协作效率。 1、 首先将无纸化会议服务器部署至机柜中,接通网络与电源,后续无需…

    2026年9月27日 • 用户投稿
    400
  • windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法

    windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法windows蓝屏dpc_watchdog_violation如何解决_DPC_WATCHDOG_VIOLATION蓝屏错误解决方法

    1、DPC_WATCHDOG_VIOLATION蓝屏主因是DPC超时,常见于驱动、存储或固件问题;2、更新或回滚存储控制器驱动可解决兼容性问题;3、升级BIOS能修复硬件调度底层缺陷;4、禁用第三方杀毒软件避免内核干扰;5、运行内存诊断排除RAM故障;6、更新SSD固件或切换NVMe模式以稳定磁盘操…

    2026年9月27日 • 用户投稿
    000
  • Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员

    Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员Java:子类如何在不修改父类的情况下,通过重写方法间接利用父类私有成员

    在Java中,当子类需要在不修改父类的前提下,利用父类的私有成员时,直接访问是不允许的。本教程将展示如何通过调用父类的公共或保护方法(例如super.toString()),来间接利用父类内部已处理过的私有数据,尤其适用于重写方法并在此基础上扩展功能的情景。 Java封装性与私有成员:理解限制 ja…

    2026年9月27日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信