24

<script>PhantomJS を使用して、他のタグの前に余分なタグがあるかのように JS を挿入したいと思い<script>ます。これは、ページ上のスクリプトが、PhantomJS にないいくつかの関数、つまりFunction.prototype.bindおよびを使用しているためwindow.webkitRequestAnimationFrameです。2 つのカスタム実装を含む JS ファイルがあり、ページでスクリプトを実行するときに PhantomJS でそれらを使用したいと考えています。

問題は、page.open の前に page.injectJs を実行すると、スクリプトが空のページに挿入され、開かれているページに引き継がれないことです。

または、page.open の後に page.injectJs を実行すると、JavaScript エラー (未定義関数) が既に発生しているため手遅れです。

うまくいくように見える方法を見つけましたが、明らかにハックです:

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

これにより、何度も (リソースごとに 2 回) 挿入されますが、私のスクリプトはべき等であるため問題ありません。ただし、これを行う適切な方法を知りたいです。ページ上のスクリプトが実行される前に、一度だけ挿入してください。

ありがとう :)

4

1 に答える 1

24

イベントにフックする以外に、そのようなスクリプトを挿入する「適切な」方法はないと思います。私は半年にわたって PhantomJs を大量に使用してきましたが、すべてのエラーが発生し始める前に挿入する方法が見つかりませんでしたが、ページの読み込みが完了した後でした。

onInitialized、onLoadStarted、onLoadFinished を試してみます。フック内で page.evaluate() を呼び出します。これは、DOM を変更して、好きな場所にこの余分なものを追加するだけです。

それらの 1 つ (フック) は、あなたが望む適切なタイミングを提供するはずだと思います。

乾杯

于 2013-03-17T22:37:59.873 に答える