使用PhantomJS,我想注入一些JS,好像在任何其他<script>
标签之前有一个额外的<script>
标签。这是因为页面上的脚本使用了PhantomJS没有的一些函数,即Function.prototype.bind
和window.webkitRequestAnimationFrame
。我有一个带有两个自定义实现的JS文件,我希望PhantomJS在页面上运行脚本时使用它们。
难点在于,如果我在page.open之前执行page.injectJs,脚本将被注入空白页面,而不会被转移到正在打开的页面。
或者,如果我在page.open之后执行page.injectJs,则因为JavaScript错误(未定义的函数)已经发生,为时已晚。
我找到了一种似乎有效的方法,但显然是一种黑客攻击:
page.onResourceReceived = function() {
page.injectJs('phantom-hacks.js')
};
这会多次注入(显然每个资源两次),但这没关系,因为我的脚本是幂等的。但是,我想知道正确的方法:在页面上的任何脚本运行之前只注入一次。
谢谢:)
答案 0 :(得分:23)
我认为除了挂钩事件之外,还有一种“正确”的方式来注入这样的脚本。 我已经花了半年的时间与PhantomJs大量合作,并且在所有错误开始发生之前没有办法注入,但是在页面加载完毕之后。
我会尝试通过onInitialized,onLoadStarted,onLoadFinished。在钩子里面,我会调用page.evaluate(),这只会修改DOM,以便在你喜欢的任何地方都有这个额外的。
我认为其中一个(钩子)应该给你合适的时机。
干杯