2015-12-30 7 views
16

ページ上でスクロールするすべての要素を見つける最も信頼性が高く効率的な方法は何ですか?スクロールですべての要素を見つける


現在、私はheightscrollHeight属性値の比較filter()element.all()を使用して考えている:

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

あなたがこのページでそれを実行すると、スクロールバーのないいくつかの要素が表示されますので、信頼できないと思います(私は思っています)。ちょうどこれをコメントしたかったので、(まだ)具体的な答えはありません。 – A1rPun

+1

@AndrewTempletonは心配しないで、今日の賞金を見直して決定します。答えに感謝します! – alecxe

答えて

2

これは、水平スクロールバーと垂直スクロールバーの両方で機能します。このトリックは、計算されたCSSがスクロールバーを表示できるようにするには、あまりにも広い/小さすぎるANDを検出しています。

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タグ内のオーバーフローや非あふれた巻物を持つ要素を選択します:あなたはこの `Array.prototype.slice.call(document.querySelectorAllような何かを行うことができバニラJSを使用して

$('body *').filter(function() { 
    return ($(this).scrollTop() != 0 || $(this).css('overflow') == 'scroll'); 
});