Javascript 有没有办法用HtmlUnit触发滚动事件,或者根本不可能?

Javascript 有没有办法用HtmlUnit触发滚动事件,或者根本不可能?,javascript,ajax,scroll,htmlunit,pinterest,Javascript,Ajax,Scroll,Htmlunit,Pinterest,我现在学习HtmlUnit是为了抓取网站。一切都进行得很顺利,直到我遇到了一个动态页面(例如,我使用的是Pinterest网站),当用户向下滚动时,在该页面上动态添加元素 我尝试了几种在真实浏览器中触发滚动的方法(我将在下面展示)。 在继续之前,我想指出,我已经设置了以下配置: webclient.setJavaScriptEnabled(true); webclient.setAjaxController(new NicelyResynchronizingAjaxControl

我现在学习HtmlUnit是为了抓取网站。一切都进行得很顺利,直到我遇到了一个动态页面(例如,我使用的是Pinterest网站),当用户向下滚动时,在该页面上动态添加元素

我尝试了几种在真实浏览器中触发滚动的方法(我将在下面展示)。 在继续之前,我想指出,我已经设置了以下配置:

    webclient.setJavaScriptEnabled(true);
    webclient.setAjaxController(new NicelyResynchronizingAjaxController());
让我们假设我想让我所有的追随者在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();
=>当我检查到顶部的距离时,它等于0,结果页面与原始页面相同。在Eclipse中调试时,当我跨过执行javascript的那一行时,它会毫不延迟地直接转到下一行。如果我编写任何其他javascript,例如:

     ScriptResult sr = followersPage.executeJavaScript("$(div.GridItems).html('new content')");
您可以注意到调试器在该行挂起了半秒钟,这意味着javascript被执行

2) 将焦点从一个跟随者锚点更改为另一个(我选择锚点,因为当您单击TAB键时,它按焦点顺序使用):

不幸的是,它没有起作用

我尝试了许多其他的方法,但直到现在都没有积极的结果

我读了很多关于stackoverflow的相关文章。而且似乎没有人能用HtmlUnit让scroll工作,因为大多数问题都没有答案。这就是为什么我想知道这个功能是否有用

是否有人能够滚动页面(简单页面,没有ajax)? 是否有人试图滚动一个页面,事件触发了一些ajax调用?

在这种情况下,我建议您使用htmlunit,而不是htmlunit 使用htmlunit打开并获取

runtimeError:message=[未找到属性0.]sourceName=[https://s.pinimg.com/webapp/js/vendor-react-d20f99c48b5d58e4821c.js]line=[1]lineSource=[null]lineOffset=[0]

因此它看起来确实htmlunit对js没有很好的支持,即使是最新的2.31版

下面是一个使用casperjs的演示代码:

var utils = require('utils')
var fs = require('fs')
var system = require('system')

var casper = require('casper').create({
    verbose: true,
    logLevel: 'debug',
    localToRemoteUrlAccessEnabled: true,
    webSecurityEnabled: false,
    plainTextAllContent: false,
    viewportSize: {
        width: 1440,
        height: 800
    },
    onError: function(casper, msg, backtrace) {
        utils.dump(backtrace)
    }
});

var cookie = fs.read('cookie.txt').trim() 

casper.on('started', function() {

    this.page.onError = function(msg, trace) {
        casper.echo('Error => ' + msg + '\nError trace => ')
        utils.dump(trace)
    }

    this.page.customHeaders = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "zh-CN,en;q=0.5",
        "Accept-Encoding": "gzip, deflate",
        "Connection": "keep-alive",
        "Pragma": "no-cache",
        "Cookie": cookie
    }


});

casper.start('https://www.pinterest.com', function() {

    this.then(function() {
        this.waitForSelector('div[class="_wx _2h"]', function() {
            this.echo("waitForSelector 'div[class=_wx _2h]' is done")
            this.scrollTo(0, 1000);
            this.wait(5000, function() {
                this.scrollTo(0, 2000);
            })
        })

    })

});
将上述代码保存到一个名为demo.js的文件中,然后使用以下命令启动casperjs

casperjs --engine=slimerjs demo.js

然后你会看到firefox浏览器启动的视觉效果和工作

我也有同样的问题,你找到解决办法了吗?
var utils = require('utils')
var fs = require('fs')
var system = require('system')

var casper = require('casper').create({
    verbose: true,
    logLevel: 'debug',
    localToRemoteUrlAccessEnabled: true,
    webSecurityEnabled: false,
    plainTextAllContent: false,
    viewportSize: {
        width: 1440,
        height: 800
    },
    onError: function(casper, msg, backtrace) {
        utils.dump(backtrace)
    }
});

var cookie = fs.read('cookie.txt').trim() 

casper.on('started', function() {

    this.page.onError = function(msg, trace) {
        casper.echo('Error => ' + msg + '\nError trace => ')
        utils.dump(trace)
    }

    this.page.customHeaders = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "zh-CN,en;q=0.5",
        "Accept-Encoding": "gzip, deflate",
        "Connection": "keep-alive",
        "Pragma": "no-cache",
        "Cookie": cookie
    }


});

casper.start('https://www.pinterest.com', function() {

    this.then(function() {
        this.waitForSelector('div[class="_wx _2h"]', function() {
            this.echo("waitForSelector 'div[class=_wx _2h]' is done")
            this.scrollTo(0, 1000);
            this.wait(5000, function() {
                this.scrollTo(0, 2000);
            })
        })

    })

});
casperjs --engine=slimerjs demo.js