如何使用CasperJS在网站上解析iframe

时间:2015-07-21 19:49:02

标签: javascript iframe casperjs

我想在iframe的网站上获取信息。

当我用这个命令用casperjs解析这个网站时:

casper.then(function() {
    casper.waitFor(function() {
        return this.withFrame('mainframe', function() {});
    }, function() {
        this.withFrame('mainframe', function() {
            console.log(this.echo(this.getHTML()));
        });
    });
}); 

我的问题是结果,我只有一个iframe的内容。

如何获取我网站上任何iframe的结果?

1 个答案:

答案 0 :(得分:0)

CasperJS没有专门提供等待iframe加载的功能。但是,您可以使用waitForResource()步骤函数等待iframe资源,然后对其执行操作。

casper.waitForResource(function check(res){
    var iframeSrc = this.getElementAttribute("iframe[name='mainframe']", "src");
    return res.url.indexOf(iframeSrc) > -1;
}, function(){
    // success
});

收到资源后,您可以在iframe内等待特定选择器,以便在iframe完全加载后继续使用您的脚本:

casper.waitForResource(function check(res){
    var iframeSrc = this.getElementAttribute("iframe[name='mainframe']", "src");
    return res.url.indexOf(iframeSrc) > -1;
}).withFrame('mainframe', function(){
    this.waitForSelector("someSelectorForAnElement thatIsLoadedAtTheEnd", function(){
        this.echo(this.getHTML());
    });
});
casper.waitFor(function() {
    return this.withFrame('mainframe', function() {});
}, function() {

此代码根本不会等待。 CasperJS支持Fluent API,因此您可以将多个步骤函数链接在一起,如下所示:

casper.start(url)
    .then(function(){...})
    .wait(3000)
    .then(function(){...})
    .run();

这意味着withFrame()的结果是casper对象,对于该检查函数,该对象被评估为true。没有等待的时间。

console.log(this.echo(this.getHTML()));

没有意义,因为casper.echo()已经打印到控制台。使用

console.log(this.getHTML());

this.echo(this.getHTML());

但不是两者。