2013-03-17 107 views
22

使用PhantomJS,我想注入一些JS,就好像在其他<script>标记之前有一个额外的<script>标记。这是因为页面上的脚本使用PhantomJS没有的一些功能,即Function.prototype.bindwindow.webkitRequestAnimationFrame。我有一个JS文件和两个自定义实现,我希望PhantomJS在页面上运行脚本时使用它们。PhantomJS:在任何其他脚本运行之前注入脚本

难度在于,如果我在page.open之前执行page.injectJs,脚本将被注入一个空白页面,并且不会转移到正在打开的页面。

或者,如果我在page.open之后执行page.injectJs,则已经发生JavaScript错误(未定义的函数)已经太晚了。

我发现,似乎工作的一种方式,但显然是一个黑客:

page.onResourceReceived = function() { 
    page.injectJs('phantom-hacks.js') 
}; 

这将给它多次(两次,每次资源,显然),不过没关系,因为我的剧本是幂等。但是,我想知道这样做的正确方法:只在页面上的任何脚本运行之前注入一次。

谢谢:)

+0

为什么不保持一个哈希所有要注入其中关键是该文件的文件和价值在于它是否被注射或不和,如果没有被注入再注入呢?或者你可以在第一次运行后停止事件监听器? – Nonconformist 2013-06-12 19:55:41

回答

23

我不认为有一个“正确”的方式来注入比钩住事件等这样的脚本。 我已经花了半年时间与PhantomJs大量合作,并且在所有错误开始发生之前但在页面加载完成之后发现无法注入。

我会尝试通过onInitialized,onLoadStarted,onLoadFinished。在钩子内部,我会调用page.evaluate(),它只会修改DOM,让这个额外的任何地方你喜欢。

我认为其中一个(钩)应该给你正确的时机,你想要的。

干杯

+9

使用'onInitialized'和'injectJs'(将相对路径传递给polyfills)在我的情况下完美工作。 – 2014-08-28 20:16:51

+2

@MarcoLazzeri感谢您的评论,'onInitialized'正是我需要的同一目的。 – haynar 2015-10-01 10:44:24