PhantomJS:在任何其他脚本运行之前注入一个脚本[英] PhantomJS: injecting a script before any other scripts run

问题描述

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

难点是如果我在page.open之前做page.injectJs的话,脚本会被注入到一个空的页面中,并不会延续到正在打开的页面.

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

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

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

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

谢谢:)

推荐答案

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

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

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

干杯

本文地址:https://www.itbaoku.cn/post/1739869.html