Javascript isPresent和isDisplayed方法之间有什么区别
我刚开始使用量角器编写测试。我想知道Javascript isPresent和isDisplayed方法之间有什么区别,javascript,angularjs,protractor,Javascript,Angularjs,Protractor,我刚开始使用量角器编写测试。我想知道isPresent()和isDisplayed()方法之间有什么区别 API定义 所以。。。在什么情况下它们是不同的?如果页面中存在元素(在DOM中),则isPresent为真,但可以隐藏(在css中显示:无) isDisplayed仅当isPresent为true且元素可见时才为true如果调用isDisplayed()时出现错误,因为元素不在页面上,即您得到NoTouchElementError:使用定位器找不到元素,请执行以下操作: 只需用您自己的方
isPresent()
和isDisplayed()
方法之间有什么区别
API定义
所以。。。在什么情况下它们是不同的?如果页面中存在元素(在DOM中),则isPresent为真,但可以隐藏(在css中显示:无)
isDisplayed仅当isPresent为true且元素可见时才为true如果调用
isDisplayed()
时出现错误,因为元素不在页面上,即您得到NoTouchElementError:使用定位器找不到元素,请执行以下操作:
只需用您自己的方法包装.isDisplayed()
,然后处理未解决/拒绝的承诺
,如下所示:
function isTrulyDisplayed (elementToCheckVisibilityOf) {
return elementToCheckVisibilityOf.isDisplayed().then(function (isDisplayedd) {
return isDisplayedd;
}).then(null, function (error) {
console.log('A NoSuchElement exception was throw because the element is NOT displayed so we return false');
return false;
}); };
希望这有助于其他人 isDisplayed()和isPresent()之间有一个主要区别
isDisplayed()-您的元素出现在页面上,但会显示出来
isPresent()-元素存在于页面的整个DOM中。可能它可以隐藏或不禁用,但可以显示
当需要对正在搜索的特定元素进行验证时,不应使用isPresent(),而是可以使用它根据该元素的存在情况验证其他一些检查。isDisplayed
解决该元素是否可见的问题,但如果不在DOM中则引发异常。
isPresent
解析它是否在DOM中,而不管它是否实际可见。它不会抛出异常
如果在DOM中找不到元素,则可以使用以下代码避免isDisplayed引发的异常:
function isVisible(e) {
var deferred = protractor.promise.defer();
if (e) {
e.isDisplayed().then(
// isDisplayed Promise resolved
function(isDisplayed) {
deferred.fulfill(isDisplayed);
},
// Silencing the error thrown by isDisplayed.
function(error) {
deferred.fulfill(false);
}
);
}
else {
deferred.reject(new Error('No element passed'));
}
return deferred.promise;
}
即使是同时具有可见性和存在性的对象也可以在解析时传递,例如:
deferred.fulfill({
visible: isDisplayed,
present: true
});
但是,这对expect语句不起作用。IsPresent():如果DOM中存在元素(可能隐藏也可能不隐藏),则返回TRUE;否则返回false
IsDisplayed():
- 如果元素存在于DOM中且可见,则返回TRUE
- 如果元素存在于DOM中并且是隐藏的,则返回FALSE
- 如果DOM中不存在元素,则引发异常
如果元素未出现在我的测试中,则实际上isDisplayed将引发异常。当页面上的元素未出现时,isPresent解析为false,但isDisplayed仅以量角器运行程序错误代码100警告的方式静默退出。承诺没有得到解决,在.then()
部分中,您只需返回isDisplayed
,不需要if/else。这也会起作用。返回isDisplayedd,在.then()部分的末尾加上2'd',所以我同意。这两种方法都能起作用,你的方法不太冗长,因此在这种情况下效果更好。据我所知,你应该能够废弃整个。然后(函数(isDisplayedd){return isDisplayedd;})
部分,因为它应该自动将结果传递给下一个then函数