Protractor: 'wait'不能与“element.all”一起使用

9

我编写了Protractor自动化测试并遇到了一个问题。等待命令实际上并没有等待数组元素之一。请参见下面的示例:在导航到网页后,我尝试等待第一个元素。

var category = element.all(by.repeater('category in listCtrl.categories'));
var category2 = $$('.category-name.custom-tooltip-link.ng-binding');
var EC = protractor.ExpectedConditions;

describe('wait for the first category', function() {

    it('wait', function() {
        browser.get('http://www.deep.mg/');

        browser.wait(EC.visibilityOf(category.get(0)), 20000);

        browser.wait(EC.visibilityOf(category2.get(0)), 20000);
    });
});

但是测试失败,并出现以下错误:失败:越界。尝试访问索引为0的元素,但根据定位器 by.repeater("category in listCtrl.categories") ,只有0个匹配元素。 错误不取决于定位器类型,因为在“按重复器”和“按 CSS”两种情况下都出现了。 选择器没问题,在添加“等待”命令后,测试通过了:
var category = element.all(by.repeater('category in listCtrl.categories'));
var category2 = $$('.category-name.custom-tooltip-link.ng-binding');
var EC = protractor.ExpectedConditions;

describe('wait for the first category', function() {

    it('wait', function() {
        browser.get('http://www.deep.mg/');

        browser.sleep(15000);

        browser.wait(EC.visibilityOf(category.get(0)), 20000);

        browser.wait(EC.visibilityOf(category2.get(0)), 20000);

        category.count().then(function(count1) {
            console.log(count1);  //count returns 5, which means there are actually elements in array
        });

        category2.count().then(function(count2) {
            console.log(count2);
        });
    });
});

此外,timeout参数并没有起到作用,它只是忽略了它并立即失败。

所以问题是如何等待数组中的某个特定元素?我是否漏掉了什么?谢谢。


@alecxe 是的,已经有了。谢谢! - Dmitry Sasov
2个回答

10

创建一个自定义的“预期条件(Expected Condition)”,用于等待数组中元素的数量大于0:

function presenceOfAll(elementArrayFinder) {
    return function () {
        return elementArrayFinder.count(function (count) {
            return count > 0;
        });
    };
}

使用方法:

browser.wait(presenceOfAll(category), 10000);
browser.wait(presenceOfAll(category2), 10000);

对我来说没问题。


谢谢@alecxe,这对我来说是一个棘手的问题。我们应该每次使用ElementFinder时都放置它,还是只有在出现StaleReference错误时才放置它? - DDave
@DDave 我会考虑将它用作一种可靠性添加层,将其注入到测试中的问题点。很高兴它有帮助! - alecxe
1
在我的情况下,我必须扩展答案。回调函数(count)...根本不被考虑。将其留空会导致相同的结果。 由于count返回一个promise,您必须像这样使用.then return elementArrayFinder.count().then(function count() { ...//在此处执行您的检查 }) - ilmgb
嗨,这个已经过时了。当前的 protractor count() 不需要参数。有人能帮忙吗?谢谢。 - Franva

2
如果没有要“获取”的元素,element.all(by.repeater('category in listCtrl.categories')).get(0)将始终抛出错误(来源:element.js ElementArrayFinder.prototype.get)。
您可以尝试:
browser.wait(function() {
    return category.count().then(function(catCount) {
        if (catCount > 0) {
            return EC.visibilityOf(category.get(0));
        }
    }
}, 20000);

或者你可以等待所有元素可见,它会做你要求的事情(因为它将等待“全部”承诺完全解决,而不仅仅是在获得第一个承诺时跳出):

browser.wait(EC.visibilityOf(category), 20000);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接