如何处理量角器中的模态对话框?

时间:2015-03-28 23:12:30

标签: angularjs selenium modal-dialog protractor

我想在this网站上的模态对话框中使用sendKeys()。单击登录按钮后会出现此对话框。我似乎无法找到任何方法将焦点切换到盒子上。请参阅gist

我尝试在

中使用browser.driver.switchTo().activeElement();
InvalidLogInUnSuccess: {
        get: function () {
            this.loginButton.click();
            browser.driver.switchTo().activeElement();
            this.email.sendKeys("Test");
        }
    }

没有运气并且抛出 ElementNotVisibleError

  

消息:        ElementNotVisibleError:元素不可见     (会话信息:chrome = 41.0.2272.101)     (驱动程序信息:chromedriver = 2.14.313457(3d645c400edf2e2c500566c9aa096063e707c9cf),platform = Windows NT 6.3 x86_64)      堆栈跟踪:        ElementNotVisibleError:元素不可见

2 个答案:

答案 0 :(得分:4)

我在使用动画效果打开弹出窗口时测试内部应用程序时遇到了类似问题(我认为这是罪魁祸首)让我考虑等待弹出窗口内的一个元素变得可见。

在这种情况下,

visibilityOf expected condition对我有用:

var email = element(by.css('.container.login.ng-scope #email'));
browser.wait(EC.visibilityOf(email), 5000);

email.sendKeys('test');

其中EC是我通常在onPrepare()

中全局定义的内容
onPrepare: function () {
    ...

    global.EC = protractor.ExpectedConditions;
},

只是旁注,我认为可以在这里改进定位器:

  • ng-scope不是我依赖的东西
  • model字段中定义了email,如何:

    element(by.model('email'));
    

仅供参考,我执行的完整规范:

"use strict";

describe("gifteng test", function () {
    var scope = {};

    beforeEach(function () {
        browser.get("http://www.gifteng.com/?login");
        browser.waitForAngular();
    });

    describe("Logging in", function () {
        it("should send keys to email", function () {
            var email = element(by.css('.container.login.ng-scope #email'));
            browser.wait(EC.visibilityOf(email), 5000);

            email.sendKeys('test');
        });

    });
});

答案 1 :(得分:0)

量角器配合您应该写的承诺:

  InvalidLogInUnSuccess: {
            get:  async() => {
                await this.loginButton.click();
                await browser.driver.switchTo().activeElement();
                await this.email.sendKeys("Test");

只需在量角器代码之前应用Promises。我删除了功能并编写了异步代码。所以我应用了async / await。

参考:Link