Puppeteer:如何倾听innerHTML的变化

时间:2018-05-17 13:29:02

标签: javascript node.js puppeteer

我有一个聊天应用程序,其状态由此行代表:

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

我希望Puppeteer每次在此范围内的文本发生变化时都会记录。

首先说,状态是&#34;离线&#34;,然后它被更改为&#34;在线&#34;,然后过了一段时间到&#34;离开&#34;等等。我希望Puppeteer捕捉那些时刻和状态(离线&gt;在线&gt;离开)

我设法做的是:

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
) 

并将其置于循环中。这就是我挣扎的重点。

首先它给出了一个类型错误&#34; TypeError:将循环结构转换为JSON&#34;,这是由于传递的键值对不是原语,但即使我过度简化而只是做(按照{{ 3}}):

await page.waitForFunction(
  'document.querySelector("span#status").inner‌​Text === "Online"'
)
它没有产生任何结果。

总结:我期待

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

  2. 中的变化
  3. 返回新状态值

  4. 让流程循环运行

1 个答案:

答案 0 :(得分:1)

我只需使用回调设置递归函数:

keras_contrib
# Initialize vocab_size & embedding_weights
# Initialize C, U, N, M, H

model = Sequential()
embedding_layer = Embedding(vocab_size, N,
                            weights=[embedding_weights], mask_zero=True,
                            embeddings_regularizer=regularizers.l2(0.0001))
model.add(TimeDistributed(embedding_layer,
                          input_shape=(C, U)))
model.add(TimeDistributed(Bidirectional(LSTM(M // 2, return_sequences=True,
                                             kernel_regularizer=regularizers.l2(0.0001)))))
model.add(TimeDistributed(Dropout(0.2)))
model.add(TimeDistributed(GlobalMaxPooling1D()))
model.add(Bidirectional(LSTM(H // 2, return_sequences = True,
                             kernel_regularizer=regularizers.l2(0.0001))))
model.add(Dropout(0.2))
crf = CRF(num_tags, sparse_target=False, kernel_regularizer=regularizers.l2(0.0001))
model.add(crf)
model.compile(optimizer, loss = crf.loss_function, metrics=[crf.accuracy])