Как заставить Puppeteer waitForNavigation работать после нажатия - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь заставить кукловода дождаться окончания навигации, прежде чем перейти к следующему утверждению. Основываясь на Docs для waitForNavigation (), код должен работать ниже. но он просто переходит к следующему утверждению, и мне приходится использовать обходной путь для ожидания определенного 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')

1 Ответ

0 голосов
/ 07 сентября 2018

Функция 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...