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://
,但必须通过网站使用。
我不知道该怎么做。
答案 0 :(得分:1)
你的意思并不完全清楚,因为你(错误地)尝试使用injectJS
用于页面上下文,但随后将一个casper实例传递给myjs
。所以我提供了3种解决方案。
如果要加载远程文件就像使用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
如果您不想将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);