how do POST request in puppeteer?

白昼怎懂夜的黑 提交于 2019-12-09 09:51:37

问题


(async() => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.example.com/search');
    const data = await page.content();
    browser.close();
    res.send(data);
})();

I do this code for send get request. I don't understand how I should send post request?


回答1:


Getting the "order" right can be a bit of a challenge. Documentation doesn't have that many examples... there are some juicy items in the repository in the example folder that you should definitely take a look at.

https://github.com/GoogleChrome/puppeteer/tree/master/examples

Here is the example; place the following into an async block:

    // Create browser instance, and give it a first tab
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // Allows you to intercept a request; must appear before
    // your first page.goto()
    await page.setRequestInterception(true);

    // Request intercept handler... will be triggered with 
    // each page.goto() statement
    page.on('request', interceptedRequest => {

        // Here, is where you change the request method and 
        // add your post data
        var data = {
            'method': 'POST',
            'postData': 'paramFoo=valueBar&paramThis=valueThat'
        };

        // Request modified... finish sending! 
        interceptedRequest.continue(data);
    });

    // Navigate, trigger the intercept, and resolve the response
    const response = await page.goto('https://www.example.com/search');     
    const responseBody = await response.text();
    console.log(responseBody);

    // Close the browser - done! 
    await browser.close();



回答2:


For POST you should do the following:

  • Set for the page's request to be intercepted: page.setRequestInterception();
  • Get the request object by setting up a handler for the 'request' event: page.on('request', function(){})
  • Set the request's method (POST) and postData as overrides using request.continue([overrides])

See Puppeteer's API docs here: https://github.com/GoogleChrome/puppeteer/blob/HEAD/docs/api.md




回答3:


Here the complete example with Puppeteer 2.0.0 :

const puppeteer = require("puppeteer");
const devices = require("puppeteer/DeviceDescriptors");

async function main() {
  const browser = await puppeteer.launch({
    args: ["--enable-features=NetworkService", "--no-sandbox"],
    ignoreHTTPSErrors: true
  });
  const page = await browser.newPage();

  await page.setRequestInterception(true);

  page.once("request", interceptedRequest => {
    interceptedRequest.continue({
      method: "POST",
      postData: "foo=FOO&bar=BAR",
      headers: {
        ...interceptedRequest.headers(),
        "Content-Type": "application/x-www-form-urlencoded"
      }
    });
  });

  const response = await page.goto("https://postman-echo.com/post");

  console.log({
    url: response.url(),
    statusCode: response.status(),
    body: await response.text()
  });

  await browser.close();
}

main();

Note that if you check response.request().method() it won't be updated (still GET)



来源:https://stackoverflow.com/questions/47060534/how-do-post-request-in-puppeteer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!