单击后如何让 Puppeteer waitForNavigation 工作
How to get Puppeteer waitForNavigation Working after click
我正在尝试让木偶操纵者等待导航完成,然后再继续下一个语句。基于 waitForNavigation() 的 Docs ,代码应该在下面工作。但它只是跳到下一条语句,我必须使用一种变通方法来等待响应中的特定 URL。
我也尝试了所有 waituntil 选项
(加载、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')
函数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();
我也遇到过同样的问题,我用的是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();
希望这能解决您的问题。
我正在尝试让木偶操纵者等待导航完成,然后再继续下一个语句。基于 waitForNavigation() 的 Docs ,代码应该在下面工作。但它只是跳到下一条语句,我必须使用一种变通方法来等待响应中的特定 URL。
我也尝试了所有 waituntil 选项
(加载、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')
函数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();
我也遇到过同样的问题,我用的是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();
希望这能解决您的问题。