【问题标题】:Protractor, with isDisplayed() I get NoSuchElementError: No element found using locator量角器,使用 isDisplayed() 我得到 NoSuchElementError: No element found using locator
【发布时间】:2015-05-07 11:35:35
【问题描述】:

在量角器 2.0 中,如果显示一个元素,我将签入 expect()。我期待一个错误,但奇怪的是我收到以下错误:

NoSuchElementError: No element found using 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();
    });
});

我知道我收到该错误是因为页面上不再存在元素(这是我要确认的内容),但我不应该得到错误而不是错误吗?

【问题讨论】:

  • 您最好使用 isElementPresent 或 isPresent - 您遇到的错误是 WebDriver 逻辑的一部分

标签: javascript angularjs jasmine protractor angularjs-e2e


【解决方案1】:

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

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

另见:

【讨论】:

  • 你是“量角器天使”!我从你的回答中学到了很多东西!谢谢你! @alecxe
  • @IdanE 我从你的问题中学到了很多!谢谢!
  • 如果我有条件的话。它不工作。前任。 if(browser.isElementPresent(element(by.id('userForm')))
  • @ji-ruh browser.isElementPresent(element(by.id('userForm')) 返回一个始终“真实”的承诺。您应该明确地解决承诺以检查实际存在值。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果元素可见则做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
    });
    

    【讨论】:

      【解决方案4】:

      .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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 2019-07-31
        相关资源
        最近更新 更多