2015-11-02 45 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)不能从静态上下文**中引用。这不是调用该方法的正确方法吗? –