使用 Protractor 获取 ng-repeat 中的元素

Getting an Element Inside ng-repeat with Protractor

我正在为我正在开发的应用程序编写端到端测试,我正在尝试为警报指令 (Angular UI Bootstrap) 生成的警报编写测试在包装器指令中。这是我到目前为止编写的代码:

首先我们有用于生成警报的包装器指令

// Grab our directive controller
// The controller just contains the alert functions for the Angular UI     
// Bootstrap alerts directive
import InfoAlertController from './info-alert.controller.js';

let moduleName = 'infoAlert';

// ## Directive Definition
class InfoAlert {

    constructor() {

        this.template =
        `
            <div>

                <alert
                    ng-repeat="alert in vm.alerts"
                    type="{{ alert.type }}"
                    close="vm.closeAlert($index)" >

                        {{ alert.msg }}

                </alert>

            </div>
        `;
        this.restrict = 'E';
        this.scope = {};
        this.bindToController = {

            name : '@?'
        };
        this.transclude = true;
        this.controller = InfoAlertController;
        this.controllerAs = 'vm';
    }

    // ### Optional Link Function
    link (scope, elem, attrs, vm, transclude) {

    }
}

export default [moduleName, directiveFactory(InfoAlert)];

这是在 user login 组件视图中实现的指令

<info-alert
     name="loginAlerts">
</info-alert>

user login 组件是另一个指令,它包含一个带有 Angular 验证的表单,该验证与身份验证服务交互。

这是我正在尝试编写的测试

describe('login component', () => {

    it('should display an error after failedauthentication', () => {

            browser.get('/login');

            element(by.model('vm.user.username')).sendKeys('nerfherder');

            element(by.model('vm.user.password')).sendKeys('badpassword');

            element(by.css('.btn-custom')).click();

            let e = element(by.repeater('alert in vm.alerts').row(0));

            // This is always fails no matter what I try
            expect(e.isDisplayed()).toBe(true);
    });
});

我得到的错误是 Expected 0 to be greater than 0,我认为这意味着它没有找到使用我正在使用的方法的警报。我还尝试通过 class element(by.css('.alert-danger'));element(by.css('.alert'));分别。它也不适用于 browser.waitForAngular();.

我也尝试过量角器预期条件的实现,但无济于事。

所有功能都适用于手动测试,并且在测试执行期间会弹出警报。任何帮助将不胜感激,因为这个开发人员被难住了。

解决方案

此解决方案基于以下 alecxe 的回答:

describe('login component', () => {

    it('should display an error after failed authentication', () => {

        let EC = protractor.ExpectedConditions;

        browser.get('/login');

        element(by.model('vm.user.username')).sendKeys('nerfherder');

        element(by.model('vm.user.password')).sendKeys('badpassword');

        let alert = element(by.repeater('alert in vm.alerts').row(0));

        let alertLoaded = EC.visibilityOf(alert);

        element(by.css('.btn-custom')).click();

        // UI Bootstrap alert class
        let e = element(by.css('.alert-danger'));

        browser.wait(alertLoaded, 5000);

        expect(e.isDisplayed()).toBe(true);
    });
});

测试现在顺利通过。

试试这个::

let e = element.all(by.repeater('alert in vm.alerts').row(0));

您可能需要明确等待警报出现

var EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(element(by.repeater('alert in vm.alerts'))), 5000);