Cypress 里的 ensureAttached 检测原理

简介: Cypress 里的 ensureAttached 检测原理

下面是我用 Cypress 开发的端到端测试。click 调用里的 force:true 参数是我后来加上去的。

68.png

如果不添加,会遇到错误消息:

image.png

在方法 $Cy.ensureAttached 里面跑出来的,这个方法位于 runner/cypress_runner.js 下面。

我想知道这个 cypress_runner.js 的本地位置:

image.png

本地请求的 url:http://localhost:4200/__cypress/runner/cypress_runner.js

远端端口:59701?

image.png

重定向到 __?

image.png

这个文件有20万行代码:

image.png

怀疑这个庞大的文件是 merge 起来的:

image.png

这里能看到所有的 ensure 检查:

72.png

断点触发时,从 callstack 是很难发现到底是哪一行 e2e spec 代码触发的这个 ensureAttached 检查:

73.png

但是可以通过输入参数里指定的 select,到 e2e 代码里搜索:

74.png

cx-hamburger-menu [aria-label=“Menu”]

In browsers,

通过参数说明,点击了 cx-hamburge 的 button 元素:

75.png

很容易就找到了:

76.png

具体逻辑就是,检查元素的 ownerDocument 属性:

77.png

这是 Web API 里 Node 元素的标准属性,见官网。

接口的只读 ownerDocument 属性: 返回节点的顶级文档对象。

使用例子:

// Given a node "p", get the top-level HTML
// child of the document object
const d = p.ownerDocument;
const html = d.documentElement;

然后再判断这个 document 对象,是否有 activeWindow:

  return nodes.every(node => {
    const doc = _document__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].getDocumentFromElement(node);
    if (!_document__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].hasActiveWindow(doc)) {
      return false;
    }
    return node.isConnected;
  });
};

这里 Cypress 还针对 firefox 进行了不同的处理:

image.png

因为在 firefox 里,即使 detached document, 也还保留了一个指向 window 的 reference.

const hasActiveWindow = doc => {
  // in firefox, detached documents still have a reference to their window
  // but document.location is null
  if (Cypress.isBrowser('firefox') && !doc.location) {
    return false;
  }
  return !!doc.defaultView;
};

defaultView 是 Web API 另一个标准的接口

In browsers, document.defaultView returns the window object associated with a document, or null if none is available.

这个也是只读属性,返回 document 关联的 window 对象。如果元素所在的 document 对象已经 detach from DOM,则 defaultView 指向 null.

node.isConnected:

78.png

接口 的只读isConnected属性 返回一个布尔值,指示节点是否(直接或间接)连接到上下文对象,例如Document(普通 DOM 情况下的对象),或ShadowRoot 影子 DOM 情况下的对象。

目录
相关文章
|
4月前
|
编解码 JavaScript 前端开发
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
142 1
|
6月前
|
测试技术 UED
Mock 工具使用 - 模拟弱网测试
在移动互联网时代,弱网测试至关重要,尤其面对多样化的网络环境和应用场景,如2G, 3G, 4G及弱信号WiFi。弱网通常指低于3G的网络或弱信号WiFi。Charles工具能方便地模拟不同网络条件,包括带宽、丢包和延迟,以进行功能测试和优化用户体验。通过Proxy -> Throttle Setting启用限制,选择预设或自定义参数(如下载速度、带宽和延迟)进行测试。通过基础模拟和定制设置,确保移动端应用在弱网环境下的稳定性和性能。
|
7月前
|
测试技术 Android开发 索引
XPath定位如何在App自动化测试中大显神威
本文介绍了如何在Appium中使用XPath进行自动化App测试。通过淘宝App实例,展示了XPath在定位元素上的应用,包括基础定位(如通过text、resource-id、class和content-desc属性),contains模糊定位,组合定位以及层级定位(如父、子、兄弟和祖元素定位)。XPath的灵活性和强大功能使得在Appium中高效地定位元素成为可能,从而提升移动应用的测试效率。
|
7月前
|
JSON JavaScript 前端开发
JS逆向快速定位关键点之9大通用hook脚本
JS逆向快速定位关键点之9大通用hook脚本
350 0
|
JSON 文字识别 算法
AdaDet检测工具箱:一行代码玩转检测算法
当前,非专业算法人员使用众多检测算法时,仍然会面临诸多挑战: 第一,检测算法包含多种类型,比如通用检测、垂类检测、人脸检测等,如何快速体验? 第二,每个算法类型包含不同的模型结构,有模型可能更注重于精度,有模型更注重于效率,如何选型? 第三,当前下游任务的开发样例较少,如何着手开发? 为了降低检测算法的使用门槛,我们推出了AdaDet检测工具箱。
|
Dart IDE Java
Flutter语法检测及原理剖析-Fair语法检测实践
Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。Fair 是 58 技术开源的一个 Flutter 动态化的框架,能够实现UI和逻辑的动态化。
190 0
Flutter语法检测及原理剖析-Fair语法检测实践
Cypress系列(5)- 自定义 Cypress
Cypress系列(5)- 自定义 Cypress
232 0
Cypress系列(5)- 自定义 Cypress
Cypress系列(0)- 如何学习 Cypress
Cypress系列(0)- 如何学习 Cypress
320 0
Cypress系列(0)- 如何学习 Cypress
|
Web App开发 JSON JavaScript
Cypress系列(2)- Cypress 框架的详细介绍
Cypress系列(2)- Cypress 框架的详细介绍
863 0
Cypress系列(2)- Cypress 框架的详细介绍
|
JavaScript
Cypress系列(6)- Cypress 的重试机制
Cypress系列(6)- Cypress 的重试机制
232 0
Cypress系列(6)- Cypress 的重试机制