如何从evaluate()中注入.js文件中的函数?

时间:2014-10-01 16:51:26

标签: javascript phantomjs

使用PhantomJS调用page.evaluate()时,是否可以在嵌入式JavaScript文件中引用函数?

e.g。我想调用my.js文件中包含的函数someFunctionInMyJs

var page = require('webpage').create();
page.injectJs('my.js')
page.open('http://...', function() {
    var x = page.evaluate(function() {
       var y = someFunctionInMyJs();
       return y;
    });

    phantom.exit();
});

这可能/有替代方法吗?

my.js看起来像这样:

function someFunctionInMyJs() {
    return 'Hi there!';
}

我得到的错误是:

ReferenceError: Can't find variable: someFunctionInMyJs

my.js位于我调用PhantomJS的文件夹中。

1 个答案:

答案 0 :(得分:1)

问题是您在页面中注入了一个脚本:此时为空白,然后打开您想要的页面。您需要在page.open回调中注入脚本。每次导航到另一页时都必须这样做。

page.open('http://...', function() {
    page.injectJs('my.js')
    var x = page.evaluate(function() {
       var y = someFunctionInMyJs();
       return y;
    });

    phantom.exit();
});

如果您的脚本例如交换了XMLHttpRequest的实现,您也可以尝试通过page.onInitialized处理程序注入(injectJs)脚本。

如果这仍然不起作用,则可能是您的功能不是全局的,在这种情况下您必须这样做。编辑my.js以将您的函数定义为

window.someFunctionInMyJs = function() {
    return 'Hi there!';
};