2014-10-01 106 views
1

使用PhantomJS调用page.evaluate()时,是否可以在嵌入式JavaScript文件中引用函数?如何从evaluate()访问注入的.js文件中的函数?

例如我想调用包含在文件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的文件夹中。

+0

你的例子my.js包含一个语法错误。请注册['onConsoleMessage'](http://phantomjs.org/api/webpage/handler/on-console-message.html)和['onError'](http://phantomjs.org/api/webpage /handler/on-error.html)事件。也许有错误。如果没有错误,你可以尝试显式地将函数定义为'window.someFunctionInMyJs = function(){...}'。 – 2014-10-02 07:22:39

+0

@Artjom谢谢:我已经使用http://esprima.org/demo/validate.html修复了JS,但我仍然无法获得要识别的功能。你能否在答案中粘贴一个“窗口”的例子。下面的用法?我试过http://phantomjs.org/api/webpage/method/inject-js.html这个例子,但也有问题。我确信我在做一些愚蠢的事情。 – davek 2014-10-02 10:00:27

回答

1

问题是,您将脚本注入页面,该页面大约:此时为空,然后打开您的预期页面。您需要在page.open回调中注入脚本。每次您导航到另一个页面时,您都必须执行此操作。

​​

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

如果这仍然不起作用,那么您的功能可能不是全球性的,在这种情况下,您必须这样做。编辑my.js来定义你的函数为

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

谢谢!现在有效,一旦我使用'window'语法。 – davek 2014-10-02 10:37:45

相关问题