Javascript 单击后如何获取更新的内容?

Javascript 单击后如何获取更新的内容?,javascript,phantomjs,casperjs,Javascript,Phantomjs,Casperjs,我正设法找到解决这个问题的办法 打开一个页面,获取特定链接 单击链接(分页链接)以获得第二页结果 阅读新内容并再次获取新链接 这是我的casperjs应用程序的一部分: var page = 1; function getLinks() { var links = __utils__.getElementsByXPath('//div[@class="myDiv"]//a'); return Array.prototype.map.call(links, functi

我正设法找到解决这个问题的办法

  • 打开一个页面,获取特定链接
  • 单击链接(分页链接)以获得第二页结果
  • 阅读新内容并再次获取新链接
  • 这是我的casperjs应用程序的一部分:

    var page = 1;
    
    function getLinks() {    
        var links = __utils__.getElementsByXPath('//div[@class="myDiv"]//a');
    
        return Array.prototype.map.call(links, function(e) {
            return e.getAttribute('href')
        });
    }
    
    casper.start("www.example.com", function(){
       //
    })
    
    casper.repeat(2, function() {
    
        this.then(function(){
            links = this.evaluate(getLinks);
            links = links.concat(links);    
        });
    
        this.then(function(){
            page++;    
            this.clickLabel(String(page), 'a');
        });
    
    });
    
    正如你所见,我有两个步骤在里面重复。我设置了2,因为我只需要检查两页

    目前我的问题是“点击”。它可以工作,因为调用了新的Url,但问题是第一步将立即执行,因此新内容不会完全加载。因此,当我再次调用getLinks()时,我仍然处理前面的内容

    很明显,我想在页面完全加载时获取链接。我怎么做


    谢谢大家!

    常见问题解答如何延迟一些代码,以便虚拟浏览器有时间加载和/或呈现页面上单击或其他JavaScript操作的结果

    window.setTimeout(
        function () {
            // process page here
        },
        2000 // number of milliseconds to wait (here 2s)
    );
    
    很简单,不是吗!在你的情况下,你会:

    do_click();
    window.setTimeout(
        function () { process_click_result(); },
        2000 // 2 seconds
    );
    
    您可以在检索链接之前预先添加一个,如下所示:

    casper.repeat(2, function() {
        this.wait(2000); // 2 seconds
    
        this.then(function(){
            links = this.evaluate(getLinks);
            links = links.concat(links);    
        });
    
        this.then(function(){
            page++;
            this.clickLabel(String(page), 'a');
        });
    
    });
    
    您还可以在单击后附加一个,以确保页面已加载。在这里,我假设页码位于URL的内部,即
    page=x

    casper.repeat(2, function() {
        this.then(function(){
            links = this.evaluate(getLinks);
            links = links.concat(links);    
        });
    
        this.then(function(){
            page++;
            this.clickLabel(String(page), 'a');
        });
    
        this.waitForResource(new RegExp("page="+page));
    });
    

    setTimeout
    不适用于此场景,因为casper将只执行下一个计划步骤,并在超时时间结束之前退出。