puppeteer - 确定 reCaptcha 挑战何时变为 active/visible

puppeteer - identify when reCaptcha challenge becomes active/visible

使用此 reCaptcha 演示页面:https://recaptcha-demo.appspot.com/recaptcha-v2-invisible.php

使用 puppeteer,我的目标是等待并确定挑战(必须从网格中选择特定图像)何时在页面上可见。我不是在问如何绕过或解决 reCaptcha,只是想知道它何时处于活动状态并准备好被解决。

通过 DevTools,我找到了代表可见 reCaptcha 挑战的 HTML 元素: recaptcha element tree

不幸的是,我无法让木偶操纵者"find"具体元素。以下代码将始终打印 "NOT found" 即使 reCaptcha 在浏览器中清晰可见并且 #rc-imageselect 元素在元素树中可见。我已经对主框架、子框架等进行了试验,但一直无法让木偶操纵者找到 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,通过解决(单独手动)、后退或完全放弃。

非常欢迎任何有关查找 reCaptcha 元素的伪造代码的帮助。谢谢。

有一些错误永远不会进入控制台,因此仍然无法识别,并且是由 iframe 内部的安全问题引起的(这始终是 Chrome/Chromium 浏览器的关键点)。您将需要以下安全禁用参数来启动 puppeteer,因为由于同源策略,默认情况下不允许您进入 iframe。

const browser = await puppeteer.launch({
    headless: true, args: ['--disable-web-security', '--disable-features=IsolateOrigins,site-per-process']
})

在 reCaptcha 场景中始终需要这些参数。

您不需要进入 iframe DOM,您可以通过检查 iframe 元素来解决:

let height = await page.evaluate(() => document.querySelector('iframe[title="recaptcha challenge"]').offsetHeight)

根据我的经验,在处理验证码时不必使用特殊标志启动。

这也适用于我

let height = await page.evaluate(() => document.querySelector('iframe[title="recaptcha challenge"]').offsetHeight)

但出于某种原因,高度始终为 150,除非我这样做

await page.waitFor(8000)

我 运行 很忙,所以我可以看到验证码已经可见了...但是在等待 8 秒后它只显示高度 >150.. 非常烦人