2015-12-30 3 views
16

Каков наиболее надежный и эффективный способ найти все элементы, имеющие свиток на странице?Поиск всех элементов со свитком


В настоящее время я думаю об использовании element.all() с filter() сравнения значений атрибутов height и scrollHeight:

element.all(by.xpath("//*")).filter(function (elm) { 
    return protractor.promise.all([ 
     elm.getAttribute("height"), 
     elm.getAttribute("scrollHeight") 
    ]).then(function (heights) { 
     return heights[1] > heights[0]; 
    }); 
}); 

Но я не уверен в правильности и эффективности такого подхода.

+2

Используя ванильный JS вы можете сделать что-то вроде этого 'Array.prototype.slice.call (document.querySelectorAll ('*')). filter (function (el) {return el.offsetHeight! == el.scrollHeight}) ', но если вы выполните его на этой странице, вы увидите некоторые элементы без полос прокрутки, так что я не уверен. Просто хотел прокомментировать это, у меня нет конкретного ответа (пока). – A1rPun

+1

@AndrewTempleton не волнуйтесь, рассмотрит и примет решение о наградах сегодня. И спасибо за ответ! – alecxe

ответ

2

Это работает как с горизонтальной, так и с вертикальной полосой прокрутки. Трюк обнаруживает BOTH слишком широкий/слишком короткий И, если вычисленный CSS позволит вам отображать полосу прокрутки.

var ElementsWithScrolls = (function() { 
    var getComputedStyle = document.body && document.body.currentStyle ? function(elem) { 
     return elem.currentStyle; 
    } : function(elem) { 
     return document.defaultView.getComputedStyle(elem, null); 
    }; 

    function getActualCss(elem, style) { 
     return getComputedStyle(elem)[style]; 
    } 

    function isXScrollable(elem) { 
     return elem.offsetWidth < elem.scrollWidth && 
      autoOrScroll(getActualCss(elem, 'overflow-x')); 
    } 

    function isYScrollable(elem) { 
     return elem.offsetHeight < elem.scrollHeight && 
      autoOrScroll(getActualCss(elem, 'overflow-y')); 
    } 

    function autoOrScroll(text) { 
     return text == 'scroll' || text == 'auto'; 
    } 

    function hasScroller(elem) { 
     return isYScrollable(elem) || isXScrollable(elem); 
    } 
    return function ElemenetsWithScrolls() { 
     return [].filter.call(document.querySelectorAll('*'), hasScroller); 
    }; 
})(); 

ElementsWithScrolls(); 
1

Он будет выбирать элементы с переполненными и не-переполнены свитками внутри тела тега:

$('body *').filter(function() { 
    return ($(this).scrollTop() != 0 || $(this).css('overflow') == 'scroll'); 
}); 
Смежные вопросы