我目前正在学习HtmlUnit以便抓取网站.一切顺利,直到我遇到动态页面(例如,我正在使用Pinterest网站),当用户向下滚动时,动态添加元素.
我已经尝试了几种应该在真实浏览器中触发滚动的方法(我将在下面显示).在进一步讨论之前,我想提一下我已经设置了以下配置:
webclient.setJavaScriptEnabled(true);
webclient.setAjaxController(new NicelyResynchronizingAjaxController());
Run Code Online (Sandbox Code Playgroud)
让我们说我想让所有关注者都在Pinterest上.我导航到那个页面,现在从第一次只有24个,我想向下滚动,触发Ajax调用服务器并检索下一组关注者的事件.
1)简单的javascript或jQuery代码触发窗口滚动.
ScriptResult sr = followersPage.executeJavaScript("window.scrollBy(0,1000)");
// One version in jQuery
// ScriptResult sr = followersPage.executeJavaScript("$(window).scrollTop(0,1000);");
// also tried with the body, html, with animation
// ScriptResult sr = followersPage.executeJavaScript("$("html, body").animate({ scrollTop: $(document).height() }, 1000);");
webclient.waitForBackgroundJavaScript(10000);
followersPage = (HtmlPage)sr.getNewPage();
Run Code Online (Sandbox Code Playgroud)
=>当我检查到顶部的距离时,它等于0,结果页面与原始页面相同.在Eclipse中进行调试时,当我跨越执行javascript的行时,它会直接转到下一行,没有任何延迟.如果我写任何其他JavaScript,例如:
ScriptResult sr = followersPage.executeJavaScript("$(div.GridItems).html('new content')");
Run Code Online (Sandbox Code Playgroud)
您可以注意到调试器在该行上挂起了半秒钟,这意味着执行了javascript.
2)将焦点从一个跟随锚点更改为另一个(我选择了锚点,因为当您单击TAB键时它在焦点顺序中使用):
HtmlDivision gridItems = followersPage.getFirstByXPath("//div[contains(concat(' ',@class,' '),' GridItems ')]");
List<HtmlDivision> els = (List<HtmlDivision>) gridItems.getByXPath("//div[@class='item ']");
List<HtmlDivision> items = (List<HtmlDivision>) gridItems.getByXPath("//div[@class='item ']");
for (HtmlDivision item : items) {
HtmlAnchor a …Run Code Online (Sandbox Code Playgroud)