如何绕过 Google reCAPTCHA 使用 Selenium 进行测试
Posted
技术标签:
【中文标题】如何绕过 Google reCAPTCHA 使用 Selenium 进行测试【英文标题】:How to bypass Google reCAPTCHA for testing using Selenium 【发布时间】:2018-11-01 03:17:02 【问题描述】:我正在使用 Selenium 测试基于 Spring 的 Web 应用程序。您能否建议在测试应用程序时绕过 google reCAPTCHA 的解决方案。
我正在这个环境中运行自动化测试。所以手动检查reCAPTCHA的“我不是机器人”是不可能的。
出于测试目的,我在以下位置给出的测试环境中使用测试密钥。
Google reCAPTCHA Testing Key
我使用 Angular 5 作为我的应用程序的前端。我正在使用 ng-recaptcha 库在 ui 中添加 reCAPTCHA。
【问题讨论】:
reCapcha 的主要目的是防止:乌鸦和机器人访问当前表单/页面。如果你能破解这个防御,把你的简历发给谷歌。在您的情况下,只需模拟此服务。无需测试此服务。它正在工作:) @Zhivko.Kostadinov 我敢肯定,至少 乌鸦 无法回答带有Selenium
标记的问题 :)
哈哈 :) 我的意思是蜘蛛。哈哈哈:)
【参考方案1】:
您可以通过在 reCAPTCHA 中找到复选框的 x 和 y 坐标并单击该元素来完成此操作。
WebElement captcha = driver.findElement(By.xpath("html/body/div[1]/div[3]/div[2]/form/div[5]/div"));
builder.moveToElement(captcha, 50, 30).click().build().perform();
【讨论】:
builder
变量是什么?
它是 org.openqa.selenium.interactions.Action 对象。【参考方案2】:
我不知道您的确切代码,但您应该能够使用系统属性或某些标志来运行您的服务器,这些标志表明应该禁用 reCaptcha 并且不首先将其添加到表单中。
【讨论】:
这是可能的,但需要大量代码更改。但我正在寻找解决此问题的简单方法。 你应该小心,因为你正在做的是有效地创建一个允许绕过验证码的安全漏洞,这就是为什么它需要以这样的方式制作,这样就很难意外地做到这一点 这不是一个很好的解决方案,因为它在生产环境和测试环境之间引入了不必要的差异。更好的方法是使用测试键并找到模拟单击复选框的方法。【参考方案3】:您应该将驱动程序“切换”到 iFrame 以准确定位 reCaptcha 的复选框。 命令:
WebElement iFrame = driver.findElement(By.xpath("xpath_of_reCaptcha_iFrame"));
driver.switchTo().frame(iFrame);
// 现在可以点击reCaptcha的复选框了。
WebElement iFrame_checkbox =
driver.findElement(By.xpath("xpath_of_reCaptcha_checkbox"));
iFrame_checkbox.click();
【讨论】:
这应该是公认的答案。使用测试密钥并希望 selenium 在某些测试环境中对 reCaptcha 框执行实际点击是完全正当的。【参考方案4】:我没有找到任何可行的方法。如果您查看几乎所有 reCAPTCHA 的以下代码
第一个有 iframe :你可以切换到它 第二个影子根元素“#document”,我没有找到任何方法来覆盖它。我使用了 querySelector,对我不起作用。 但如果您传递 shadow-root 元素“#document”,则可以单击复选框或此处的第 3 个黄色标记。唯一的方法是解决这个问题,我们必须在较低的环境中禁用它并使用自动化进行测试。
如果有人找到正确的方法,请告诉我。
【讨论】:
以上是关于如何绕过 Google reCAPTCHA 使用 Selenium 进行测试的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Google Recaptcha v2 实施到限制访问 Google Recaptcha 的 Web 应用程序