PhantomJS:在运行任何其他脚本之前注入脚本

时间:2013-03-17 08:57:08

标签: phantomjs

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

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

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

我找到了一种似乎有效的方法,但显然是一种黑客攻击:

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

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

谢谢:)

1 个答案:

答案 0 :(得分:23)

我认为除了挂钩事件之外,还有一种“正确”的方式来注入这样的脚本。 我已经花了半年的时间与PhantomJs大量合作,并且在所有错误开始发生之前没有办法注入,但是在页面加载完毕之后。

我会尝试通过onInitialized,onLoadStarted,onLoadFinished。在钩子里面,我会调用page.evaluate(),这只会修改DOM,以便在你喜欢的任何地方都有这个额外的。

我认为其中一个(钩子)应该给你合适的时机。

干杯