javascript - Puppeteer 中的异步/等待等待页面加载

标签 javascript php async-await puppeteer

使用 async/await,我如何处理等待页面加载直到读取它?

我在网站上有一个长时间运行的 PHP cron。为了解决超时问题,它将问题分解为多个 block ,将浏览器重定向到下一步,最后以 die('Done'); 结束,这意味着页面的最终 html 看起来像这样这个。

<html>
    <head></head>
    <body>Done</body>
</html>

因此,在 Puppeteer 中,我尝试执行长时间运行的脚本,然后让它继续运行,直到“完成”结束我的测试。

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({args:['--no-sandbox']});
  const page = await browser.newPage();
  await page.goto('https://example.com/Test/', {waitUntil: 'networkidle2'}); //dev
  //await page.screenshot({path: 'example.png'});

  // Eventually if script runs, will get run in PHP die('Done') so select text and quit.
  // await page.waitForNavigation();
  let element = await page.$("body").catch(() => {});
  let text = await page.evaluate(element => element.textContent, element).catch(() => {});

  if (text == 'Done') {
    await browser.close();
  }
})();

现在在一个只进行重定向而不进行数据处理的测试站点上,它可以工作并关闭。在实际处理数据的页面上,我得到的只是 elementtext 的值都未定义。

最佳答案

如果你可以向像 <div id="done">Done!</div> 这样的元素添加一个 id那么你可以尝试使用 page.waitForSelector()方法如 await page.waitForSelector('#done') .

首先稍微修改一下 PHP,因为它一开始就没有发出有效的 HTML。请注意,这些等待会超时,因此请禁用超时。最后切换到text.includes用于检查,因为文本值周围可能有空格,导致其计算结果为 false。

海报的最终代码:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({args:['--no-sandbox']});
  const page = await browser.newPage();
  await page.goto('https://example.com/Test/', {waitUntil: 'networkidle2'});

  // Eventually if script runs, will get run in PHP die('Done') so select text and quit.
  await page.waitForSelector('#done', {timeout: 0});
  let element = await page.$("body").catch(() => {});
  let text = await page.evaluate(element => element.textContent, element).catch(() => {});

  if (text.includes("Done")) {
    await browser.close();
  }
})();

关于javascript - Puppeteer 中的异步/等待等待页面加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57729599/

相关文章:

javascript - Highchart 漏斗可视化的标签

php - 如何在 php 中仅向选定用户的电子邮件发送多封电子邮件?

javascript - React Native 和 FRebase : Making an async call seems to run through twice

jquery - 如何使用 jQuery 可排序接收和更新异步等待?

c# - 我是否将 JoinableTaskFactory 与 AspNetCore 一起使用?

javascript - 为什么它不断重复我正在更新的当前行?

javascript - 如何在 React Native 中设置 Redux?

javascript - 无法在鼠标悬停时显示工具提示,jquery1.11

PHP 不向 mysql 表插入数据

php - 伊伊 : Can't Sort CGridView Column When Using Database View as the Model