24

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

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

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

我找到了一种似乎可行的方法,但显然是一种 hack:

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

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

谢谢 :)

4

1 回答 1

24

除了挂钩事件之外,我认为没有“正确”的方式来注入此类脚本。我花了半年时间大量使用 PhantomJs,发现在所有错误开始发生之前但在页面完成加载之后无法注入。

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

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

干杯

于 2013-03-17T22:37:59.873 回答