Estou usando o PhantomJS v1.4.1 para carregar algumas páginas da web. Não tenho acesso ao lado do servidor, apenas obtendo links apontando para eles. Estou usando a versão obsoleta do Phantom porque preciso oferecer suporte ao Adobe Flash nessas páginas da web.
O problema é que muitos sites estão carregando seu conteúdo menor assíncrono e é por isso que o retorno de chamada onLoadFinished do Phantom (analógico para onLoad em HTML) foi acionado muito cedo, quando nem tudo ainda estava carregado. Alguém pode sugerir como posso esperar que o carregamento completo de uma página da Web faça, por exemplo, uma captura de tela com todo o conteúdo dinâmico, como anúncios?
javascript
events
phantomjs
nilfalse
fonte
fonte
Respostas:
Outra abordagem é pedir ao PhantomJS que aguarde um pouco após o carregamento da página antes de fazer a renderização, conforme o exemplo regular do rasterize.js , mas com um tempo limite mais longo para permitir que o JavaScript conclua o carregamento de recursos adicionais:
fonte
Prefiro verificar periodicamente o
document.readyState
status ( https://developer.mozilla.org/en-US/docs/Web/API/document.readyState ). Embora essa abordagem seja um pouco desajeitada, você pode ter certeza de que aonPageReady
função interna está usando documento totalmente carregado.Explicação adicional:
Usando aninhado
setTimeout
vez desetInterval
impedir acheckReadyState
"sobreposição" e condições de corrida quando sua execução é prolongada por alguns motivos aleatórios.setTimeout
tem um atraso padrão de 4ms ( https://stackoverflow.com/a/3580085/1011156 ), portanto a pesquisa ativa não afetará drasticamente o desempenho do programa.document.readyState === "complete"
significa que o documento está completamente carregado com todos os recursos ( https://html.spec.whatwg.org/multipage/dom.html#current-document-readiness ).fonte
readyState
só gatilho assim que o DOM tenha sido totalmente carregada, no entanto quaisquer<iframe>
elementos podem ainda ser carregamento por isso realmente não responder à pergunta originalVocê pode tentar uma combinação dos exemplos waitfor e rasterize:
fonte
Talvez você possa usar os retornos de chamada
onResourceRequested
eonResourceReceived
para detectar carregamento assíncrono. Aqui está um exemplo de como usar esses retornos de chamada da documentação :Além disso, você pode procurar
examples/netsniff.js
um exemplo de trabalho.fonte
All the resource requests and responses can be sniffed using onResourceRequested and onResourceReceived
Aqui está uma solução que aguarda a conclusão de todas as solicitações de recursos. Depois de concluído, ele registrará o conteúdo da página no console e gerará uma captura de tela da página renderizada.
Embora essa solução possa servir como um bom ponto de partida, observei que ela falha, então definitivamente não é uma solução completa!
Não tive muita sorte usando
document.readyState
.Fui influenciado pelo exemplo do waitfor.js, encontrado na página de exemplos do phantomjs .
fonte
No meu programa, uso alguma lógica para julgar se foi onload: observando sua solicitação de rede, se não houve nova solicitação nos últimos 200ms, trato-a onload.
Use isso, depois de onLoadFinish ().
fonte
Achei essa abordagem útil em alguns casos:
Do que se você possui a página, coloque algum script dentro:
fonte
Encontrei esta solução útil em um aplicativo NodeJS. Eu o uso apenas em casos desesperados, porque inicia um tempo limite para aguardar o carregamento completo da página.
O segundo argumento é a função de retorno de chamada que será chamada assim que a resposta estiver pronta.
fonte
Esta é uma implementação da resposta do Supr. Também usa setTimeout em vez de setInterval, como sugeriu Mateusz Charytoniuk.
O Phantomjs será encerrado em 1000ms quando não houver nenhuma solicitação ou resposta.
fonte
Este é o código que eu uso:
Basicamente, considerando que você deveria saber que a página é baixada por completo quando um determinado elemento aparece no DOM. Portanto, o script vai esperar até que isso aconteça.
fonte
Eu uso uma mistura pessoal do exemplo phantomjs
waitfor.js
.Este é o meu
main.js
arquivo:E o
lib/waitFor.js
arquivo (que é apenas uma cópia e cola dawaifFor()
função dowaitfor.js
exemplo phantomjs ):Esse método não é assíncrono, mas pelo menos tenho certeza de que todos os recursos foram carregados antes de tentar usá-los.
fonte
Essa é uma pergunta antiga, mas como eu estava procurando pelo carregamento da página inteira, mas pelo Spookyjs (que usa casperjs e phantomjs) e não encontrou minha solução, criei meu próprio script para isso, com a mesma abordagem que o usuário deemstone. O que essa abordagem faz é, por um determinado período de tempo, se a página não receber ou iniciar nenhuma solicitação, ela encerrará a execução.
No arquivo casper.js (se você o instalasse globalmente, o caminho seria algo como /usr/local/lib/node_modules/casperjs/modules/casper.js) adicione as seguintes linhas:
Na parte superior do arquivo, com todos os vars globais:
Em seguida, dentro da função "createPage (casper)" logo após "var page = require ('página da web'). Create ();" adicione o seguinte código:
Em seguida, dentro de "page.onResourceReceived = function onResourceReceived (resource) {" na primeira linha, adicione:
Faça o mesmo para "page.onResourceRequested = function onResourceRequested (requestData, request) {"
Por fim, em "page.onLoadFinished = function onLoadFinished (status) {" na primeira linha, adicione:
E é isso, espero que este ajude alguém com problemas como eu. Esta solução é para casperjs, mas funciona diretamente para Spooky.
Boa sorte !
fonte
esta é a minha solução que funcionou para mim.
fonte