量角器:通过repeater元素返回大小0

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了量角器:通过repeater元素返回大小0相关的知识,希望对你有一定的参考价值。

我对量角器很新,尝试学习自动化角度主页(https://angularjs.org/)。我在javascript Projects部分遇到了麻烦。

有效的步骤:

it ('should click on the plus sign', function() {
        $('.icon-plus-sign').click();
            expect(element(by.model('editProject.project.name')).isPresent()).toBe(true);
});

it ('should fill up the form', function() {
            element(by.model('editProject.project.name')).sendKeys('Test Name');
            element(by.model('editProject.project.site')).sendKeys('https://www.testsite.com');
            element(by.model('editProject.project.description')).sendKeys('Test Description');
            expect(element(by.buttonText('Save')).getAttribute('disabled')).toBe(null);
});

失败的步骤:

it ('should click on save button', function() {
            element(by.buttonText('Save')).click();
            // $$('tr[class="ng-scope"]')
            element.all(by.repeater("project in projectList.projects | filter:projectList.search | orderBy:'name'")).then(function(trElements) {
                console.log(trElements.length);
                for (var i = trElements.length - 1; i >= 0; i--) {
                    console.log('outside if' + i);
                    if (trElements[i].all(by.tagName('td')).first().element(by.tagName('a')).getText() == 'Test Name') {
                        console.log('inside if' + i);
                        expect(trElements[i].all(by.tagName('td')).first().element(by.tagName('a')).getAttribute('ng-href')).toContain('www.testsite.com');
                        expect(trElements[i].all(by.tagName('td')).get(1).getText()).toBe('Test Description');
                        break;
                    }
                }
            });


            browser.sleep(5000);
});

trElements.length返回0,但元素肯定存在于DOM中,并在Chrome DevTools的Elements选项卡中突出显示。

请帮我解决一下这个。

提前致谢!

答案

单击“保存”后,您可能应该等待列表加载。测试可能比加载元素更快,在这种情况下,我们使用Expecteded Conditions并等待列表可见(您在这里有完整的API文档https://www.protractortest.org/#/api?view=ProtractorExpectedConditions):

var EC = protractor.ExpectedConditions;
element(by.buttonText('Save')).click().then(function() {
        // $$('tr[class="ng-scope"]')
   browser.wait(EC.visibilityOf(element(by.repeater("project in projectList.projects | filter:projectList.search | orderBy:'name'"))), 30000, "Project list is not displayed");
        element.all(by.repeater("project in projectList.projects | filter:projectList.search | orderBy:'name'")).then(function(trElements) {
            console.log(trElements.length);
            for (var i = trElements.length - 1; i >= 0; i--) {
                console.log('outside if' + i);
                if (trElements[i].all(by.tagName('td')).first().element(by.tagName('a')).getText() == 'Test Name') {
                    console.log('inside if' + i);
                    expect(trElements[i].all(by.tagName('td')).first().element(by.tagName('a')).getAttribute('ng-href')).toContain('www.testsite.com');
                    expect(trElements[i].all(by.tagName('td')).get(1).getText()).toBe('Test Description');
                    break;
                }
            }
        });
});
另一答案

在查询“trElements”之前,单击“保存”启动的操作尚未完成。等待点击“保存”按钮后返回的承诺,然后再继续。 I.E. element(By.buttonText("Save")).click() .then(() => { element.all(By.repeater(... });

以上是关于量角器:通过repeater元素返回大小0的主要内容,如果未能解决你的问题,请参考以下文章

如何选择使用ng-repeat实现的下拉元素

量角器 - 获取元素的子元素?

如何使用量角器定位器找到子元素?

删除 NG-repeat 量角器中的记录

如何使用量角器返回此复选框元素?

量角器 - 如何将一组承诺的结果放入另一个数组