如何避免'索引超出范围' Protractor ElementArrayFinder的异常

时间:2015-05-15 01:09:27

标签: angularjs testing selenium promise protractor

我是Protractor的新手,我正在使用它与chai和chai-as-promised一起使用。目前,当我的ElementArrayFinder不包含我需要的元素时,我正在努力弄清楚如何最好地处理这种情况。

对于ElementFinder(无数组),它看起来很简单:

element(by.css('.neverthere')).isPresent().then(function(value){
    console.log('IsPresent() for .neverthere is: ', value, '\n');
});

一旦评估了承诺,上面的代码就不会抛出异常而isPresent()会返回false

一旦我开始使用ElementArrayFinders,就会变得更加复杂:

var el = element.all(by.repeater(
                'property in propertyPanel.properties'))
        .first()
        .all(by.css('.neverthere'))
        .first();

el.isPresent().then(function(value){
    console.log('IsPresent() for ', name, ' is: ', value, '\n');
});

当评估Error: Index out of bound.的数组为空时,上面的代码会对isPresent()的评估抛出first()异常。

是否有办法访问ElementArrayFinder中的元素,以便 - 如果元素不存在 - 则会返回ElementFinder来回答“错误”。到isPresent(),而不是抛出异常?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,你可以断言发现的count个元素是0:

var elements = element.all(by.repeater('property in propertyPanel.properties')).all(by.css('.neverthere'));
expect(elements.count()).toBe(0);

first()browser.isElementPresent()结合使用:

var elements = element.all(by.repeater('property in propertyPanel.properties')).all(by.css('.neverthere'));
expect(browser.isElementPresent(elements.first()).toBe(false);

答案 1 :(得分:1)

也许有点晚了,但无论如何都会把它放在那里。 昨天我遇到了完全相同的问题,经过对量角器的简要调查后发现了一个有趣的方法:

ElementArrayFinder.prototype.toElementFinder_ = function() {
  return new ElementFinder(this.ptor_, this);
};

并且意识到所有ElementFinder实例都是从ElementArrayFinder实例中扣除的,只是从中获取了第一个元素,抛出"没有找到使用定位器的元素"如果ElementArrayFinder不包含任何元素并发出警告"找到多个定位器元素"如果ElementArrayFinder中有多个元素。

因此,作为"错误:索引越界的解决方法。"在从ElementArrayFinder.prototype.first收到的元素上的isPresent()中,我们可以使用内部方法ElementArrayFinder.prototype.toElementFinder_,如下所示:

var el = element.all(by.repeater(
            'property in propertyPanel.properties'))
    .first()
    .all(by.css('.neverthere'))
    .toElementFinder_();

el.isPresent().then(function(value){
    console.log('IsPresent() for ', name, ' is: ', value, '\n');
});

上面的示例将按预期工作:完全如

element(by.css('.neverthere')).isPresent().then(function(value){}) 

确实

答案 2 :(得分:0)

代码中的syntext错误,您已添加第二个元素查找器的索引

 var el = element.all(by.repeater(
                    'property in propertyPanel.properties')).get(0)
            .all(by.css('.neverthere'))
            .first();
相关问题