javascript - 捕获 waitForSelector 错误
问题描述
我使用一个名为Puppeteer的模块。
我尝试在我的页面上等待可能不会出现的选择器。在我采用的两种方法中,只有 try-catch 方法有效。
try-catch 块 - 工作
try {
await page.waitForSelector('.element');
//element appeared
} catch (error) {
//element did not appear
}
承诺链 - 不工作
await page.waitForSelector('.element')
.catch((error) => {
//element did not appear
})
.then(() => {
//element appeared
});
似乎waitForSelector
确实返回了 API 中指示的 Promise,但我不明白为什么后一种方法不起作用。无论如何它抛出了错误。
有没有人遇到过同样的问题?
解决方案
您应该重组您的 Promise Chaining 示例以在then()
方法之前使用该catch()
方法。
考虑使用以下示例page.waitForSelector()
:
// Correct Method
await page.waitForSelector('#example').then(() => {
console.log('SUCCESS');
}).catch(e => {
console.log('FAIL');
});
如果该元素不存在,FAIL
则将记录到控制台。否则,如果元素确实存在,则输出将为SUCCESS
.
另一方面,看看下面的例子,其中then()
和catch()
被颠倒了:
// Incorrect Method
await page.waitForSelector('#example').catch(e => {
console.log('FAIL');
}).then(() => {
console.log('SUCCESS - not necessarily');
});
如果元素不存在,FAIL
则将记录到控制台,但无论元素是否存在,SUCCESS
也会写入控制台。这是因为日志记录SUCCESS
是尝试捕获错误后链中的下一个直接步骤。
推荐阅读
- php - get_terms 忽略 WooCommerce 产品类别的 orderby 参数
- c++ - 在 Windows 10 上合成语音:找不到“Scenario_SynthesizeText.gh”文件
- graphql - 赛普拉斯中的“查找”是否等待 GraphQL 请求完成?
- c# - 如何获得派生方法来更改其基变量或对象之一,然后从类外部调用更改后的对象?
- python - ImportError:无法加载需要“tk”交互式框架的后端“TkAgg”,因为“无头”当前正在运行
- java - 如何修复组合框中的模糊项目
- python - 如何在不使用主键字段的情况下实现与同一张表的关系?
- swift - 如何将数据从集合视图单元拉到不同的视图控制器?
- python - 如何解决在 python3.7 中安装 pycsv 的错误?
- reactjs - 只有当它等于 action.id 时,如何告诉 redux 设置某个值