Есть ли способ дождаться добавления содержимого динамического c после page.click () в puppeteer? - PullRequest
1 голос
/ 11 марта 2020

Я пишу код, который очищает сайт Trailblazer . Веб-сайт Dynami c один, поэтому, когда я нажимаю кнопку Показать больше , он загружает другие значки, принадлежащие пользователю. Итак, есть ли у меня возможность нажать на эту кнопку, а затем дождаться добавления нового контента, прежде чем загружать разметку в cheerio для очистки.

В настоящее время я просто заставляю броузера ждать 3 секунды, прежде чем повторно нажмите, но это заставляет весь процесс занимать много времени, и он может также потерпеть неудачу, если браузер не может извлечь в это время.

Так есть ли альтернатива этому? Пожалуйста, найдите мой код ниже ->

    const url = "https://trailblazer.me/id/akganesa";

  // function to load the page
    async function getPage() {
    const browser = await puppeteer.launch({headless: true});
    const page = await browser.newPage();
    await page.goto(url, {waitUntil: 'networkidle0'});

    const [first_button] = await page.$x("//button[contains(., 'Show More')]");
    await first_button.click();
    while (
      (await (await page.$x("//button[contains(., 'Show More')]")).length) > 0
    ) {
      const [button] = await page.$x("//button[contains(., 'Show More')]");
      await button.click();
      await page.waitForResponse(response => response.status() === 200);
    }

    const html = await page.content(); // serialized HTML of page DOM.
    await browser.close();
    return html;
  }

      // using cheerio to scrape
      const html = await getPage();
      const $ = cheerio.load(html);

1 Ответ

2 голосов
/ 12 марта 2020

Код ниже работает для того, что вы спрашиваете. Причина, по которой я нажимаю [first_button] перед вводом while l oop, заключается в том, что первая кнопка «показать больше» фактически не выполняет сетевой запрос.

const go = async () => {
  const browser = await puppeteer.launch({
    headless: false,
    args: [
      "--no-sandbox",
      "--disable-setuid-sandbox",
      "--window-size=1600,1200"
    ],
    defaultViewport: null
  });
  const context = await browser.createIncognitoBrowserContext();
  const page = await context.newPage();
  try {
    await page.goto("https://trailblazer.me/id/akganesa", {
      waitUntil: "networkidle2"
    });
    const [first_button] = await page.$x("//button[contains(., 'Show More')]");
    await first_button.click();
    while (
      (await (await page.$x("//button[contains(., 'Show More')]")).length) > 0
    ) {
      const [button] = await page.$x("//button[contains(., 'Show More')]");
      await button.click();
      await page.waitForResponse(response => response.status() === 200);
    }
    browser.close();
    return;
  } catch (err) {
    console.log(err);
    browser.close();
    return;
  }
};

go();
...