Как исправить Target при закрытой ошибке протокола, возникающей при команде WaitForSelector в Puppeteer? - PullRequest
0 голосов
/ 29 марта 2020

Я получаю «Target on closed Protocol Error» при использовании WaitForSelector, очень длинной строки в качестве селектора в Puppeteer, любая идея, как это исправить. Заранее спасибо. Эта ошибка возникает при последнем ожидании команды селектора между прочим.

 const puppeteer = require('puppeteer');
(async() => {
const browser = await puppeteer.launch({headless: false, args: ['--no-sandbox', '--disable-setuid-sandbox']});
const page = await browser.newPage();
await page.setViewport({width: 1280, height: 800});
try{
await page.goto('https://vorlesungsplan.dhbw-mannheim.de/');
await page.waitFor(500);
await page.waitForSelector("body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div:nth-child(14) > div > a");
await page.click("body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div:nth-child(14) > div > a");
await page.waitFor(500);
await page.waitForSelector("body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div.ui-block-c > div > a:nth-child(9)");
await page.click("body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div.ui-block-c > div > a:nth-child(9)");
await page.waitFor(500);
//await page.screenshot({
  //  path: './images/Dhbw.png'
//});
await page.waitForSelector("body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div.ui-block-a > div > ul > li.ui-li.ui-li-divider.ui-btn.ui-bar-b.ui-corner-top.ui-btn-up-undefined");

const element = await page.$('body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div.ui-block-a > div > ul > li.ui-li.ui-li-divider.ui-btn.ui-bar-b.ui-corner-top.ui-btn-up-undefined');
const text = await (await element.getProperty('textContent')).jsonValue();
console.log(text);
await page.close();
 await browser.close();
 process.exit();
 }catch(error){
     console.log(error);
 }

 })();

1 Ответ

0 голосов
/ 30 марта 2020

Проблема, кажется, связана с классом ui-btn-up-undefined, он не будет работать с типичными селекторами - я предполагаю, что это как-то связано с неопределенным присутствием в имени. Ниже работает для получения текста из всех элементов, которые имеют те же классы, которые похожи. Я не был уверен, какой именно вы хотели, но принцип тот же. У меня есть длинный waitFor, который вы можете удалить, сократить или оптимизировать.

const puppeteer = require("puppeteer");
(async () => {
  var browser = await puppeteer.launch({
    headless: false,
    args: ["--no-sandbox", "--disable-setuid-sandbox"]
  });
  const page = await browser.newPage();
  await page.setViewport({ width: 1280, height: 800 });
  try {
    await page.goto("https://vorlesungsplan.dhbw-mannheim.de/");
    await page.waitFor(500);
    await page.waitForSelector(
      "body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div:nth-child(14) > div > a"
    );
    await page.click(
      "body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div:nth-child(14) > div > a"
    );
    await page.waitFor(500);
    await page.waitForSelector(
      "body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div.ui-block-c > div > a:nth-child(9)"
    );
    await page.click(
      "body > div.ui-page.ui-body-a.ui-page-active > div.ui-content > div > div.ui-block-c > div > a:nth-child(9)"
    );
    await page.waitFor(500);

    // added below
    await page.waitForSelector(
      ".ui-li.ui-li-divider.ui-btn.ui-bar-b.ui-corner-top"
    );
    await page.waitFor(4000);
    const element = await page.$$(
      ".ui-li.ui-li-divider.ui-btn.ui-bar-b.ui-corner-top"
    );
    const arr = await Promise.all(
      element.map(async (i, elem) => {
        const hello = await (await i.getProperty("textContent")).jsonValue();
        return hello;
      })
    );
    console.log(arr);
  } catch (error) {
    console.log(error);
  } finally {
    browser.close();
  }
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...