Puppeteer获取请求重定向

时间:2018-02-26 10:56:56

标签: javascript puppeteer google-chrome-headless

有没有办法使用puppeteer来获取请求的响应正文(如果有的话)的重定向?

我实现了以下代码,但我找不到获取重定向的方法......

const page = await browser.newPage()

page.on('request', (data) => console.log(data));    

await page.on('response', response => {
    const url = response.url();
    response.buffer()
    .then (
        buffer => {
            bufferString = buffer.toString();         
        },
        error => {
          console.log(error)
        }
    )
})

await page.goto('https://www.ford.com', {waitUntil: 'networkidle0'});

3 个答案:

答案 0 :(得分:3)

只需检查response.status()处理程序中的response - 重定向将为3xx:

page.on('response', response => {
  const status = response.status()
  if ((status >= 300) && (status <= 399)) {
    console.log('Redirect from', response.url(), 'to', response.headers()['location'])
  }
})

(重定向通常在响应正文中没有任何有趣的内容,因此您可能不希望为它们调用response.buffer()。)

答案 1 :(得分:1)

这应该适用于每种重定向类型:服务器端和客户端(元刷新,JS等)

const page = await browser.newPage()

const redirects = [];

const client = await page.target().createCDPSession();
await client.send('Network.enable');
await client.on('Network.requestWillBeSent', (e) => {
    if (e.type !== "Document") {
        return;
    }
    redirects.push(e.documentURL);
});

await page.goto('https://www.ford.com');
await page.waitForNavigation();

console.log(redirects);

类似的东西。

答案 2 :(得分:0)

您需要检查响应URL,因为在重定向的情况下,可以调用多个URL,我认为只有第一个是301。

请注意,我的代码中的expect来自chai库,但这是可选的,可以用其他方法来断言。

const webpage = await browser.newPage();
webpage.once('response', response => {
  if (response.url() === 'https://www.ford.com') {
    expect(response.status()).equals(301);
  }
})
await webpage.goto('https://www.ford.com');