我是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()
,而不是抛出异常?
答案 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();