小编DjC*_*ode的帖子

有没有办法用HtmlUnit触发滚动事件,还是根本不可能?

我目前正在学习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)

javascript ajax scroll htmlunit pinterest

10
推荐指数
1
解决办法
1521
查看次数

标签 统计

ajax ×1

htmlunit ×1

javascript ×1

pinterest ×1

scroll ×1