Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript isPresent和isDisplayed方法之间有什么区别_Javascript_Angularjs_Protractor - Fatal编程技术网

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函数