量角器,使用isDisplayed()我得到NoSuchElementError:找不到使用定位器的元素

时间:2015-05-07 11:35:36

标签: javascript angularjs jasmine protractor angularjs-e2e

在量角器2.0中,如果显示一个元素,我正在检查expect()。我希望是假的,但奇怪的是我得到了以下错误:

  

NoSuchElementError:找不到使用locator找到的元素:By.id(" userForm")

我的代码是:

describe('closeModal', function() {
    it('should close the alert that appears after registration.', function(){
        element(by.id('closeAlertModalButton')).click();
        expect(element(by.id('userForm')).isDisplayed()).toBeFalsy();
    });
});

我明白我得到了那个错误,因为页面上的元素不再是(我想要确认的),但是我不应该得到错误而不是错误吗?

4 个答案:

答案 0 :(得分:32)

isDisplayed()会检查元素是否可见,但您需要检查DOM中是否存在元素,使用isElementPresent()isPresent()

expect(browser.isElementPresent(element(by.id('userForm')))).toBe(false);
expect(element(by.id('userForm')).isPresent()).toBe(false);

另见:

答案 1 :(得分:2)

此错误是WebDriver行为的一部分。对于这种情况,你应该更好地使用 isPresentisElementPresent

答案 2 :(得分:1)

如果元素可见,则执行A如果不可见则执行B,如果未找到元素,则忽略异常:

element.isDisplayed().then(function(visible){
    if (visible) {
        // do A when element visible
    }else{
        // do B when element not visible 
    }
}, function () {
    //suppress exception if element is not found on page
});

答案 3 :(得分:1)

.isDisplayed() 假定元素存在(存在于 DOM 中)

所以如果你这样做

expect($('[ng-show=saving]').isDisplayed()).toBe(true);

但该元素不存在,而不是正常的失败期望,$('[ng-show=saving]').isDisplayed() 将抛出错误导致 it 块的其余部分未执行

解决方案

如果您假设您正在检查的元素可能因任何原因不存在于页面上,那么请使用下面的安全方法

/**
*  element is Present and is Displayed
*  @param    {ElementFinder}      $element       Locator of element
*  @return   {boolean}
*/
let isDisplayed = function ($element) {
  return (await $element.isPresent()) && (await $element.isDisplayed())
}

并使用

expect(await isDisplayed( $('[ng-show=saving]') )).toBe(true);