单击后如何获取Puppeteer waitForNavigation工作

时间:2018-09-06 20:40:17

标签: node.js puppeteer

我正试图让伪娘等待导航完成,然后再继续下一条语句。基于Docs for waitForNavigation(),代码应在下面工作。但是它只是跳到下一条语句,我必须使用一种变通办法来等待响应中的特定URL。

我也尝试了所有的waituntil选项
 (load,domcontentloaded,networkidle0和networkidle2)。

任何能使我正常工作的想法都值得赞赏。

const browser = await puppeteer.launch({
  headless: false,
})
const page = await browser.newPage()
const home = page.waitForNavigation()
await page.goto(loginUrl)
await home

const login = page.waitForNavigation()
await page.type('#email', config.get('login'))
await page.type('#password', config.get('password'))
await page.click('#submitButton')
await login // << skips over this

// the following line is my workaround and it works , but ideally I don't want 
// to specify the expected "after" page each time I navigate
await page.waitForResponse(request => request.url() === 'http://example.com/expectedurl')

2 个答案:

答案 0 :(得分:2)

函数page.waitForNavigation()等待导航开始和结束。

导航已通过page.click()启动。

因此,您可以使用Promise.all()来避免上述功能之间的竞争状态:

const browser = await puppeteer.launch( { 'headless' : false } );
const page = await browser.newPage();

await page.goto( loginUrl );

await page.type( '#email', config.get( 'login' ) );
await page.type( '#password', config.get( 'password' ) );

await Promise.all([
    page.click( '#submitButton' ),
    page.waitForNavigation( { 'waitUntil' : 'networkidle0' } )
]);

await browser.close();

答案 1 :(得分:1)

我遇到了同样的问题,我使用了 pending-xhr-request

它在预期请求时解决了很多问题,但是当我有延迟请求时我遇到了很多问题,我花了一段时间来解决问题,所以我构建了一个包 Puppeteer-response-waiter 来做到这一点

const puppeteer = require('puppeteer');
const {ResponseWaiter} = require('puppeteer-response-waiter');

let browser = await puppeteer.launch({ headless: false });
let page = await browser.newPage();
let responseWaiter = new ResponseWaiter(page);
await page.goto('http://somesampleurl.com');
// start listening
responseWaiter.listen();
// do something here to trigger requests
await responseWaiter.wait();
// all requests are finished and responses are all returned back

// remove listeners
responseWaiter.stopListening();
await browser.close();

希望这能解决您的问题。