使用Protractor查找所有可见元素

11

我试图使用Protractor来计算在容器下所有可见元素的数量

function getVisibleDivs(driver) { 
  var links = driver.findElements(by.css("#MainContent div")); 
  return protractor.promise.filter(links, function(link) { 
    link.isDisplayed(); 
   })
  .then(function(visibleLinks) {
      return visibleLinks; 
    }); 
}

element.all(getVisibleDivs).then(function (items) {
        console.log(items.length);
});

虽然我已经手动检查了元素是否存在,但总是得到计数为0的结果。如果有任何调试指针,将不胜感激。

更新一些示例HTML

<html>
    <body>
        <div id="MainContent">
            <div class="header">
                Header
            </div>
            <div class="content">
                Content
            </div>
            <div class="sidebar" style="display:none">
                Sidebar
            </div>
            <div class="footer">
                Footer
            </div>
        </div>
    </body>
</html>

似乎您的选择器有误。您的选择器正在搜索一个带有id #MainContent的元素,后面跟着一个div元素。能否展示一些HTML代码? - nilsK
@nilsK:实际的HTML非常复杂。我在问题中放了一些示例HTML,可以重现该问题。谢谢。 - Gautham
抱歉回复晚了。请尝试以下代码:var main = driver.findElement(by.id('#MainContent')); main.findElements(by.tagName('div')).then(function(divArr) {//...}); 这里的问题是,divArr将包含在MainContent内找到的所有div元素。 - nilsK
2个回答

12

不需要直接使用protractor.promise。 Protractor在ElementArrayFinder - element.all()的结果上公开函数式编程函数,如filter()

这是如何使用的:

var visibleDivs = $$("#MainContent div").filter(function(link) { 
    return link.isDisplayed();
});

expect(visibleDivs.count()).toEqual(3);

2

您的筛选函数没有返回任何内容,因此请在link.isDisplayed()中添加'return':

function getVisibleDivs(driver) { 
  var links = driver.findElements(by.css("#MainContent div")); 
  return protractor.promise.filter(links, function(link) { 
    return link.isDisplayed(); 
   })
  .then(function(visibleLinks) {
      return visibleLinks; 
    }); 
}

element.all(getVisibleDivs).then(function (items) {
        console.log(items.length);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接