Я использую PhantomJS v1.4.1 для загрузки некоторых веб-страниц. У меня нет доступа к их серверной части, я просто получаю ссылки, указывающие на них. Я использую устаревшую версию Phantom, потому что мне нужно поддерживать Adobe Flash на этих веб-страницах.
Проблема в том, что многие веб-сайты загружают свой незначительный контент асинхронно, и поэтому обратный вызов Phantom onLoadFinished (аналог onLoad в HTML) срабатывает слишком рано, когда еще не все загружено. Кто-нибудь может подсказать, как мне ждать полной загрузки веб-страницы, чтобы сделать, например, снимок экрана со всем динамическим контентом, таким как реклама?
javascript
events
phantomjs
nilfalse
источник
источник
Ответы:
Другой подход - просто попросить PhantomJS немного подождать после загрузки страницы перед выполнением рендеринга, как в обычном примере rasterize.js , но с более длительным тайм-аутом, чтобы JavaScript мог завершить загрузку дополнительных ресурсов:
источник
Я бы предпочел периодически проверять
document.readyState
статус ( https://developer.mozilla.org/en-US/docs/Web/API/document.readyState ). Хотя этот подход немного неуклюж, вы можете быть уверены, что внутриonPageReady
функции вы используете полностью загруженный документ.Дополнительное объяснение:
Использование
setTimeout
вместо вложенныхsetInterval
предотвращаетcheckReadyState
«наложение» и условия гонки, когда его выполнение затягивается по некоторым случайным причинам.setTimeout
имеет задержку по умолчанию 4 мс ( https://stackoverflow.com/a/3580085/1011156 ), поэтому активный опрос не окажет существенного влияния на производительность программы.document.readyState === "complete"
означает, что документ полностью загружен всеми ресурсами ( https://html.spec.whatwg.org/multipage/dom.html#current-document-readiness ).источник
readyState
сработает только после полной загрузки DOM, однако все<iframe>
еще могут загружаться любые элементы, поэтому он не отвечает на первоначальный вопросВы можете попробовать комбинацию примеров waitfor и rasterize:
источник
Может быть , вы можете использовать
onResourceRequested
иonResourceReceived
обратные вызовы для обнаружения асинхронной загрузки. Вот пример использования этих обратных вызовов из их документации :Также вы можете посмотреть на
examples/netsniff.js
рабочий пример.источник
All the resource requests and responses can be sniffed using onResourceRequested and onResourceReceived
Вот решение, которое ожидает завершения всех запросов ресурсов. После завершения он зарегистрирует содержимое страницы в консоли и создаст скриншот отображаемой страницы.
Хотя это решение может послужить хорошей отправной точкой, я заметил, что оно терпит неудачу, поэтому это определенно не полное решение!
Мне не очень повезло, используя
document.readyState
.На меня повлиял пример waitfor.js, найденный на странице примеров phantomjs .
источник
В моей программе я использую некоторую логику, чтобы судить, была ли она загружена: при просмотре сетевого запроса, если не было нового запроса за последние 200 мс, я обрабатываю его по нагрузке.
Используйте это после onLoadFinish ().
источник
Я нашел этот подход полезным в некоторых случаях:
Если у вас есть страница, поместите в нее какой-нибудь скрипт:
источник
Я нашел это решение полезным в приложении NodeJS. Я использую его только в отчаянных случаях, потому что он запускает тайм-аут, чтобы дождаться полной загрузки страницы.
Второй аргумент - это функция обратного вызова, которая будет вызвана, как только ответ будет готов.
источник
Это реализация ответа Супра. Также он использует setTimeout вместо setInterval, как предложил Матеуш Чаритонюк.
Phantomjs выйдет через 1000 мсек, когда не будет никакого запроса или ответа.
источник
Этот код я использую:
В основном, учитывая тот факт, что вы должны знать, что страница полностью загружена, когда данный элемент появляется в DOM. Так что сценарий будет ждать, пока это не произойдет.
источник
Я использую личную смесь
waitfor.js
примера фантома .Это мой
main.js
файл:И
lib/waitFor.js
файл (который является просто копией иwaifFor()
вставкой функции изwaitfor.js
примера phantomjs ):Этот метод не асинхронный, но, по крайней мере, я уверен, что все ресурсы были загружены, прежде чем я попытаюсь их использовать.
источник
Это старый вопрос, но так как я искал полную загрузку страницы, но для Spookyjs (которая использует casperjs и phantomjs) и не нашел своего решения, я сделал для этого свой собственный скрипт, с тем же подходом, что и пользователь deemstone. Этот подход в течение определенного периода времени, если страница не получила или не запустила какой-либо запрос, завершит выполнение.
В файле casper.js (если вы установили его глобально, путь будет выглядеть примерно так: /usr/local/lib/node_modules/casperjs/modules/casper.js) добавьте следующие строки:
В верхней части файла со всеми глобальными переменными:
Затем внутри функции "createPage (casper)" сразу после "var page = require ('webpage'). Create ();" добавьте следующий код:
Затем внутри "page.onResourceReceived = function onResourceReceived (resource) {" в первой строке добавьте:
Сделайте то же самое для "page.onResourceRequested = function onResourceRequested (requestData, request) {"
Наконец, на странице «page.onLoadFinished = function onLoadFinished (status) {» в первой строке добавьте:
И это все, надеюсь, что это поможет кому-то в беде, как я. Это решение для casperjs, но работает напрямую для Spooky.
Удачи !
источник
это мое решение, это сработало для меня.
источник