TypeError: response.postData is not a function

TypeError: response.postData is not a function

我下面的代码给出了错误“TypeError:response.postData 不是一个函数”。

const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')

var url = ("https://www.adidas.com.tr/yeezy/product/GY1759")

function main(){
  puppeteer.use(StealthPlugin())
  puppeteer.launch({ headless: false }).then(async browser => {
    const page = await browser.newPage()
    await page.goto(url)
    await page.mouse.click(1000, 40);
    await page.on('response', response => {
      if (response.url() === "https://www.adidas.com.tr/rhsYl92ry/P4YX/xsLtQ/uJuJSkf31r/JGkkPDcC/QGBAD/nlbSQI"){
        console.log(response.postData())
      }
    });
  })
}
main()

我想获取请求的 post 数据,我该怎么做?

Error = "TypeError: response.postData 不是一个函数"

正在阅读 Response type definition for Puppeteer,看来您还有其他方法可以使用。

await response.json()(await response.buffer()).toString()

这里有几个潜在的误解:

  1. page.on 不是 return 承诺,它注册了一个在事件触发时异步运行的回调。它对 await page.on 具有误导性,因为它使您的代码看起来像是在等待某些东西,但实际上不会。如果你想让你的代码等待它,你需要承诺处理程序,或者链接所有依赖于回调结果的代码。
  2. click(),然后on()可能不是你想要的。通常,您注册 on() 事件侦听器,然后触发触发您要捕获的请求的事件。否则,响应可能会在您有机会设置 on() 侦听器之前到达。

回答你的主要问题,你可以access the original request on the response to get the post data: response.request().postData(). Note that this is form data only, not a JSON payload (adding a "Content-Type": "application/json" header and proper JSON body results in undefined -- see issue #5178)。您可能还想直接使用 page.on("request", ...),但不清楚您的最终目标是什么。

由于您的代码对我不起作用(hard-coded 坐标点击非常脆弱;更喜欢先进行选择然后点击您定位的元素),我将分享一个最小的、可运行的您可以推断出您的需求的示例:

const puppeteer = require("puppeteer"); // ^13.5.1

const html = `
<body>
<script>
fetch("https://httpbin.org/post", {
  method: "POST",
  body: "foo=bar",
});
</script>
</body>
`;

let browser;
(async () => {
  browser = await puppeteer.launch({headless: true});
  const [page] = await browser.pages();
  const responsePromise = new Promise(resolve => {
    const handler = response => {
      if (response.url() === "https://httpbin.org/post") {
        page.off(handler);
        resolve(response.request().postData());
      }
    };
    page.on("response", handler);
  });
  await page.setContent(html);
  const postData = await responsePromise;
  console.log(postData); // => foo=bar
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close())
;

请注意,所有这些都是迂回的,主要用于说明目的。一种更简洁的方法是使用 page.waitForResponse ,它不需要像 on() 那样的 promisification:

// same html and require as above

let browser;
(async () => {
  browser = await puppeteer.launch({headless: true});
  const [page] = await browser.pages();
  const responsePromise = page.waitForResponse(response =>
    response.url() === "https://httpbin.org/post"
  );
  await page.setContent(html);
  const response = await responsePromise;
  console.log(response.request().postData()); // => foo=bar
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close())
;