puppeteer stop redirect 的正確姿勢及 net::ERR_FAILED 的解決

panyanyany發表於2019-02-26

在官方文件(puppeteer/api.md at master · GoogleChrome/puppeteer · GitHub)中,中斷 redirect 的標準做法是這樣的:

const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  await page.setRequestInterception(true);
  page.on('request', interceptedRequest => {
    if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg'))
      interceptedRequest.abort();
    else
      interceptedRequest.continue();
  });
  await page.goto('https://example.com');
  await browser.close();
});
複製程式碼

這樣一開始也是沒有什麼問題,但是偶爾會遇到這樣情況:

Error: net::ERR_FAILED at http://xxx.com/yyy

Google 了一輪,發現相關的 issue 很少,只找到了這麼一個: Page.setRequestInterception Redirection Issue · Issue #3421 · GoogleChrome/puppeteer ·…

官方已經把它定義為一個 Bug 了,也有一些相關的解決方案:umbrella Fix Request Interception · Issue #3471 · GoogleChrome/puppeteer · GitHub

不過其他人遇到的情況是 abort() 之後無法結束的問題,而我是丟擲異常的問題,所以我自己摸索了一下,總結出一個比較合適的辦法: 就是用 respond 代替 abort。

比如:

// request.abort();
request.respond({
  status: 404,
  contentType: 'text/plain',
  body: 'Not Found!',
});
複製程式碼

相關文章