如何加载远程js文件?

时间:2014-07-23 14:35:08

标签: javascript casperjs

test.js文件(例如:http://domain.com/test.js

var myjs = function()
{
     this.getName = function(){
         return 'this is a name';
     }
}

casperjs run.js(windows 7)

var casper = require("casper").create({
    loadImages: false,
    logLevel:   "error", //debug
    verbose:    true
});

casper.then(function() { // <-- no more run() but then()
    phantom.injectJs('http://domain.com/test.js');
    var my_ = new myjs(casper);
        name = my_.getName();
        this.echo(name);
});

我知道,phantom.injectJs不支持http://,但必须通过网站使用。

我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

你的意思并不完全清楚,因为你(错误地)尝试使用injectJS用于页面上下文,但随后将一个casper实例传递给myjs。所以我提供了3种解决方案。

通过require

加载到casper中

如果要加载远程文件就像使用require将本地文件加载到casper一样,那么您应首先download

var myjs;
casper.start(url)
casper.then(function(){
    this.download('http://domain.com/test.js', 'test.js');
    myjs = require('test'); // require the downloaded file
});
casper.then(function(){
    // do your thing
    var my_ = new myjs(casper);
    name = my_.getName();
    this.echo(name);
});

这样做意味着您必须在test.js文件中导出该函数:

module.export = function(casper) {
    this.getName = function(){
        return 'this is a name';
    };
};

如果test.js位于另一个域上,那么您需要使用--web-security=false标志启动casperjs。

通过eval

加载到casper中

如果您不想将test.js更改为模块,那么您可以sent an ajax request获取脚本,只需eval即可。

var globalmyjs;
casper.start(url)
casper.then(function(){
    var testJS = this.evaluate(function(){
        return __utils__.sendAJAX('http://domain.com/test.js', 'GET', null, false); // synchronous
    });
    eval(testJS);
    globalmyjs = myjs;
});
casper.then(function(){
    // do your thing
    var my_ = new globalmyjs(casper);
    name = my_.getName();
    this.echo(name);
});

如果test.js位于另一个域上,那么您需要使用--web-security=false标志启动casperjs。

加载到页面上下文

如果要在页面上下文中执行myjs,请使用此选项。

如果你想使用底层的phantomjs,那么它提供 includeJs(url, callback) 函数。

所以你可以像这样使用它:

var scriptLoaded = false;
casper.then(function() {
    phantom.includeJs('http://domain.com/test.js', function(){
        scriptLoaded = true;
    });
    casper.waitFor(function check() {
        return scriptLoaded;
    }, function then() {
        this.evaluate(function(){
            var my_ = new myjs(casper);
            name = my_.getName();
            console.log(name);
        });
    });
});

但是,你应该使用 casper.options.remoteScripts 属性。

所以要么在创建时注入脚本:

var casper = require("casper").create({
    remoteScripts: [ 'http://domain.com/test.js' ]
});

或在页面加载之前:

casper.options.remoteScripts.push('http://domain.com/test.js');
casper.start(url);
// or
casper.thenOpen(url);