Подтвердить что ты не робот

PhantomJS: вводя script до запуска любых других скриптов

Используя PhantomJS, я хотел бы добавить несколько JS, как если бы был дополнительный тег <script> перед любыми другими тегами <script>. Это связано с тем, что в сценариях на странице используются некоторые функции, которые отсутствуют у PhantomJS, а именно Function.prototype.bind и window.webkitRequestAnimationFrame. У меня есть JS файл с пользовательскими реализациями двух, и я бы хотел, чтобы PhantomJS использовал их при запуске скриптов на странице.

Трудность состоит в том, что если я делаю page.injectJs перед page.open, script вводится в пустую страницу и не переносится на открываемую страницу.

В качестве альтернативы, если я делаю page.injectJs после page.open, это слишком поздно, когда ошибки JavaScript (undefined) уже произошли.

Я нашел способ, который, кажется, работает, но, очевидно, взломан:

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

Это вводит его много раз (дважды для каждого ресурса, видимо), но это нормально, потому что мой script является идемпотентным. Тем не менее, я хотел бы знать правильный способ сделать это: вставлять его только один раз и до запуска любых скриптов на странице.

Спасибо:)

4b9b3361

Ответ 1

Я не думаю, что есть "правильный" способ ввести такой script, кроме как подключиться к событиям. Я провел полгода, активно работая с PhantomJs, и не нашел способа вставить, прежде чем все ошибки начнутся, но после завершения загрузки страницы.

Я попытался бы пройти onInitialized, onLoadStarted, onLoadFinished. Внутри крючков я бы позвонил на страницу .evaluate(), которая просто изменила бы DOM, чтобы иметь это дополнительное место, которое вам нравится.

Я думаю, что один из них (крючки) должен дать вам нужное время, которое вы хотите.

Приветствия