Иногда «Ошибка: контекст выполнения был разрушен, скорее всего, из-за навигации». - PullRequest
1 голос
/ 29 мая 2020

У меня есть этот код:

(async function(){
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
try{
    await page.goto('https://erp2.webmaissistemas.com.br/csp/e8p7g7q/system/www/login.csp');

    await page.click('#UserName')
    await page.keyboard.type('123');

    await page.click('#Password')
    await page.keyboard.type('123');

    await page.click('#botaoLogin')

    await page.waitForNavigation()

    let form = await page.$('#form')
    if (form){
        let content = await form.$eval('.alert-danger', element => element.textContent)
        throw content
    }
    console.log('OK')
}
catch (e){
    console.log('Error: ', e)
}
})()

Иногда выдает сообщение «Ошибка: контекст выполнения был разрушен, скорее всего, из-за навигации».

Что такое решение?

1 Ответ

0 голосов
/ 30 мая 2020

Если я правильно помню (вы можете поискать проблемы с кукольниками в GitHub, чтобы найти это сообщение об ошибке), это обычная, но трудно решаемая проблема с некоторыми сайтами и навигацией в коде. Вы можете минимизировать его 1) с уменьшением опасности состояния гонки для событий щелчка и навигации и 2) с дополнительным ожиданием в течение некоторого времени после навигации или с ожиданием некоторого селектора:

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  try {
    await page.goto('https://erp2.webmaissistemas.com.br/csp/e8p7g7q/system/www/login.csp');

    await page.click('#UserName');
    await page.keyboard.type('123');

    await page.click('#Password');
    await page.keyboard.type('123');

    await Promise.all([
      page.waitForNavigation(),
      page.click('#botaoLogin'),
    ]);

    await page.waitForSelector('#form');

    const form = await page.$('#form');
    if (form) {
      const content = await form.$eval('.alert-danger', element => element.textContent);
      throw content;
    }
    console.log('OK');
  } catch (e) {
    console.log('Error: ', e);
  }
})();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...