cypress - 如何查询通过在测试 Web 组件时使用 Cypress
问题描述
在为端到端测试测试一个全局 DOM 多年后,我发现测试使用插槽的 Web 组件非常困难,甚至不可能。在我解释这个问题之前,我想说我不能改变生成的标记来改进它们。
<wc-1 attributes-etc="">
<wc-2 attributes-etc="">
<slot>
<wc-3 attributes-etc="">
<slot>
...eventually get to an input...
<input type="text" name="firstName" />
有来自某种表单构建器的大量嵌套 Web 组件,并且还使用了很多插槽。Web 组件具有属性,但插槽从不具有,因此我使用 Web 组件名称进行查询。
document.querSelector('wc-1')
.shadowRoot.querySelector('wc-2')
.shadowRoot.querySelector('slot')
// Yields <slot>...</slot>
到目前为止一切都很好,赛普拉斯有一个.shadow()
我使用的命令,但我在这里只使用 devtools 进行测试,以查看插槽具有的所有属性。
document.querSelector('wc-1')
.shadowRoot.querySelector('wc-2')
.shadowRoot.querySelector('slot')
.shadowRoot
// Yields "null".
// I don't know how to get to the .lightDOM? of wc-2?
我尝试的任何属性最终都为 null 或返回值中有 0 个元素。使用其他前端工具和全局 DOM,我总是可以cy.get('div[data-testid="the-nested-element-i-want"]').type('important words')
在一个命令中完成。
所以我的主要问题是:一旦 Web 组件开始堆积,人们如何测试这些东西?或者不这样做,只在隔离/单元测试中测试 Web 组件,因为查询嵌套的影子 DOM 非常困难?
主要目标是最终获得一个表单输入cy.get('input[name"firstName"]').type('John')
。在我的示例中,有人可以给我链接docuement.querySelector()
命令吗?<wc-3>
解决方案
答案涉及assignedNodes()
:https ://developer.mozilla.org/en-US/docs/Web/API/HTMLSlotElement/assignedNodes
HTMLSlotElement 接口的assignedNodes() 属性返回分配给此插槽的节点序列...
使用 that vs. 对我来说没有任何区别assignedElements()
。因此,您所要做的就是在查询到所需的插槽后使用该方法。对于我的例子,答案是:
const wc-3 = document.querySelector('wc-1').shadowRoot
.querySelector('wc-2').shadowRoot
.querySelector('slot').assignedNodes()
.map((el) => el.shadowRoot)[0]
然后你可以继续往下走......我知道我只有一个未命名的插槽,所以这就是我从返回的.map()
.
这个问答的道具为我指明了正确的方向:Web 组件:如何与孩子一起工作?
推荐阅读
- github - 如何在 GitHub 上查看 folium 保存的 html?
- python-3.x - 共享主机上的 Django 应用程序依赖项(Cpanel)
- python-3.x - 如何找出一个txt文件的写入方法?
- react-native - 用谷歌表格反应原生
- javascript - 如何在单击由 JS 生成的特定元素时添加颜色
- c# - 如何为控制台应用程序制作一个合适的 C# 菜单?
- unity3d - 计算新平台生成之间的冷却时间。统一
- python - 无法在上传的图像和模板 django 之间建立联系
- c# - 将数组的json数组反序列化为C#中的字符串列表
- javascript - 如何在 Node.js 中运行函数