点击后如何获取更新内容?

时间:2013-07-08 00:31:14

标签: javascript phantomjs casperjs

我想找到解决这个问题的方法。

  1. 打开页面并获取特定链接
  2. 点击链接(分页链接)以获取第二页结果
  3. 阅读新内容,再次获取新链接....
  4. 这是我的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()时,我仍然会处理以前的内容。

    当页面完全加载时,我显然想要获取链接。我该怎么办?

    谢谢!

2 个答案:

答案 0 :(得分:0)

在检索如下链接之前,您可以添加wait

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');
    });

});

您还可以在单​​击后附加waitForResource以确保页面已加载。我在此假设页码位于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));
});

答案 1 :(得分:-1)

常见问题解答如何延迟某些代码,以便虚拟浏览器有时间加载和/或呈现页面上的点击或其他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
);