2015-11-02 54 views
2

有沒有辦法來滾動網頁內div的滾動條內的溢出DIV?更準確地說,我試圖自動化上傳和下載Instagram帖子,例如https://instagram.com/p/9D5Ir3CY3D/?taken-by=bentomonsters。但是,由於可能使用CSS屬性隱藏滾動條,因爲滾動條不是元素,所以我可能無法檢測到它。如何滾動網頁

下面是滾動條的CSS樣式(從螢火蟲)。

.-cx-PRIVATE-PostInfo__comments { 
    margin-left: -24px; 
    margin-right: -24px; 
    margin-top: -5px; 
    padding-left: 24px; 
    padding-right: 24px; 
    padding-top: 5px; 
} 
.-cx-PRIVATE-PostInfo__commentsSidebarVariant { 
    overflow: auto; 
    padding-bottom: 20px; 
} 
.-cx-PRIVATE-PostInfo__comments { 
    flex-grow: 1; 
} 
ol, ul { 
    list-style: outside none none; 
} 
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, 
blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, 
img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, 
center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, 
tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, 
figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, 
time, mark, audio, video { 
    border: 0 none; 
    font: inherit; 
    margin: 0; 
    padding: 0; 
    vertical-align: baseline; 
} 

我已經試過的方法如

WebElement commentscroll = dr.findElement(By.className("commentsSidebarVariant")); 

jse.executeScript("return arguments[0].scrollTop;", commentscroll); 

jse.executeScript("$(\"#commentsSidebarVariant\").animate({ scrollTop: \"100px\" })"); 

jse.executeScript("arguments[0].scrollTop = arguments[1];", commentscroll); 

WebElement commentscroll = dr.findElement(By.cssSelector(".-cx-PRIVATE-PostInfo__commentsSidebarVariant"));    

jse.executeScript("arguments[0].scrollTop;", commentscroll); 

,沒有他們的工作方式滾動甚至不動。

+0

你問 - *是有可能使一個元件滾動,而不使用輸入設備(鼠標,觸控板,觸摸等。 。)*? - http://stackoverflow.com/questions/18030571/use-js-jquery-to-scroll-a-divs-content-that-has-overflow-scroll-applied – justinw

回答

0

我使用用於使用純JS滾動溢流元件和檢查,如果我到達滾動結束以下的方法。 當到達滾動結束時,您需要使用類似的方法向上滾動,因爲您可能已經開始從任何位置滾動。

,以下方法的參考碼,而不是整個溶液:

// Returns true if scroll succeeded, false otherwise 
    private boolean scrollDownOverflowElement(WebElement element, int lazyLoadingGracePeriodMillis) { 
     long scrollTopBefore = (long) javascriptExecutor.executeScript("return arguments[0].scrollTop", element); 
     javascriptExecutor.executeScript("arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].clientHeight", element); 
     if (isAtEndOfScroll(element)) { 
      // Wait for 1 second to give additional async results a chance to load (e.g. select2 drop downs) 
      sleep(lazyLoadingGracePeriodMillis); 
     } 
     long scrollTopAfter = (long) javascriptExecutor.executeScript("return arguments[0].scrollTop", element); 
     return scrollTopAfter != scrollTopBefore; 
    } 


    // Returns true if element is at end of scroll, false otherwise 
    // See https://developer.mozilla.org/en-US/docs/Web/API/Element.scrollHeight 
    private boolean isAtEndOfScroll(WebElement element) { 
     // scrollTop is the number of number of pixels scrolled down from the top (0 when scrolled all the way up) 
     // scrollHeight is the height of the scroll view of an element. It includes the element padding but not its margin. 
     // clientHeight is the inner height of an element in pixels, including padding but not the horizontal scrollbar height, border, or margin. (the displayed size of an overflow element) 
     final boolean isAtEnd = (boolean) javascriptExecutor.executeScript("return arguments[0].scrollHeight - arguments[0].scrollTop === arguments[0].clientHeight", element); 
     return isAtEnd; 
    } 
+0

對不起,我不明白怎麼你參考代碼將有助於解決我的問題,因爲它檢查元素是否已經達到滾動的底部,但正如我所提到的,我無法知道滾動條元素的名稱,因爲它是一個CSS屬性,只有當文本框是「填充」。 –

+0

該解決方案通過Javascript滾動,而不是滾動條。它的工作原理滾動條是否出現與否,基於元素屬性 –

+0

我試圖以這種方式'scrollDownOverflowElement(commentscroll)實施scrollDownOverflowElement(WebElement);在主方法',但有**非靜態的這個錯誤方法scrollDownOverflowElement(WebElement)不能從靜態上下文**中引用。這不是調用該方法的正確方法嗎? –