node.js - puppeteer - 识别 reCaptcha 挑战何时变为活动/可见
问题描述
使用这个 reCaptcha 演示页面:https ://recaptcha-demo.appspot.com/recaptcha-v2-invisible.php
使用 puppeteer,我的目标是等待并确定挑战(必须从网格中选择特定图像)何时在页面上可见。我不是在问如何绕过或解决 reCaptcha,只是想知道它何时处于活动状态并准备好被解决。
通过 DevTools,我发现了代表可见 reCaptcha 挑战的 HTML 元素: recaptcha 元素树
不幸的是,我一直无法让 puppeteer “找到”特定元素。即使 reCaptcha 在浏览器中清晰可见并且#rc-imageselect
元素在元素树中可见,以下代码将始终打印“未找到”。我已经尝试过主框架、子框架等,但无法让 puppeteer 找到 reCaptcha 元素。
let recap = await myframe.$("body #rc-imageselect") //.rc-imageselect-payload") // #rc-imageselect
if (recap == null) {
console.log("imageselect NOT found")
} else {
console.log("imageselect found")
}
为什么这是必要的?在真实世界的页面(不是这个演示页面)上,reCaptcha 挑战不会为某些用户触发,只会为某些用户弹出。我的目标是确定它何时弹出,然后选择如何处理 reCaptcha,或者通过解决(单独,手动)、后退或完全放弃。
任何有关 puppeteer 代码以查找 reCaptcha 元素的帮助都将受到欢迎。谢谢你。
解决方案
有一些错误永远不会进入控制台,因此仍然无法识别,并且是由 iframe 内部的安全问题引起的(这始终是 Chrome/Chromium 浏览器的一个关键点)。您将需要以下安全禁用参数来启动 puppeteer,因为由于同源策略默认情况下不允许您进入 iframe。
const browser = await puppeteer.launch({
headless: true, args: ['--disable-web-security', '--disable-features=IsolateOrigins,site-per-process']
})
在 reCaptcha 场景中将始终需要这些参数。
推荐阅读
- axapta - X++ 将枚举值分配给表列
- c# - Google Drive v3 API 文件 - 指定 alt=media 时为 403
- regex - Atom 正则表达式替换为量词
- java - Junit 期望值异常
- javascript - Rxjs:防止将数据推送到服务之外的主题
- google-chrome - 1Password Chrome 扩展如何实现圆角?
- ios - 设置 button.frame.origin 不会快速更改 scrollView 中的位置
- python - 使用 import random python 生成不同的随机数
- database - 将数据导入 SiteFinity
- ionic-framework - 找不到错误 io.branch.referral.InstallListener 类崩溃 Ionic v5