为了验证包含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。
非常感谢。
答案 0 :(得分:0)
这是我用于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),但这是我所能看到的最大改进。
答案 1 :(得分:0)
您可以将{1: 0.15000000000000002,
2: 0.25,
5: 0.1,
3: 0.25,
6: 0.15000000000000002,
4: 0.0}
替换为
browser.sleep('3000');
await browser.wait(
async () => (await element(by.css("#recaptcha-accessible-status")).getAttribute("textContent")) === "You are verified"
);
是一个隐藏字段,在验证码验证后会更改文本。