unit-testing - 如何使用 Jest 模拟远程网站对单元测试 Puppeteer 代码的响应?
问题描述
我正在为一个收集一些有用信息的网站实现一个网络抓取脚本。
脚本是使用 Puppeteer 库实现的,基本上是一组指令,例如:
- 启动无头镀铬
- 打开新标签/页面
- 从 HTML 中获取一些分页链接
- 打开找到的每个分页链接并从 HTML 中抓取一些信息
我正在寻找某种测试此功能的方法。理想情况下,我想做的是在测试文件夹中“预先保存”真实的 HTML 响应,然后模拟外部网站响应(确保它们始终相同)。然后断言收集的信息是正确的。
我熟悉几种能够模拟端点以fetch
在浏览器中运行的工具。我正在寻找类似的东西,但对于Puppeteer
.
到目前为止,我正在考虑的唯一解决方案是将browser
实例用作我的脚本的依赖项。然后模拟newPage
浏览器的方法返回一个带有自定义拦截器的页面。不过,这看起来需要做很多工作。
对此还有其他解决方案吗?
解决方案
一个简单的解决方案是将要测试的 HTML 页面(或其中的一部分)存储在本地,然后在 Puppeteer 中打开它。可以在 Puppeteer 中打开本地 HTML 网站。然后可以在 Mocha 或 Jest 等 Javascript 测试框架中测试结果。
如果您需要一个真正的 Web 服务器进行测试,另一种选择是使用Express之类的库来提供本地 HTML 页面作为 Web 服务器响应的模拟。您可以在这个搜索引擎抓取工具中找到一个示例,其中包含用于抓取各种搜索引擎的测试。
也可以模拟和存根 Puppeteer 函数,如launch
, goto
和$eval
. 这种方法需要很多存根方法。
推荐阅读
- ip-address - 从相同 IP 地址提交的 reCaptcha v3 问题
- amazon-s3 - 节点 S3 对象存储 Linode
- php - 从 sylius 订单表中删除数字属性
- caching - Memcached 集群成员之间的通信
- php - PHP使用子字符串作为标识符对字符串数组进行排序
- r - 以编程方式将文件传输到 R Shiny 应用程序
- reactjs - 三元算子真段中的for怎么办?
- angular - AES/CBC 在 golang 中加密,在 angular CryptoJS 中解密
- java - 显示数组列表中的字符串内容 (Android Studio)
- mongodb - 当不同的太大时,在数组中获取不同的值,16mb 上限