如果页面中不存在DOM元素,如何移动到下一个迭代?

时间:2019-05-06 20:24:55

标签: javascript node.js puppeteer

我想用伪娘测试一个网页的几个子页面。该网页对机器人具有一定的保护作用。我将URL放在一个数组中,然后遍历该数组。

由于遇到了几个问题,我陷入了如何重新编写代码的困境:由于受到机器人程序的保护,该页面在实际加载实际内容之前向浏览器发送了一些“伪加载”状态。因此,因此,我认为我必须等待一些DOM元素。

def better_check_for_things(things,seq):
    k = deque(things)
    for c in seq:
        if c == k[0]:
            k.popleft()
        if not k:
            break

    return not k  # if you popped all from k you are done

print( better_check_for_things(list("ahz"), list('abhgz')))
print( better_check_for_things(list("ahiz"), list('abhgz')))

,以确保内容已加载。 (由于机器人程序的保护,导致page.evaluate无法正常工作,它会在第一个“伪装”标志上触发)。

但这是另一个问题:如果页面无法正确加载(例如,由于连接超时),我将遇到未处理的承诺拒绝错误,并且迭代将停止,程序的执行将停止。

我的目标是,如果在加载页面时出现任何错误,请跳过当前迭代并移至下一个迭代,而不会导致程序崩溃。但是我必须保留

await page.waitForSelector('div.site__content');

也一样。 我该如何实现?

await page.waitForSelector

1 个答案:

答案 0 :(得分:2)

当拒绝并没有捕获承诺时,将引发“未处理的承诺拒绝错误”。如果像您的情况一样,在异步代码块内引发异常,就暗含这种情况。

要捕获引发的异常,只需在循环内使用try..catch块即可。

代码示例

for (let id in filteredIds) {
  try {
    // your code
  } catch (err) {
    console.log(`Iteration for ${id} failed with error: ${err.message}`);
  }
}

此代码应捕获代码产生的所有错误,但if (err) throw err;中的fs.writeFile除外,因为此回调是异步调用的,因此在try..catch块之外执行。但是您可以简单地使用新的fs.promises.writeFile来捕获该错误。

万一引发错误,将调用脚本的catch (err) { ... }部分,该日志记录错误消息以及发生错误的id。由于脚本不再崩溃,因此循环将继续下一次迭代。