首页 > 解决方案 > 如何使用 Protractor 正确通过 reCaptcha 系统

问题描述

为了验证包含 reCaptcha 的应用程序,我编写了一个简单的函数,如下所示:

it('And I validate the captcha.', function () {

        registration.clickOnCaptcha();

});

clickOnCaptcha() 看起来像这样:

this.clickOnCaptcha = function() {

    // Switch to the iFrame where the captcha is
    browser.driver.switchTo().frame(0);

    // Disable waitForAngular since the iFrame is not in Angular
    browser.waitForAngularEnabled(false);

    browser.element(by.id('recaptcha-anchor')).click();

    // Dirty way to allow Captcha animation to finish
    browser.sleep('3000');

    // Enable waitForAngular before going back to the main frame
    browser.waitForAngularEnabled(true);

    // Switch back to the main frame
    browser.switchTo().defaultContent();
};

我想知道你们中的一些人是否找到了更好的方法来做到这一点?

此外,我想知道禁用 waitForAngular 功能的最佳方法是在切换到 iFrame之前还是之后执行它。

非常感谢。

标签: protractorrecaptcha

解决方案


这是我用于 reCaptcha 的代码

let recaptcha = $(iframeString); //String is previously built depending on page I am on
await browser.wait(until.visibilityOf(recaptcha),browser.params.longWait);
await util.scrollTo(recaptcha); //Sometime reCaptcha is out of view. This function brings it into view
let elem = await browser.driver.findElement(by.css(iframeString));
await browser.waitForAngularEnabled(false);
await browser.switchTo().frame(elem);
await $('#recaptcha-anchor').click();
await browser.switchTo().defaultContent();
await browser.waitForAngularEnabled(true);
await browser.sleep(1500); // Waiting for the reCAPTCHA to load

这与您执行此操作的方式非常相似。我建议切换到特定的 reCaptcha 框架而不是 frame(0),但这是我能看到的最大改进。


推荐阅读