这里的 stack_utils__WEBPACK_IMPORTED_MODULE_5_,
![](https://img.haomeiwen.com/i2085791/daf4bad597de1be7.png)
这些 imported module 可以在文件头看到:
![](https://img.haomeiwen.com/i2085791/648cee15eb7c5344.png)
harmony import:
![](https://img.haomeiwen.com/i2085791/15f2d3abe413ebdd.png)
cypress_runner.js 源码里这个 harmony import 的含义:
https://stackoverflow.com/questions/52871611/what-is-harmony-and-what-are-harmony-exports
其实就是 ES6 import 语法:
https://en.wikipedia.org/wiki/ECMAScript#4th_Edition_(abandoned)
As the first "ECMAScript Harmony" specification, it is also known as "ES6 Harmony".
Harmony 是项目代号
创建一个 chainer 实例,以便稍后访问:
![](https://img.haomeiwen.com/i2085791/a10d250cb192c5de.png)
chainer 实例的创建:
![](https://img.haomeiwen.com/i2085791/5fa2b28efdc599c9.png)
调用 chainer 实例的 visit 方法:
![](https://img.haomeiwen.com/i2085791/b4f2d62bffc28060.png)
chainer 实例原型链上有个 visit 方法:
![](https://img.haomeiwen.com/i2085791/d782394b05110da9.png)
参数为 visit 传入的 url 和 beforeHook:
![](https://img.haomeiwen.com/i2085791/6b125093be39e3ee.png)
这里 enqueue 的是创建好的 chainer id 和对应 command 的 name,参数。
![](https://img.haomeiwen.com/i2085791/b2f534709eed62fa.png)
单步调试进去:找到这个 commandFns 对象:
![](https://img.haomeiwen.com/i2085791/3e8d76a8019a686f.png)
visit 的实现也在里面:
![](https://img.haomeiwen.com/i2085791/e57c61d050500976.png)
这里能看到 visit 实现的具体位置:
![](https://img.haomeiwen.com/i2085791/cf8702f4f0d4a5c5.png)
单击这个超链接进去,设置一个断点:
![](https://img.haomeiwen.com/i2085791/d613331889ed7f9a.png)
然后继续执行 Cypress,断点触发,可以看到这个 visit 命令是如何得到调度的:
![](https://img.haomeiwen.com/i2085791/d5b7eff597f7dc4b.png)
这个 options 填充的代码,很像 AJAX 或者 fetch API 调用之前的 option 或者 header 填充准备工作:
![](https://img.haomeiwen.com/i2085791/dcdd1f2e2dae4050.png)
先把一个箭头函数赋给常量 const visit,然后立即执行这个箭头函数:
![](https://img.haomeiwen.com/i2085791/e6731b2a97a3dc57.png)
我们调用 cy.visit 时指定的 url 到哪里去了呢?
![](https://img.haomeiwen.com/i2085791/dc22c2d8fa7feb99.png)
继续执行,进入 then 指定的回调函数:
![](https://img.haomeiwen.com/i2085791/10ff06f5df354665.png)
![](https://img.haomeiwen.com/i2085791/04788c82b4feed09.png)
下图代码的意思是,调用 ../driver/src/cypress/utils.ts
文件里的工具函数:
![](https://img.haomeiwen.com/i2085791/fb204dcb68c0b0bc.png)
通过闭包维护的 url:
![](https://img.haomeiwen.com/i2085791/ec496c089e124e09.png)
为这个 url 封装一个对象:
![](https://img.haomeiwen.com/i2085791/818f345c0b860153.png)
终于看到曙光了,requestUrl 函数,看名字判断,应该离我们寻找的目标很接近了:
![](https://img.haomeiwen.com/i2085791/b727fbf5239f2d02.png)
requestUrl 函数的实现:
![](https://img.haomeiwen.com/i2085791/607ed599f803a77c.png)
当这个函数触发时,已经从 url 得到回应了,所以这里并不是我们要找的函数:
![](https://img.haomeiwen.com/i2085791/c7d1691374d92ad8.png)
收到的回应:
![](https://img.haomeiwen.com/i2085791/53c8a1eca8795057.png)
这个 bluebird 是什么鬼?
![](https://img.haomeiwen.com/i2085791/e6e00b3e9d27adbe.png)
![](https://img.haomeiwen.com/i2085791/682c99cc4159986e.png)
![](https://img.haomeiwen.com/i2085791/ea90111cbd87957f.png)
未完待续。
网友评论