Как правильно пройти систему reCaptcha с помощью Protractor - PullRequest
0 голосов
/ 14 ноября 2018

Чтобы проверить приложение, содержащее 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.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

вы можете заменить browser.sleep('3000'); на

await browser.wait(
  async () => (await element(by.css("#recaptcha-accessible-status")).getAttribute("textContent")) === "You are verified"
);

recaptcha-accessible-status - это скрытое поле, которое изменяет текст при проверке капчи.

0 голосов
/ 14 ноября 2018

Это код, который я использую для 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), но это самое большое улучшение, которое я вижу.

...