我想用伪娘测试一个网页的几个子页面。该网页对机器人具有一定的保护作用。我将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
答案 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
。由于脚本不再崩溃,因此循环将继续下一次迭代。