我需要能够在加载了Puppeteer的页面上拦截 XHR 请求并返回模拟响应,以便为我的 Web 应用程序组织后端测试。最好的方法是什么?
5 回答
似乎要走的路request.respond()
确实是,但我仍然无法在网上找到一个具体的例子来说明如何使用它。我这样做的方式是这样的:
// Intercept API response and pass mock data for Puppeteer
await page.setRequestInterception(true);
page.on('request', request => {
if (request.url() === constants.API) {
request.respond({
content: 'application/json',
headers: {"Access-Control-Allow-Origin": "*"},
body: JSON.stringify(constants.biddersMock)
});
}
else {
request.continue();
}
});
这里到底发生了什么?
- 首先,所有请求都被拦截
page.setRequestInterception()
if (request.url() === constants.API)
然后,对于每个请求,我都会通过 URL 将其与whereconstants.API
只是我需要匹配的端点进行匹配,从而查找我感兴趣的请求。- 如果找到,我通过我自己的响应
request.respond()
,否则我只是让请求继续request.continue()
还有两点:
constants.biddersMock
上面是一个数组- CORS 标头很重要,否则将不允许访问您的模拟数据
请评论或参考具有更好示例的资源。
出色地。在最新的 puppeteer 中,它提供了request.respond()
处理这种情况的方法。
如果有人感兴趣,我最终会为我的测试需求创建特殊的应用程序构建,它将Pretender添加到页面中。我使用 Puppeteer 的evaluate
方法与 Pretender 服务器进行通信。
这并不理想,但我无法找到一种方法来仅使用 Puppeteer 来实现我所需要的。有一种使用 Puppeteer 拦截请求的方法,但似乎无法为给定请求提供虚假响应。
更新:
正如 X Rene 所提到的,现在在 Puppeteer v0.13.0 中使用request.respond()方法对此提供了原生支持。我将重写我的测试以使用它而不是 Pretender,因为这将为我简化很多事情。
更新 2:
现在可以使用pptr-mock-server来完成此操作。在内部它依赖于请求拦截和request.respond()方法。库非常小,可能无法满足您的需求,但它至少提供了一个如何使用 Puppeteer 实现后端测试的示例。免责声明:我是它的作者。
我创建了一个使用 Puppeteer 的库,page.on('request')
并使用模拟page.on('response')
请求进行记录和响应。
https://github.com/axiomhq/puppeteer-request-intercepter
npm install puppeteer-request-intercepter
const puppeteer = require('puppeteer');
const { initFixtureRouter } = require('puppeteer-request-intercepter');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Intercept and respond with mocked data.
const fixtureRouter = await initFixtureRouter(page, { baseUrl: 'https://news.ycombinator.com' });
fixtureRouter.route('GET', '/y18.gif', 'y18.gif', { contentType: 'image/gif' });
await page.goto('https://news.ycombinator.com', { waitUntil: 'networkidle2' });
await page.pdf({ path: 'hn.pdf', format: 'A4' });
await browser.close();
})();
您可能想尝试Mockiavelli - 为 Puppeteer 请求模拟库。它专为 webapps 的后端测试而构建。它与 jest 和 jest-puppeteer 集成得最好,但适用于任何测试库。