【问题标题】:Puppeteer: how to listen for on innerHTML changePuppeteer:如何监听 innerHTML 的变化
【发布时间】:2018-05-17 22:20:08
【问题描述】:

我有一个聊天应用,其状态由这条线表示:

<span id='status'>Offline</span> 

并且我希望 Puppeteer 每次在此范围内的文本发生更改时都进行记录。

比如说,一开始状态是“离线”,然后又变成了“在线”,过了一段时间又变成了“离开”等等。我希望 Puppeteer 捕捉那些时刻和状态(离线>在线>离开)

我设法做到以下几点:

const page = await browser.newPage();
await page.goto('https://chat.com');
const statusHandle = await page.$('span#status');
let statusText = await page.evaluate(() => document.querySelector('#status').innerText);
let iniVal = {statusHandle,statusText };

此时我有statusHandle 和初始状态。

现在,我的理解(根据12)是我需要将两者结合起来

await page.waitForFunction(
  (iniVal) => iniVal.statusHandle.innerHTML !== iniVal.statusText, 
  { timeout: 0 }, 
  iniVal
) 

并将它放在一个循环中。这就是我苦苦挣扎的地方。

首先它给出了一个类型错误“TypeError: Converting circular structure to JSON”,这是由于传递的键值对不是原语,但即使我过度简化并且只是这样做(根据1):

await page.waitForFunction(
  'document.querySelector("span#status").inner‌​Text === "Online"'
)

它什么也没产生。

总结:我期待

  1. 让 Puppeteer 评估 document.querySelector('#status').innerText !== statusText 中的更改

  2. 返回新的状态值

  3. 让进程循环运行

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    我只是设置了一个带有回调的递归函数:

    async function monitor (selector, callback, prevValue) {
      const newVal = await page.$(selector);
      if (newVal !== prevValue) {
        callback(newVal);
      }
      /* add some delay */
      await new Promise(_ => setTimeout(_, 1000))
      /* call recursively */
      monitor (selector, callback, newVal);
    }
    
    monitor('span#status', status => {
      // Fires whenever `status` changes
    })
    

    【讨论】:

    • PS:我自己没试过,但这也可能有帮助:stackoverflow.com/questions/12421491/…
    • 谢谢您,抱歉耽搁了。我去了(经过轻微修改)递归函数,就像一个魅力。对于阅读的人 - 考虑在 N 次尝试后实现自动重启,因为(根据我的阅读)可能存在内存泄漏,也为了避免在获取页面时出现超时错误(发生在我身上一次),请执行以下操作 => 等待页面.goto('target.url', {waitUntil: 'domcontentloaded'});
    • 我们如何查看更改的 HTML、TEXT?
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多