PhantomJS - Guia Rápido

PhantomJS é dito ser um headless browserporque não há envolvimento do navegador durante a execução do código JavaScript. A execução não será vista na tela do navegador, mas no prompt da linha de comando. As funcionalidades comoCSS Handling, DOM Manipulation, JSON, Ajax, Canvas, SVG,etc., serão todos atendidos no prompt de comando. O PhantomJS não possui uma GUI e, portanto, toda a sua execução ocorre na linha de comando.

Usando o PhantomJS, podemos gravar em um arquivo, ler o conteúdo do arquivo ou fazer upload de um arquivo, fazer uma captura de tela, converter a página da web em PDF e muito mais. Com navegadores sem cabeça, você obtém todo o comportamento do navegador, ou seja,Cookies, Http Request Methods ie GET /POST, Clearing Cookies, Deleting Cookies, etc., Reloading of Page, Navigating to a Different Page.

PhantomJS usa WebKit que tem um ambiente de navegação semelhante ao dos famosos navegadores - Google Chrome, Mozilla Firefox, Safari, etc. Ele também fornece uma grande quantidade de API JavaScript, que ajuda a fazer capturas de tela, upload de arquivo, gravação em arquivo, leitura de arquivo , interagindo com as páginas da web, etc.

O PhantomJS não suporta Flash ou Vídeo, pois requer plugins e é difícil suportá-los na linha de comando.

Recursos do PhantomJS

Vamos agora entender os recursos que o PhantomJS oferece.

Automação de página

PhantomJS permite a leitura do conteúdo da página com a ajuda de sua API. Pode ajudar a manipular o DOM, usar bibliotecas externas para realizar a tarefa necessária.

Captura de tela

PhantomJS ajuda a capturar a tela de uma página especificada e salvá-la como uma imagem em vários formatos como PNG, JPEG, PDF e GIF. Com a ajuda da captura de tela, pode facilmente ajudar a garantir que o conteúdo da web está bem.

PhantomJS oferece propriedades e métodos com a ajuda dos quais permite aos desenvolvedores ajustar o tamanho das capturas de tela e especificar a área que desejam capturar.

Teste sem cabeça

PhantomJS ajuda a testar a IU na linha de comando. Embora, com a ajuda de uma captura de tela, possa facilmente ajudar a encontrar erros na IU. Às vezes, o PhantomJS não pode ajudar nos testes sozinho. No entanto, ele pode ser empacotado junto com outras bibliotecas de teste como Mocha, Yoeman, etc. Você pode ter a ajuda do PhantomJS para carregar um arquivo e enviar o formulário.

O PhantomJS pode ser usado para testar logins nos sites e garantir que a segurança não seja comprometida. O PhantomJS pode ser usado junto com outras ferramentas comoCasperJS, Mocha, Qunit para tornar o teste mais poderoso.

Monitoramento de rede

Uma das características importantes do PhantomJS é seu uso para monitorar a conexão de rede usando a API disponível. O PhantomJS permite a inspeção do tráfego da rede; é adequado para construir várias análises sobre o comportamento e desempenho da rede.

O PhantomJS pode ser usado para coletar dados sobre o desempenho da página da web em um ambiente ao vivo. O PhantomJS pode ser usado com ferramentas comoYslow para reunir métricas de desempenho de quaisquer sites.

PhantomJS é um software livre distribuído sob a BSD License. É fácil de instalar e oferece vários recursos para executar os scripts. O PhantomJS pode ser executado facilmente em várias plataformas, como Windows, Linux e Mac.

Para baixar o PhantomJS, você pode ir para - http://phantomjs.org/ e clique na opção de download.

Para Windows

A página de download mostra as opções de download para diferentes sistemas operacionais. Baixe o arquivo zip, descompacte-o e você obterá um executávelphantom.exe. Defina a variável de ambiente PATH para o caminho do arquivo phantom.exe. Abra um novo prompt de comando e digitephantomjs –v. Ele deve fornecer a versão atual do PhantomJS em execução.

Para MAC OS X

Baixe o arquivo zip PhantomJS destinado ao MAC OS e extraia o conteúdo. Assim que o conteúdo for baixado, mova o PhantomJS para -/usr/local/bin/. Execute o comando PhantomJS, ou seja, phantomjs –v no terminal e ele deve fornecer a descrição da versão do PhantomJS.

Linux 64 bits

Baixe o arquivo zip PhantomJS destinado ao Linux de 64 bits e extraia o conteúdo. Assim que o conteúdo for baixado, mova a pasta PhantomJS para/usr/local/share/ e create a symlink -

sudo mv $PHANTOM_JS /usr/local/share sudo ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin.

Execute phantomjs –v no terminal e ele deve fornecer a versão do PhantomJS.

Linux 32 bits

Baixe o arquivo zip PhantomJS destinado ao Linux de 32 bits e extraia o conteúdo. Assim que o conteúdo for baixado, mova a pasta PhantomJS para/usr/local/share/ e criar um link simbólico -

sudo mv $PHANTOM_JS /usr/local/share sudo ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin.

Execute phantomjs –v no terminal e ele deve fornecer a versão do PhantomJS.

O código-fonte do PhantomJS também pode ser obtido do repositório git clicando no seguinte link - https://github.com/ariya/phantomjs/

Para executar scripts em PhantomJS, o comando é o seguinte -

phantomjs jsfile arg1 arg2…

Neste capítulo, veremos os quatro objetos importantes PhantomJS. Eles são os seguintes -

  • CookiesEnabled
  • Cookies
  • LibraryPath
  • Version

Vamos agora discutir cada um deles em detalhes.

cookiesEnabled

Informa se os cookies estão habilitados ou não. Vai voltartrue, se sim; de outra formafalse.

Sintaxe

Sua sintaxe é a seguinte -

phantom.cookiesEnabled

Exemplo

cookieenabled.js

phantom.addCookie ({  
   //adding cookie with addcookie property 
   name: 'c1', 
   value: '1', 
   domain: 'localhost' 
}); 

console.log("Cookie Enabled value is : "+phantom.cookiesEnabled); 
phantom.exit();

Resultado

Command - phantomjs cookieenabled.js

Cookie Enabled value is : true

Biscoitos

Ajuda adicionar e definir cookies para um domínio. Ele retorna um objeto com todos os cookies disponíveis para o domínio.

Sintaxe

Sua sintaxe é a seguinte -

phantom.cookies;

Exemplo

Filename: phantomcookie.js

phantom.addCookie ({ 
   name: 'c1', 
   value: '1', 
   domain: 'localhost' 
}); 
phantom.addCookie ({ 
   name: 'c2', 
   value: '2', 
   domain: 'localhost' 
}); 
phantom.addCookie ({ 
   name: 'c3', 
   value: '3', 
   domain: 'localhost' 
}); 
console.log(JSON.stringify(phantom.cookies)); 
phantom.exit();

Resultado

Command - phantomjs phantomcookie.js

[{"domain":".localhost","httponly":false,"name":"c3","path":"/","secure":false, " 
value":"3"},{"domain":".localhost","httponly":false,"name":"c2","path":"/","sec u 
re":false,"value":"2"},{"domain":".localhost","httponly":false,"name":"c1","pat h
":"/","secure":false,"value":"1"}]

No exemplo acima, adicionamos alguns cookies ao domínio localhost. Em seguida, buscamos usandophantom.cookies. Ele retorna um objeto com todos os cookies usando oJSON stringifymétodo para converter o objeto JavaScript em uma string. Você também pode usarforeach para acessar o nome / valores dos cookies.

LibraryPath

PhantomJS libraryPath armazena o caminho do script a ser usado pelo injectJS método.

Sintaxe

Sua sintaxe é a seguinte -

phantom.libraryPath

Exemplo

Aqui está um exemplo para descobrir a versão.

var webPage = require('webpage');
var page = webPage.create();

page.open('http://www.tutorialspoint.com/jquery', function(status) {
   if (status === "success") { 
      page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js ', function() { 
         if (page.injectJs('do.js')) { 
            // returnTitle is a function loaded from our do.js file - see below 
            return returnTitle(); 
         });
         
         console.log(title); 
         phantom.exit(); 
      } 
   } 
});

window.returnTitle = function() { 
   return document.title;
};

O programa acima gera o seguinte output.

Jquery Tutorial

Versão

Ele fornece a versão do PhantomJS que está em execução e retorna os detalhes em um objeto. Por exemplo: {"major": 2, "minor": 1, "patch": 1}

Sintaxe

Sua sintaxe é a seguinte -

phantom.version

Exemplo

Aqui está um exemplo para descobrir a versão.

var a = phantom.version;
console.log(JSON.stringify(a));
console.log(a.major);
console.log(a.minor);
console.log(a.patch);
phantom.exit();

O programa acima gera o seguinte output.

{"major":2,"minor":1,"patch":1} 
2 
1 
1

No exemplo acima, usamos console.logpara imprimir a versão. Atualmente, estamos executando na versão 2. Ele retorna o objeto com os detalhes mostrados no bloco de código acima.

PhantomJS é uma plataforma para ajudar a executar JavaScript sem um navegador. Para isso, são utilizados os seguintes métodos, que auxiliam na adição do cookie, exclusão, limpeza, saída do script, injeção de JS, etc.

Discutiremos mais sobre esses métodos PhantomJS e sua sintaxe neste capítulo. Métodos semelhantes, isto éaddcookie, injectjs existe no módulo da página da Web, que será discutido nos capítulos subsequentes.

PhantomJS expõe os seguintes métodos que podem nos ajudar a executar JavaScript sem o navegador -

  • addCookie
  • clearCookie
  • deleteCookie
  • Exit
  • InjectJS

Vamos agora entender esses métodos em detalhes com exemplos.

addCookie

O método addcookie é usado para adicionar cookies e armazenar os dados. É semelhante ao modo como o navegador o armazena. Leva um único argumento que é um objeto com todas as propriedades dos cookies e a sintaxe para ele se parece com a mostrada abaixo -

Sintaxe

Sua sintaxe é a seguinte -

phantom.addCookie ({ 
   "name" : "cookie_name",  
   "value" : "cookie_value", 
   "domain" : "localhost" 
});

O nome, valor e domínio são propriedades obrigatórias a serem adicionadas à função addcookie. Se alguma dessas propriedades estiver faltando nos objetos de cookie, esse método falhará.

  • name - especifica o nome do cookie.

  • value - especifica o valor do cookie a ser usado.

  • domain - domínio ao qual o cookie será aplicado.

Exemplo

Aqui está um exemplo do addcookie método.

var page = require('webpage').create(),url = 'http://localhost/tasks/a.html'; 
page.open(url, function(status) { 
   if (status === 'success') {     
      phantom.addCookie({   //add name cookie1 with value = 1 
         name: 'cookie1', 
         value: '1', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie2 with value 2 
         name: 'cookie2', 
         value: '2', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie3 with value 3 
         name: 'cookie3', 
         value: '3', 
         domain: 'localhost' 
      }); 
      console.log('Added 3 cookies'); 
      console.log('Total cookies :'+phantom.cookies.length);  
      
      // will output the total cookies added to the url.    
   } else { 
      console.error('Cannot open file'); 
      phantom.exit(1); 
   } 
});

Exemplo

a.html

<html>
   <head>
      <title>Welcome to phantomjs test page</title>
   </head>
   
   <body>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
   </body>
</html>

O programa acima gera o seguinte output.

Added 3 cookies 
Total cookies :3

Os comentários do código são autoexplicativos.

clearCookies

Este método permite excluir todos os cookies.

Sintaxe

Sua sintaxe é a seguinte -

phantom.clearCookies();

Este conceito funciona de forma semelhante à exclusão dos cookies do navegador, selecionando no menu do navegador.

Exemplo

Aqui está um exemplo do clearCookies método.

var page = require('webpage').create(),url = 'http://localhost/tasks/a.html'; 
page.open(url, function(status) { 
   if (status === 'success') {     
      phantom.addCookie({   //add name cookie1 with value = 1 
         name: 'cookie1', 
         value: '1', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie2 with value 2 
         name: 'cookie2', 
         value: '2', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie3 with value 3 
         name: 'cookie3', 
         value: '3', 
         domain: 'localhost' 
      }); 
      console.log('Added 3 cookies'); 
      console.log('Total cookies :'+phantom.cookies.length); 
      phantom.clearCookies(); 
      console.log(
         'After clearcookies method total cookies :' +phantom.cookies.length); 
      
      phantom.exit();     
   } else { 
      console.error('Cannot open file'); 
      phantom.exit(1); 
   } 
});

a.html

<html>
   <head>
      <title>Welcome to phantomjs test page</title>
   </head>
   
   <body>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
      <h1>This is a test page</h1>
   </body>
</html>

O programa acima gera o seguinte output.

Added 3 cookies 
Total cookies :3 
After clearcookies method total cookies :0

deleteCookie

Exclua qualquer cookie no CookieJarcom uma propriedade 'name' correspondente a cookieName. Vai voltartrue, se excluído com sucesso; de outra formafalse.

Sintaxe

Sua sintaxe é a seguinte -

phantom.deleteCookie(cookiename);

Vamos entender addcookie, clearcookies e deletecookie com a ajuda de um exemplo.

Exemplo

Aqui está um exemplo para demonstrar o uso do método deleteCookie -

File: cookie.js

var page = require('webpage').create(),url = 'http://localhost/tasks/a.html'; 
page.open(url, function(status) { 
   if (status === 'success') {     
      phantom.addCookie({   //add name cookie1 with value = 1 
         name: 'cookie1', 
         value: '1', 
         domain: 'localhost' 
      }); 
      phantom.addCookie({   // add cookie2 with value 2 
         name: 'cookie2', 
         value: '2', 
         domain: 'localhost' 
      });
      phantom.addCookie({   // add cookie3 with value 3 
         name: 'cookie3', 
         value: '3', 
         domain: 'localhost' 
      });  
      console.log('Added 3 cookies'); 
      console.log('Total cookies :'+phantom.cookies.length); 
      
      //will output the total cookies added to the url.    
      console.log("Deleting cookie2"); 
      phantom.deleteCookie('cookie2'); 
      
      console.log('Total cookies :'+phantom.cookies.length); 
      phantom.clearCookies();
      
      console.log(
         'After clearcookies method total cookies :' +phantom.cookies.length); 
      phantom.exit(); 
   } else { 
      console.error('Cannot open file'); 
      phantom.exit(1); 
   } 
});

O programa acima gera o seguinte output.

phantomjs cookie.js
Added 3 cookies
Total cookies :3
Deleting cookie2
Total cookies :2
After clearcookies method total cookies :0

Saída

O método phantom.exit sairá do script que foi iniciado. Sai do programa com o valor de retorno mencionado. Dá‘0’, se nenhum valor for passado.

Sintaxe

Sua sintaxe é a seguinte -

phantom.exit(value);

Caso você não adicione phantom.exit, a linha de comando presume que a execução ainda está ativa e não será concluída.

Exemplo

Vejamos um exemplo para entender o uso do exit método.

console.log('Welcome to phantomJs');  // outputs Welcome to phantomJS 
var a = 1; 
if (a === 1) { 
   console.log('Exit 1'); //outputs Exit 1 
   phantom.exit(); // Code exits. 
} else { 
   console.log('Exit 2'); 
   phantom.exit(1); 
}

O programa acima gera o seguinte output.

phantomjs exit.js

Welcome to phantomJs 
Exit 1

Qualquer trecho de código após phantom.exit não será executado, pois phantom.exit é um método para finalizar o script.

injectJs

InjectJs é usado para adicionar addtionaljsarquivos em fantasma. Se o arquivo não for encontrado no atualdirectory librarypath, a propriedade fantasma (phantom.libraryPath) é usada como um local adicional para rastrear o caminho. Retornatrue se a adição do arquivo for bem-sucedida de outra forma false em caso de falha, caso não seja possível localizar o arquivo.

Sintaxe

Sua sintaxe é a seguinte -

phantom.injectJs(filename);

Exemplo

Vejamos o exemplo a seguir para entender o uso de injectJs.

Filename: inject.js

console.log(“Added file”);

File name: addfile.js

var addfile =  injectJs(inject.js);
console.log(addfile);
phantom.exit();

Resultado

Command - C: \ phantomjs \ bin> phantomjs addfile.js

Added file // coming from inject.js
true

No exemplo acima, addfile.js chama o arquivo inject.jsusando injectJs. Quando você executa addfile.js, o console.log presente em inject.js é mostrado na saída. Também é verdadeiro para a variável addfile, uma vez que o arquivo inject.js foi adicionado com sucesso.

PhantomJS fornece várias propriedades e métodos para nos ajudar a interagir com o conteúdo de uma página da web.

O comando require ("webpage"). Create () cria um objeto de página da web. Usaremos este objeto para manipular a página web com a ajuda das propriedades e métodos listados abaixo.

var wpage = require("webpage").create();

A tabela a seguir contém a lista de todas as propriedades da página da web que discutiremos.

S.No Propriedades e descrição
1 canGoBack

Esta propriedade retorna truese há página anterior no histórico de navegação; se não,false.

2 canGoForward

Esta propriedade retorna true se houver próxima página no histórico de navegação; se não,false.

3 clipRect

clipRect é um objeto com os valores top, left, width e height e usado para fazer a captura da imagem da página web quando usado pelo método render ().

4 Conteúdo

Esta propriedade contém o conteúdo da página da web.

5 biscoitos

Com os cookies, você pode definir / obter os cookies disponíveis na URL. Ele também fornecerá os cookies disponíveis no URL e os novos cookies definidos na página.

6 customHeaders

customHeaders especifica cabeçalhos de solicitação HTTP adicionais que serão enviados ao servidor para cada solicitação emitida pela página.

7 Evento

Ele fornece uma longa lista de eventos, ou seja, modificador, detalhes de teclas.

8 focusFrameName

Retorna o nome do quadro atualmente em foco.

9 frameContent

Esta propriedade fornece o conteúdo do quadro que está ativo.

10 frameName

Retorna o nome do quadro atualmente em foco.

11 framePlainText

Esta propriedade também fornece o conteúdo do quadro ativo atual, mas apenas o conteúdo sem nenhuma tag html.

12 frameTitle

Fornece o título do quadro ativo.

13 frameUrl

Esta propriedade fornecerá o url do quadro atualmente em foco.

14 framesCount

Dá a contagem de frames presentes na página.

15 framesName

Fornece uma matriz de nomes de quadros.

16 libraryPath

Esta propriedade possui o caminho, que é usado pelo método page.inectJs.

17 NavigationLocked

Esta propriedade define se a navegação da página é permitida ou não. Se verdadeiro, estará no url da página atual e clicar na página para ir para a próxima página não será permitido.

18 offlineStoragePath

Esta propriedade fornece o caminho onde os dados são armazenados usando window.localStorage. O caminho pode ser alterado usando --local-storage-path na linha de comando.

19 offlineStorageQuota

Esta propriedade define a quantidade máxima de dados que você pode armazenar em window.localStorage. O valor é 5242880 bytes, que é 5 MB. Esse valor pode ser substituído na linha de comando usando o seguinte comando --localstorage-quota = size aqui.

20 possui páginas

ownsPages retorna verdadeiro ou falso se a página aberta pela página da web for filha da página da web.

21 pagesWindowName

PagesWindowName fornecerá os nomes das janelas abertas usando window.open

22 Páginas

A propriedade pages fornecerá um array de páginas abertas em uma página usando window.open. Se a página for fechada em url você referindo a página não será considerado.

23 Tamanho do papel

Esta propriedade fornece o tamanho, ou seja, as dimensões da página da web quando precisa ser usado para converter a página da web em um formato pdf. PaperSize contém as dimensões exigidas em um objeto.

24 texto simples

Esta propriedade também fornece o conteúdo do quadro ativo atual, mas apenas o conteúdo sem nenhuma tag html.

25 scrollPosition

Este contém um objeto que indica a posição de rolagem. Dá esquerda e topo.

26 configurações

Esta propriedade fornecerá as configurações da página da Web quando o método page.open for usado. Depois que a página for carregada, as alterações nas propriedades das configurações não criarão nenhum impacto.

27 título

Esta propriedade fornecerá o título da página que você está lendo.

28 url

Esta propriedade fornecerá o url da página.

29 viewportSize

Esta propriedade permite alterar o tamanho da tela da janela. Ele contém largura e altura, que você pode ler ou alterar de acordo com as necessidades.

30 windowName

Dá o nome da janela.

31 zoomFactor

Esta propriedade especifica o fator de zoom para os métodos render e renderBase64. Isso ajuda a ampliar uma página e fazer uma captura de tela, se necessário.

O Módulo de página da web tem métodos para Cookies, Frames, Page Navigation, Reload, Rendering e Uploading of Files.

A seguir estão os métodos disponíveis na página da web.

S.No Métodos e Descrição
1 addCookie ()

O método addCookie adiciona cookies à página especificada.

2 childFramesCount()

Este método está obsoleto de acordo com http://phantomjs.org.

3 childFramesName()

Este método está obsoleto de acordo com http://phantomjs.org.

4 clearCookies ()

Exclui todos os cookies da página especificada.

5 Fechar()

Este método é usado para fechar a página e liberar a memória usada. Qualquer um dos métodos ou propriedades da página da web não funcionará depois que o fechamento for chamado.

6 currentFrameName()

Este método está obsoleto de acordo com http://phantomjs.org.

7 deleteCookie ()

Isso excluirá um cookie com o nome correspondente à lista existente de cookies presentes para um determinado URL de página.

8 avaliaAsync ()

Avalie a função fornecida de forma assíncrona na página, sem bloquear a execução atual. Esta função ajuda a executar certos scripts de forma assíncrona.

9 avaliaJavascript ()

EvaluateJavaScript ajuda a executar a função passada a ele como uma string. Observe que a string passada deve ser apenas uma função.

10 Avalie()

Avaliar executará a função transmitida a ele. Se a função contiver mensagens de console, ela não será exibida diretamente no terminal. Para exibir qualquer mensagem do console, você precisa usar o retorno de chamada fantasma onConsoleMessage.

11 getPage ()

Isso fornecerá a página filha que corresponde ao nome da janela passado em getpage.

12 volte()

Dá a página anterior no histórico de navegação, se apenas a navegação não estiver bloqueada.

13 vá em frente()

Dá a próxima página no histórico de navegação, se apenas a navegação não estiver bloqueada.

14 ir()

Este método permite que você navegue com as páginas.

15 includeJs ()

Includejs executa o arquivo JS externo na página e executa a função de retorno de chamada na conclusão.

16 injectJs ()

InjectJs inclui script externo de um arquivo especificado na página. Se o arquivo não estiver disponível no diretório atual, ele usou libraryPath para pesquisa adicional do arquivo. Retorna verdadeiro se o arquivo for injetado, caso contrário, falso.

17 Abrir URL()

OpenUrl abre uma página da web. É semelhante ao método aberto do PhantomJS. OpenUrl tem alguns parâmetros adicionais, que são httpConf, configurações e funções de callback.

18 abrir()

Abrir é usado para abrir uma página da web.

19 lançamento()

Liberar irá liberar o uso de heap de memória para a página. Não use métodos de instância de página após o lançamento ser chamado. Este método é semelhante ao método close e seu uso está obsoleto. Em vez disso, use wpage.close ().

20 recarregar()

Reload é usado para recarregar a página atual usada.

21 renderBase64 ()

Este método pega a captura de tela e dá a imagem como uma string em base46. Renderbase64 suporta formatos como PNG, JPEG e JPG. Não suporta GIF no momento. Você pode usar a propriedade clipRect para definir a parte para a captura da imagem.

22 renderBuffer ()

RenderBuffer leva a captura da página da web para um buffer de imagem, que pode ser enviado diretamente para o servidor. Os formatos suportados são PNG, GIF e JPEG.

23 render ()

Renderizar ajuda a pegar o buffer da imagem e salvá-lo de acordo com o formato especificado.

24 sendEvent ()

É usado para enviar um evento para a página da web. Eles não são eventos dom. Cada um desses eventos é enviado para a página da web com base na interação do usuário.

25 setContent ()

setcontent mudará o conteúdo da página do url especificado com o conteúdo especificado.

26 Pare()

Isso ajuda a parar o carregamento da página.

27 switchToChildFrame()

O uso de switchToFrame () está obsoleto;

28 switchToFocusedFrame ()

Ele seleciona o quadro que está em foco.

29 switchToFrame ()

Seleciona o quadro com o nome especificado e que é filho do quadro atual.

30 switchToMainFrame ()

Seleciona o mainframe, ou seja, a janela raiz.

31 switchToParentFrame ()

Ele pega o quadro pai do quadro filho atual.

32 subir arquivo()

Este método é usado para lidar com o upload do arquivo feito usando formulário em html. O PhantomJS não tem uma maneira direta de fazer isso usando formulários, o mesmo pode ser feito usando o método uploadFile. Leva o seletor de tag html para a localização do arquivo e o destino para onde ele deve ser copiado.

Os retornos de chamada disponíveis com o módulo de página da web são descritos na tabela a seguir.

S.No Chamadas de retorno e descrição
1 Em alerta()

Este retorno de chamada é chamado quando há um alerta na página; o retorno de chamada recebe uma string e não retorna nada.

2 onCallback ()

OnCallback é usado para passar valores da página da web para o objeto da página da web e é feito usando o método window.callPhantom (), que invoca internamente a função onCallback.

3 onClosing ()

Isso é chamado quando a janela é fechada usando o método page.close () ou o método window.close ().

4 onConfirm ()

Este callback é chamado quando há uma mensagem confirmada chamada com ok / cancel na página.

5 onConsoleMessage ()

Este retorno de chamada é usado quando há mensagens de console usadas na página da web. O método onConsoleMessage leva 3 argumentos.

6 onError ()

É chamado quando há um erro de JavaScript. Os argumentos para onError são msg e stack trace, que é uma matriz.

7 onFilePicker ()

Isso é usado para fazer upload de arquivo, o retorno de chamada é chamado quando o usuário deseja fazer upload de um arquivo.

8 onInitialized ()

Este retorno de chamada é invocado quando a página é chamada antes de carregar.

9 onLoadFinished ()

Esta função é chamada quando a página aberta está totalmente carregada. Ele tem um argumento, que informa quando o carregamento foi um sucesso ou uma falha.

10 onLoadStarted ()

Este retorno de chamada é invocado quando a página começa a carregar.

11 onNavigationRequested ()

Este retorno de chamada informa quando o evento de navegação está ocorrendo.

12 onPageCreated ()

Este retorno de chamada é invocado quando uma nova janela filho é aberta pela página.

13 onPrompt ()

Este retorno de chamada é chamado quando um prompt é chamado pela página da web. Leva 2 argumentos, mensagem e resposta. O valor de retorno é uma string.

14 onResourceError ()

Este retorno de chamada é chamado quando a página da web não consegue fazer upload do arquivo.

15 onResourceReceived ()

Este callback é chamado quando o recurso solicitado pela página é recebido.

16 onResourceRequested ()

Esta função é invocada quando a página solicita um recurso.

17 onResourceTimeout ()

Esse retorno de chamada é chamado quando o recurso solicitado atinge o tempo limite, quando settings.resourceTimeout é usado.

18 onUrlChanged ()

Isso é chamado quando o URL muda do atual usando a navegação. Ele tem um argumento para o retorno de chamada, que é uma nova string targetUrl de URL.

O módulo de processo Phantomjs Child ajuda a interagir com os subprocessos e conversar com eles usando stdin /stdout/stderr. Os processos filhos podem ser usados ​​para tarefas comoprinting, sending mail ou para invoke programsescrito em outro idioma. Para criar um módulo de processo filho, você precisa de referências.

Por exemplo -

var process = require("child_process");

Método de Spawn

Com o processo filho de spawn, você pode se inscrever em seu stdout e stderr streams para obter dados em tempo real.

Sintaxe

Sua sintaxe é a seguinte -

var spawn = require('child_process').spawn;

Exemplo

Vejamos um exemplo do método de desova.

var process = require("child_process")
var spawn = process.spawn
var child = spawn("cmd", ['/c', 'dir']);

child.stdout.on("data", function (data) {
   console.log("spawnSTDOUT---VALUE:", JSON.stringify(data))
})
child.stderr.on("data", function (data) {
   console.log("spawnSTDERR:", JSON.stringify(data))
})
child.on("exit", function (code) {
   console.log("spawnEXIT:", code)
})

Resultado

O programa acima gera a seguinte saída.

spawnSTDOUT---VALUE: " Volume in drive C is OS\r\n"
spawnSTDOUT---VALUE: " Volume Serial Number is 7682-9C1B\r\n\r\n Directory of C:
\\phantomjs\\bin\r\n\r\n"
spawnSTDOUT---VALUE: "20-05-2017  10:01
<DIR>          .\r\n20-05-2017  10:01
<DIR>          ..\r\n13-05-2017  20:48   12 a,txt.txt\r\n07-05-2017  08:51
63 a.js\r\n06-05-2017  16:32           120,232 a.pdf\r\n13-05-2017  20:49 
spawnEXIT: 0

O Módulo do Sistema de Arquivos tem muitas APIs para lidar com arquivos e diretórios. Você pode criar / gravar e excluir um arquivo / diretório. Para começar a usar o módulo do sistema de arquivos, você deve exigir uma referência aofs module.

var fs = require('fs');

Existem duas propriedades disponíveis para o módulo do sistema de arquivos: Separator e Working Directory. Deixe-nos entendê-los em detalhes.

Separador

Ele informa o separador usado para os caminhos de arquivo.

  • Para Windows:\
  • Para Linux: /

Sintaxe

Sua sintaxe é a seguinte -

fs.seperator

Exemplo

var fs = require('fs');
console.log(fs.seperator);
phantom.exit();

O programa acima gera o seguinte output.

undefined

diretório de trabalho

O diretório de trabalho é o diretório no qual o PhantomJS é executado.

Sintaxe

Sua sintaxe é a seguinte -

var fs = require('fs');
fs.workingDirectory;

Exemplo

var fs = require('fs');
console.log(fs.workingDirectory);
phantom.exit();

O programa acima gera o seguinte output.

C:/phantomjs/bin

A tabela a seguir contém todos os métodos e suas descrições, disponíveis no módulo Sistema de Arquivos.

S.No Métodos e Descrição
1 absoluto

Este método fornece o caminho absoluto onde o PhantomJS é executado.

2 changeWorkingDirectory

Isso permite que você altere o diretório de trabalho e retorna verdadeiro; se for bem-sucedido, caso contrário, retorna falso

3 copyTree

copyTree irá copiar um diretório de um caminho para outro. O primeiro parâmetro é uma pasta de origem e o segundo parâmetro é uma pasta de destino.

4 copy

This method helps to copy file from one location to another. It takes two parameters. The first parameter is the source file and the second parameter is the file path, where it has to be copied. It will throw an error, if the source or destination file does not exist.

5 exists

It checks whether the given file path exists in the system. It returns true, if it is present, otherwise false.

6 isAbsolute

This method will return true, if the file path is absolute and false, if relative.

7 isDirectory

isDirectory tells if the given file is a directory or not. It returns true, if directory otherwise false. It gives false in case if the given path does not exist.

8 isExecutable

This method will tell if the given file is executable or not. It returns true, if executable, otherwise false.

9 isFile

This gives details whether the filepath given is a file or not. It returns true, if it is a file and false, if it is not.

10 isLink

This will give you true, if the file path is a symlink, otherwise false.

11 isReadable

It checks if the given file is readable or not. It gives true, if yes and false, if not.

12 isWritable

It tells whether if a given file is writable. Returns true, if yes, otherwise false.

13 lastModified

Gives the details of the last modification done to the file. It tells the date and time of when the file was last modified.

14 list

It gives all the files present in the directory.

15 makeDirectory

Creates a new directory.

16 makeTree

makeTree creates all necessary folders to be able to form final directories. This will return true, if the creation was successful, otherwise false. If the directory already exists, it will return true.

17 move

It will move the file from one path to another.

18 open

It is used to open up the file.

19 readLink

This will return the absolute path of a file or a folder pointed by a symlink (or shortcut on Windows). If the path is not a symlink or shortcut, it will return an empty string.

20 read

This will read the given file.

21 removeDirectory

This will remove the given directory.

22 removeTree

It will delete all the files and folders from the given folder and finally delete the folder itself. If there is any error while doing this process, it will throw an error – 'Unable to remove directory tree PATH' and hang execution.

23 remove

It removes the given file.

24 size

It gives the size of the file.

25 touch

It creates a given file.

26 write

Writes to a given file.

In this chapter, we will discuss regarding the various System Module Properties of PhantomJS.

args

The system module of PhantomJS has different properties, which help to pass arguments, get to know the file that is executed, etc.

The args property basically returns the arguments passed at the command line. You can also pass the page-URL that you want to read. If you want to store the screen-capture pdf-file or upload file, the details can be passed to the command line and can be read using the args property.

Let us find the length and the way to fetch each argument passed to the command line.

Syntax

Its syntax is as follows −

var system = require('system'); 
system.args;

Example

Take a look at the following example to understand how this property works.

var system = require('system');
console.log(system.args.length);

if (system.args.length>0) {
   console.log(JSON.stringify(system.args));
}
phantom.exit();

The above program generates the following output.

Command − phantomsjs args.js http://localhost/tasks/request.html

2
["args.js","http://localhost/tasks/request.html"]

The first value is the name of the file and next value is the URL passed. You can pass more arguments in the command line and fetch the same using system.args.

env

The env property returns the details of the system.

Syntax

Its syntax is as follows −

var system = require('system'); 
system.env;

Example

var system = require('system'); 
console.log(JSON.stringify(system.env)); 
phantom.exit();

The above program generates the following output.

{"=::":"::\\","=C:":"C:\\phantomjs\\bin","=ExitCode":"00000000","ALLUSERSPROFILE":
"C:\\ProgramData","APPDATA":"C:\\Users\\UserName\\AppData\\Roaming","COMPUTERNAME":
"X","ComSpec":"C:\\Windows\\system32\\cmd.exe","CommonProgramFiles":
"C:\\Program Files (x86)\\Common Files","CommonProgramFiles(x86)":
"C:\\Program Files (x86)\\Common Files","CommonProgramW6432":
"C:\\Program Files\\Common Files","FP_NO_HOST_CHECK":"NO","HOMEDRIVE":"C:",
"HOMEPATH":"\\Users\\UserName","LOCALAPPDATA":
"C:\\Users\\UserName\\AppData\\Local","LOGONSERVER":"\\\\MicrosoftAccount",
"NUMBER_OF_PROCESSORS":"2","OS":"Windows_NT","PATHEXT":".COM;.EXE;.BAT;.CMD;.VBS ;
.VBE;.JS;.JSE;.WSF;.WSH;.MSC","PROCESSOR_ARCHITECTURE":"x86","PROCESSOR_ARCHITEW64 32":
"AMD64","PROCESSOR_IDENTIFIER":"Intel64 Family 6 Model 58Stepping9,GenuineIntel",
"PROCESSOR_LEVEL":"6","PROCESSOR_REVISION":"3a09","PROMPT":
"$P$G","PSModulePath":"C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\
Modules\\" ,"PUBLIC":"C:\\Users\\Public","Path":
"C:\\Program Files\\Dell\\DW WLAN Card;
c:\\Program Files (x86)\\Intel\\iCLS Client\\;c:\\Program Files\\Intel\\iCLSClient\\;
C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\ \Wbem;
C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;
C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;
C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;
C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;
C:\\Program Files (x86)\\Intel\\Intel(R) 
ManagementEngineComponents\\IPT;c:\\ProgramFiles\\WIDCOMM\\BluetoothSoftware\\;
c:\\ProgramFiles\\WIDCOMM\\BluetoothSoftware\\syswow64;
C:\\ProgramFiles(x86)\\WindowsLive\\Shared;C:\\ProgramFiles\\nodejs\\;
C:\\ProgramFiles\\Git\\cmd;C:\\ProgramFiles\\ OpenVPN\\bin;
C:\\ProgramFiles(x86)\\Skype\\Phone\\;C:\\Users\\UserName\\AppData\\Roaming
\\npm","ProgramData":
"C:\\ProgramData","ProgramFiles":"C:\\ProgramFiles(x86)", 
"ProgramFiles(x86)":"C:\\ProgramFiles(x86)","ProgramW6432":
"C:\\ProgramFiles","SESSIONNAME":"Console","SystemDrive":
"C:","SystemRoot":"C:\\Windows","TEMP":"C:\\Users\ \Username~1\\AppData\\Local\\Temp",
"TMP":"C:\\Users\\Username~1\\AppData\\Local\\Temp",
"USERDOMAIN":"USER","USERDOMAIN_ROAMINGPROFILE":"USER","USERNAME":"X Y","USERPROFILE":
"C:\\Users\\X Y","windir":"C:\\Windows"}

OS

It returns the details of the operating system used. It returns an object with architecture, name of the OS, and version.

Syntax

Its syntax is as follows −

var system = require('system');
system.os;

Example

var system = require('system');
console.log(JSON.stringify(system.os));
phantom.exit();

The above program generates the following output.

{"architecture":"32bit","name":"windows","version":"8.1"}

pid

This property returns the process ID.

Syntax

Its syntax is as follows −

var system = require('system');
system.pid;

Example

Let us look at an example of the pid property.

var system = require('system');
console.log(system.pid);
phantom.exit();

The above program generates the following output.

2160

platform

This property returns the platform we are working on.

Syntax

Its syntax is as follows −

var system = require('system');
system.platform;

Example

var system = require('system');
console.log(system.platform);
phantom.exit();

The above program generates the following output.

Phantomjs

PhantomJS uses an embedded web server called mongoose. Right now, PhantomJS cannot connect with any other production webserver. With respect to connection, it can deal with 10 connections at a time and more than 10 requests will be waiting in a queue.

To start a webserver, we need to use the following syntax −

var webserver = require (‘webserver’);

Let us understand the Port property, which is used to listen to the requests that are sent to the webserver.

port

The Port property for a webserver is used to listen to the request that are sent to it.

Syntax

Its syntax is as follows −

var server = require('webserver').create();
var listening = server.listen(port, function (request, response) {});

Example

Let us take an example to understand how the port property works.

var webserver = require('webserver'); 
var server = webserver.create(); 
var service = server.listen(8080,function(request,response){  
}); 
if(service) console.log("server started - http://localhost:" + server.port);

The above program generates the following output.

server started - http://localhost:8080

In this chapter, we will discuss regarding the various methods of the Web Server Module of PhantomJS.

close

The close method is used to close the webserver.

Syntax

Its syntax is as follows −

var server = require('webserver').create();
server.close();

Example

The following example shows how you can use the close method.

var webserver = require('webserver');
var server = webserver.create();
var service = server.listen(8080,function(request,response){
});

if(service) console.log("server started - http://localhost:" + server.port);
console.log(server.port);
server.close();
console.log(server.port);

The above program generates the following output.

server started - http://localhost:8080 
8080

Here, we have consoled server.port after closing the server. Hence, it will not respond, as the webserver is already closed.

listen

The server.listen method takes the port and callback function with two arguments, which are – Request Object and Response Object.

The Request Object contains the following properties −

  • Method − This defines the method GET /POST.

  • URL − This displays the requested URL.

  • httpVersion − This displays the actual http version.

  • Headers − This displays all the headers with key value pairs.

  • Post − Request body applicable only for the post method.

  • postRaw − If the Content-Type header is set to 'application/x-www-formurlencoded', the original content of the post will be stored in this extra property (postRaw) and then that post will be automatically updated with a URL-decoded version of the data.

o Response Object contém as seguintes propriedades -

  • Headers- Tem todos os cabeçalhos HTTP como pares de valor-chave. Deve ser definido antes de chamar write pela primeira vez.

  • SetHeader - Isso define um cabeçalho específico.

  • Header (name) - Retorna o valor do cabeçalho fornecido.

  • StatusCode - Define o código de status HTTP retornado.

  • SetEncoding (encoding)- Isso é usado para converter dados fornecidos para write (). Por padrão, os dados serão convertidos em UTF-8. Indique "binário" se os dados forem uma string binária. Não é necessário se os dados forem um buffer (por exemplo, de page.renderBuffer).

  • Write (data)- Envia dados para o corpo da resposta. Pode ser chamado várias vezes.

  • WriteHead (statusCode, headers)- Envia um cabeçalho de resposta ao pedido. O código de status é um código de status HTTP de 3 dígitos (por exemplo, 404). Os últimos argumentos e cabeçalhos são os cabeçalhos de resposta.

  • Close - Fecha a conexão http.

  • CloseGracefully - É semelhante a close (), mas garante que os cabeçalhos de resposta foram enviados primeiro.

Sintaxe

Sua sintaxe é a seguinte -

var server = require('webserver').create(); 
var listening = server.listen(8080, function (request, response) {}

Exemplo

Vamos dar um exemplo para entender como o listen método funciona.

var page = require('webpage').create(); 
var server = require('webserver').create(); 
var port = 8080; 
var listening = server.listen(8080, function (request, response) { 
   console.log("GOT HTTP REQUEST"); 
   console.log(JSON.stringify(request, null, 4)); 
   
   // we set the headers here 
   response.statusCode = 200; 
   response.headers = {"Cache": "no-cache", "Content-Type": "text/html"};  
 
   // the headers above will now be sent implictly 
   // now we write the body 
   response.write("<html><head><title>Welcone to Phantomjs</title></head>"); 
   response.write("<body><p>Hello World</p></body></html>"); 
   response.close(); 
}); 

if (!listening) { 
   console.log("could not create web server listening on port " + port); 
   phantom.exit(); 
} 

var url = "http://localhost:" + port + "/foo/response.php"; 
console.log("sending request to :" +url); 
page.open(url, function (status) { 
   if (status !== 'success') { 
      console.log('page not opening'); 
   } else { 
      console.log("Getting response from the server:"); 
      console.log(page.content); 
   } 
   
   phantom.exit(); 
});

O programa acima gera o seguinte output.

sending request to :http://localhost:8080/foo/response.php 
GOT HTTP REQUEST { 
   "headers": {
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
      "Accept-Encoding": "gzip, deflate", 
      "Accept-Language": "en-IN,*", 
      "Connection": "Keep-Alive", 
      "Host": "localhost:8080", 
      "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 
         (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1" 
   }, 
   "httpVersion": "1.1", 
   "method": "GET", 
   "url": "/foo/response.php" 
} 
Getting response from the server: 
<html><head><title>Welcone to Phantomjs</title></head><body><p>Hello World</p></body>
</html>

PhantomJS pode ser executado usando a palavra-chave "phantomjs" e o nome do arquivo. Por exemplo, "phantomjs file.js".

Você também pode passar argumentos para "file.js" da seguinte maneira -

phantomjs [options] file.js arg1 arg2 ...

Vamos examinar algumas das opções disponíveis na linha de comando.

S.No Opção e descrição
1

--help or –h

Irá exibir todas as opções de linha de comando. Pára imediatamente e não executa o script aprovado.

2

--version or –v

Imprime a versão do PhantomJS em execução. Isso interromperá a execução do script a ser executado.

3

--debug[true|false]

Imprime avisos e mensagens de depuração. Por padrão, é definido como falso. Você também pode usar [sim | não].

4

--cookies-file = /path/to/cookies.txt

Nome do arquivo para armazenar cookies persistentes.

5

--diskcache=[true|false]

Ativa o cache de disco. Também assume valores [sim | não]

6

--disk-cahe-path

Caminho para o cache de disco.

7

--ignore-sslerrors=[true|false]

Ignore os erros de SSL. Por exemplo - erros de certificado expirado ou autoassinado. O padrão é falso. Também assume valores [sim | não].

8

--loadimages=[true|false]

Carrega todas as imagens embutidas. O valor padrão é verdadeiro. Também leva [sim | não].

9

--local-storagepath=/some/path

Caminho para salvar conteúdo LocalStorage e conteúdo WebSQL.

10

--local-storagequota=number

Tamanho máximo para permitir dados.

11

--local-url-access

Permite o uso de URLs 'file: ///' (o padrão é verdadeiro).

12

--local-to-remote-urlaccess=[true|false]

Permite que o conteúdo local acesse URL remoto. O padrão é falso. Também assume valores [sim | não].

13

--max-disk-cachesize=size

Limita o tamanho do cache de disco (em KB)

14

--offline-storage-path

Especifica o local para armazenamento offline.

15

--offline-storage-quota

Define o tamanho máximo do armazenamento offline em KB.

16

--outputencoding=encoding

Define a codificação usada para a saída do terminal. O padrão é utf-8.

17

--proxy=address:port

Especifica o servidor proxy a ser usado (por exemplo - proxy = 192.168.1.1: 8080)

18

--proxytype=[http|socks5|none]

Especifica o tipo de servidor proxy (o padrão é http)

19

--proxy-auth

Informações de autenticação para o proxy. Por exemplo -

--proxy-auth = nome de usuário: senha

20

--scriptencoding=encoding

Define a codificação usada para o script. O padrão é utf8.

21

--script-language

Define o idioma do script.

O PhantomJS é muito útil para fazer uma captura de tela de uma página da web e convertê-la em PDF. Demos aqui um exemplo simples para demonstrar como funciona.

Exemplo

var page = require('webpage').create();
page.open('http://phantom.org/',function(status){
   page.render('phantom.png');
   phantom.exit();
});

Execute o programa acima e a saída será salva como phantom.png.

Converter páginas da web em PDFs

O PhantomJS também ajuda a converter páginas da web em PDFs com cabeçalho e rodapé adicionados a ele. Dê uma olhada no exemplo a seguir para entender como funciona.

var wpage = require('webpage').create(); 
var url = "https://en.wikipedia.org/wiki/Main_Page"; 
var output = "test.pdf"; 

wpage.paperSize = { 
   width: screen.width+'px', 
   height: '1500px', 
   
   margin: {
      'top':'50px', 
      'left':'50px', 
      'rigtht':'50px' 
   }, 
   orientation:'portrait', 
   header: { 
      height: "1cm", 
      contents: phantom.callback(function(pageNumber, nPages) { 
         return "<h5>Header <b>" + pageNumber + " / " + nPages + "</b></h5>"; 
      }) 
   }, 
   footer: { 
      height: "1cm", 
      contents: phantom.callback(function(pageNumber, nPages) {   
         return "<h5>Footer <b>" + pageNumber + " / " + nPages + "</b></h5>"; 
      }) 
   } 
} 
wpage.open(url, function (status) { 
   if (status !== 'success') { 
      console.log('Page is not opening'); 
      phantom.exit(); 
   } else { 
      wpage.render(output); 
      phantom.exit();     
   } 
});

O programa acima gera o seguinte output.

The above will convert the page into pdf and will be saved in test.pdf

Converter uma tela em uma imagem

Os Phantomjs podem facilmente converter uma tela em uma imagem. Dê uma olhada no exemplo a seguir para entender como funciona.

var page = require('webpage').create(); 
page.content = '<html><body><canvas id="surface" width="400" height="400"></canvas></body></html>'; 

page.evaluate(function() {
   var context,e1; 
   el = document.getElementById('surface'); 
   
   context = el.getContext('2d'); 
   context.font = "30px Comic Sans MS"; 
   context.fillStyle = "red"; 
   context.textAlign = "center"; 
   context.fillText("Welcome to PhantomJS ", 200, 200); 
   
   document.body.style.backgroundColor = 'white'; 
   document.body.style.margin = '0px'; 
}); 
page.render('canvas.png'); 
phantom.exit();

O programa acima gera o seguinte output.

PhantomJS, com a ajuda de seu módulo de APIs de página da web, pode manipular páginas da web e realizar operações como manipulação de DOM, clicar em botões, etc.

Obter imagens de uma página

O programa a seguir mostra como você pode usar o PhantomJS para buscar imagens de uma página.

var wpage = require('webpage').create();
wpage.onConsoleMessage = function(str) {
   console.log(str.length);
}
wpage.open("http://phantomjs.org", function(status) {
   console.log(status);
   var element = wpage.evaluate(function() {
      var imgdata =  document.querySelectorAll('img');
      var imgsrc = [];
      
      if (imgdata) {
         for (var i in imgdata) {
            imgsrc.push(imgdata[0].src);
         }
      }
      return imgsrc;
   });
   console.log(JSON.stringify(element));
});

O programa acima gera o seguinte output.

Success 
["http://phantomjs.org/img/phantomjslogo.png","http://phantomjs.org/img/phantom 
js-logo.png","http://phantomjs.org/img/phantomjslogo.png","http://phantomjs.org 
/img/phantomjs-logo.png"]

É possível incluir JavaScript externo em uma página usando o injectJS webpage method. Existem muitas propriedades e métodos que podem ajudar na automação da página e fazer muitas outras coisas. Você pode consultar o módulo da página da web onde as propriedades e métodos são explicados em detalhes.

Com a ajuda do PhantomJS, podemos monitorar a rede e validar o comportamento e o desempenho de uma determinada página da web. Existem chamadas de retorno no PhantomJS, ou seja,onResourceRequested e onResourceReceived, que ajudam no monitoramento do tráfego de uma determinada página.

Exemplo

O exemplo a seguir mostra como você pode usar o PhantomJS para monitorar o tráfego de uma determinada página.

function createHAR(address, title, startTime, resources) {  
   
   // this function formats the data which is coming from 
      onresourcerequest and onresourcereceived 
   var entries = []; 
   
   resources.forEach(function (resource) { 
      var request = resource.request, startReply = resource.startReply, 
         endReply = resource.endReply;  
      
      if (!request || !startReply || !endReply) { 
         return; 
      }  
      
      // Exclude Data URI from HAR file because 
      // they aren't included in specification 
      if (request.url.match(/(^data:image\/.*)/i)) { 
         return; 
      }  
      entries.push ({ 
         startedDateTime: request.time.toISOString(), 
         time: endReply.time - request.time, 
         
         request: { 
            method: request.method, 
            url: request.url, 
            httpVersion: "HTTP/1.1", 
            cookies: [], headers: request.headers, 
            queryString: [], 
            headersSize: -1, 
            bodySize: -1 
         }, 
         response: { 
            status: endReply.status, 
            statusText: endReply.statusText, 
            httpVersion: "HTTP/1.1", 
            cookies: [], 
            headers: endReply.headers, 
            redirectURL: "", 
            headersSize: -1, 
            bodySize: startReply.bodySize, 
            
            content: { 
               size: startReply.bodySize, 
               mimeType: endReply.contentType 
            } 
         }, 
         cache: {}, 
         timings: { 
            blocked: 0, 
            dns: -1, 
            connect: -1, 
            send: 0, 
            wait: startReply.time - request.time, 
            receive: endReply.time - startReply.time, 
            ssl: -1 
         }, 
         pageref: address 
      }); 
   });  
   return { 
      log: { 
         version: '1.2', creator: { 
            name: "PhantomJS", 
            version: phantom.version.major + '.' + phantom.version.minor + 
               '.' + phantom.version.patch 
         }, 
         pages: [{ 
            startedDateTime: startTime.toISOString(), 
            id: address, 
            title: title, 
            
            pageTimings: { 
               onLoad: page.endTime - page.startTime 
            } 
         }], 
         entries: entries 
      } 
   }; 
}  
var page = require('webpage').create(), system = require('system'); 
var fs = require('fs');   

if (system.args.length === 1) { 
   console.log('Usage: netsniff.js <some URL>'); 
   phantom.exit(1); 
} else { 
   page.address = system.args[1]; 
   page.resources = []; 
   
   page.onLoadStarted = function () {  // called when page is loaded 
      page.startTime = new Date(); 
   };  
   page.onResourceRequested = function (req) {  
      // called when any files are requested from given page url 
      page.resources[req.id] = { 
         request: req, 
         startReply: null, 
         endReply: null 
      }; 
   };  
   page.onResourceReceived = function (res) {  
      //called when any files are received. 
      if (res.stage === 'start') { 
         page.resources[res.id].startReply = res; 
      } 
      if (res.stage === 'end') { 
         page.resources[res.id].endReply = res; 
      } 
   };  
   page.open(page.address, function (status) {  // open given page url 
      var har; 
      
      if (status !== 'success') { 
         console.log('FAIL to load the address'); 
         phantom.exit(1); 
      } else { 
         page.endTime = new Date(); 
         
         page.title = page.evaluate(function () { // gets the page title 
            return document.title; 
         });             
         har = createHAR(page.address, page.title, page.startTime, page.resources);  
         
         // calls the function createHAR with page url, starttime, and page resources. 
         // console.log(JSON.stringify(har, undefined, 4)); 
         fs.write('log.txt', JSON.stringify(har, undefined, 4), 'w');  
         
         // logs are collected in log.txt file. 
         phantom.exit(); 
      } 
   }); 
}

Exemplo de log.txt fornecido para visualização do HAR

{ 
   "log": { 
      "version": "1.2", 
      "creator": { 
         "name": "PhantomJS", 
         "version": "2.1.1" 
      }, 
      "pages": [ 
         { 
            "startedDateTime": "2017-05-21T13:41:21.824Z", 
            "id": "http://www.sample.com", 
            "title": "Free Sample Products – Sample.com ≫ Free Samples, 
               Free Product Samples, Product Test Marketing", 
            "pageTimings": { 
               "onLoad": 11081 
            } 
         } 
      ], 
      "entries": [ 
         { 
            "startedDateTime": "2017-05-21T13:41:21.815Z", 
            "time": 1999, 
            
            "request": { 
               "method": "GET", 
               "url": "http://www.sample.com/", 
               "httpVersion": "HTTP/1.1", 
               "cookies": [], 
               
               "headers": [ 
                  { 
                     "name": "Accept", 
                     "value": "text/html,application/xhtml+xml,
                        application/xml;q = 0.9,*/*;q = 0.8" 
                  }, 
                  
                  { 
                     "name": "User-Agent", 
                     "value": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 
                        (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"  
                  } 
               ], 
               
               "queryString": [], 
               "headersSize": -1, 
               "bodySize": -1 
            }, 
            "response": { 
               "status": 301, 
               "statusText": "Moved Permanently", 
               "httpVersion": "HTTP/1.1", 
               "cookies": [], 
               
               "headers": [ 
                  { 
                     "name": "Date", 
                     "value": "Sun, 21 May 2017 13:41:25 GMT" 
                  }, 
                  
                  { 
                     "name": "Server", 
                     "value": "Apache/2.2.14 (Ubuntu)" 
                  }, 
                  
                  { 
                     "name": "Location", 
                     "value": "http://sample.com//" 
                  }, 
                  
                  { 
                     "name": "Vary", 
                     "value": "Accept-Encoding" 
                  }, 
                  
                  { 
                     "name": "Content-Encoding", 
                     "value": "gzip" 
                  }, 
                  
                  { 
                     "name": "Keep-Alive", 
                     "value": "timeout = 15, max = 100" 
                  },
                  
                  { 
                     "name": "Connection", 
                     "value": "Keep-Alive" 
                  }, 
                  
                  { 
                     "name": "Content-Type", 
                     "value": "text/html; charset = iso-8859-1" 
                  } 
               ],  
               "redirectURL": "", 
               "headersSize": -1, 
               "bodySize": 307, 
               
               "content": { 
                  "size": 307, 
                  "mimeType": "text/html; charset = iso-8859-1" 
               } 
            }, 
            
            "cache": {}, 
            "timings": { 
               "blocked": 0, 
               "dns": -1, 
               "connect": -1, 
               "send": 0, 
               "wait": 1999, 
               "receive": 0, 
               "ssl": -1 
            }, 
            "pageref": "http://www.sample.com" 
         }, 
      ]   
      { 
         "startedDateTime": "2017-05-21T13:41:24.898Z", 
         "time": 885, 
         
         "request": { 
            "method": "GET", 
            "url": "http://sample.com/", 
            "httpVersion": "HTTP/1.1", 
            "cookies": [], 
            
            "headers": [ 
               { 
                  "name": "Accept", 
                  "value": "text/html,application/xhtml+xml,
                     application/xml;q = 0.9,*/*;q = 0.8" 
               }, 
               
               { 
                  "name": "User-Agent", 
                  "value": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 
                     (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1" 
               } 
            ], 
            "queryString": [], 
            "headersSize": -1, 
            "bodySize": -1 
         }, 
         "response": { 
            "status": 200, 
            "statusText": "OK", 
            "httpVersion": "HTTP/1.1", 
            "cookies": [], 
            
            "headers": [ 
               { 
                  "name": "Date", 
                  "value": "Sun, 21 May 2017 13:41:27 GMT" 
               }, 
               
               { 
                  "name": "Server", 
                  "value": "Apache/2.2.14 (Ubuntu)" 
               }, 
               
               { 
                  "name": "X-Powered-By", 
                  "value": "PHP/5.3.2-1ubuntu4.29" 
               }, 
               
               {
                  "name": "X-Pingback", 
                  "value": "http://sample.com/xmlrpc.php" 
               }, 
               
               { 
                  "name": "Link", 
                  "value": "<http://sample.com/wp-json/>; 
                     rel = \"https://api.w.org/\", <http://wp.me/P6Jj5H-4>; 
                     rel = shortlink" 
               }, 
               
               { 
                  "name": "Vary", 
                  "value": "Accept-Encoding"  
               }, 
               
               { 
                  "name": "Content-Encoding",
                  "value": "gzip" 
               },

               { 
                  "name": "Keep-Alive",
                  "value": "timeout = 15, max = 99"
               },

               {
                  "name": "Connection",
                  "value": "Keep-Alive"
               },

               { 
                  "name": "Content-Type",
                  "value": "text/html; charset = UTF-8"
               }
            ],

            "redirectURL": "",
            "headersSize": -1,
            "bodySize": 1969,

            "content": {
               "size": 1969,
               "mimeType": "text/html; charset = UTF-8"
            }
         },

         "cache": {},
         "timings": {
            "blocked": 0,
            "dns": -1,
            "connect": -1,
            "send": 0,
            "wait": 869,
            "receive": 16,
            "ssl": -1
         },

         "pageref": http://www.sample.com
      },

      {
         "startedDateTime": "2017-05-21T13:41:25.767Z",
         "time": 388,

         "request": {
            "method": "GET",
            "url": "http://sample.com/wpcontent/themes/samplecom/style.css",
            "httpVersion": "HTTP/1.1",
            "cookies": [],

            "headers": [
               {
                  "name": "Accept",
                  "value": "text/css,*/*;q = 0.1"
               },

               {
                  "name": "Referer",
                  "value": "http://sample.com/"
               },

               {
                  "name": "User-Agent",
                  "value": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 
                     (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"
               }
            ],

            "queryString": [],
            "headersSize": -1,
            "bodySize": -1
         },

         "response": {
            "status": 200,
            "statusText": "OK",
            "httpVersion": "HTTP/1.1",
            "cookies": [],

            "headers": [
               {
                  "name": "Date",
                  "value": "Sun, 21 May 2017 13:41:27 GMT"
               },

               {
                  "name": "Server",
                  "value": "Apache/2.2.14 (Ubuntu)"
               },

               {
                  "name": "Last-Modified",
                  "value": "Fri, 22 Apr 2011 00:32:22 GMT"
               },

               {
                  "name": "ETag",
                  "value": "\"e1d7-1836-4a176fdbbd180\""
               },

               {
                  "name": "Accept-Ranges",
                  "value": "bytes"
               },

               {
                  "name": "Vary",
                  "value": "Accept-Encoding"
               },

               {
                  "name": "Content-Encoding",
                  "value": "gzip"
               },

               {
                  "name": "Keep-Alive",
                  "value": "timeout = 15, max = 98"
               },

               {
                  "name": "Connection",
                  "value": "Keep-Alive"
               },

               {
                  "name": "Content-Type",
                  "value": "text/css"
               }
            ],

            "redirectURL": "",
            "headersSize": -1,
            "bodySize": 3174,
            
            "content": {
               "size": 3174,
               "mimeType": "text/css"
            }
         },

         "cache": {},
         "timings": {
            "blocked": 0,
            "dns": -1,
            "connect": -1,
            "send": 0,
            "wait": 388,
            "receive": 0,
            "ssl": -1
         },
         
         "pageref": "http://www.sample.com"
      }
   }
}

Resultado

O programa acima gera a seguinte saída.

Todos os logs são coletados em um .txt file e mais tarde, o mesmo é convertido como acima usando a visualização HAR, por exemplo, (http://www.softwareishard.com/har/viewer/)

PhantomJStem muita API para uma página da web, que dá todos os detalhes. O PhantomJS pode ser usado para testes, como obter o conteúdo de uma página, compartilhar tela, converter a página em PDF, etc. Existem muitas bibliotecas de teste populares no mercado, que podem ser usadas junto com o PhantomJS e podem ser usadas para teste .

Algumas das estruturas populares que podem funcionar com o PhantomJS são as seguintes -

  • Mocha
  • Jasmine
  • Qunit
  • Hiro
  • Laika
  • Buster.JS
  • WebDriver

Exemplo - PhantomJS com Qunit

(function () {     
   var url, timeout,args = require('system').args, page = require('webpage').create(); 
   url = args[1]; 
   timeout = parseInt(10, 10); 
   
   page.onConsoleMessage = function (msg) {  
      //prints all the console messages 
      console.log(msg); 
   }; 
   page.onInitialized = function () {  // called when page is initialized 
      page.evaluate(callqunit); 
   }; 
   page.onCallback = function (message) { // called from  
      var result, failed; 
      
      if (message) {  
         if (message.name === 'QUnit.done') { 
            result = message.data; 
            failed = !result || !result.total || result.failed;  
            
            if (!result.total) { 
               console.error('No tests were executed'); 
            } 
            pageexit(failed ? 1 : 0); 
         } 
      } 
   };  
   page.open(url, function (status) { // opening page  
      if (status !== 'success') { 
         console.error('Unable to access network: ' + status); 
         pageexit(1); 

      } else { 
         var checkqunit = page.evaluate(function () { 
            //evaluating page and chcking if qunit object 
               is present on the given page url 
            return (typeof QUnit === 'undefined' || !QUnit); 
         }); 
         
         if (checkqunit) { 
            console.error('Qunit scripts are not present on the page'); 
            pageexit(1); 
         }             
         
         //timeout of 10seconds is used otherwise message from console will get printed. 
         setTimeout(function () { 
            console.error('The specified timeout of ' + timeout + ' seconds has expired. 
               Aborting...'); 
            pageexit(1); 
         }, timeout * 1000);           
      } 
   });  
   function callqunit() {

qunit.html

<!DOCTYPE html> 
<html> 

   <head> 
      <meta charset = "utf-8"> 
      <meta name = "viewport" content = "width = device-width"> 
      <title>QUnit Example</title> 
      <link rel = "stylesheet" href = "https://code.jquery.com/qunit/qunit-2.3.2.css"> 
   </head> 

   <body> 
      <div id = "qunit"></div> 
      <div id = "qunit-fixture"></div> 
      <script src = "https://code.jquery.com/qunit/qunit-2.3.2.js"></script> 
   </body> 
   
</html>

Resultado

Command - phantomjs qunit.js http: //localhost/tasks/qunit.html

O programa acima gera a seguinte saída.

{"passed":3,"failed":2,"total":5,"runtime":23}
Time taken is 23ms to run 5 tests.
3 passed, 2 failed.

REPL apoia Read Eval Print Loop. No PhantomJS, REPL é um modo interativo para testar o código JavaScript. Você pode fazer a mesma coisa, que é feita no Google Chrome Inspector ou Firebug para executar algum trecho de código diretamente no console. REPL retorna a mesma plataforma para executar os scripts.

O comando digitado é enviado ao intérprete para interpretação imediata (EVAL) e para fornecer feedback (PRINT). EntrarPhantomJS na linha de comando e isso o levará para o modo interativo, onde você pode executar seu código diretamente.

Sintaxe

Sua sintaxe é a seguinte -

Phantomjs

Exemplo

O exemplo a seguir demonstra como o REPL funciona no PhantomJS.

phantomjs> console.log("Welcome to phantomjs");
Welcome to phantomjs
Undefined

phantomjs> window.navigator {
   "appCodeName": "Mozilla",
   "appName": "Netscape",
   "appVersion": "5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 (KHTML, like Gecko)
      PhantomJS/2.1.1 Safari/538.1",
   "cookieEnabled": true,
   "language": "en-IN",

   "mimeTypes": {
      "length": 0
   },
   "onLine": false,
   "platform": "Win32",

   "plugins": {
      "length": 0
   },
   "product": "Gecko
   "productSub": "20030107",
   "userAgent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 (KHTML, like Gecko)
      PhantomJS/2.1.1 Safari/538.1",
   "vendor": "Apple Computer, Inc.",
   "vendorSub": ""
}

phantomjs>
To find the version
phantomjs> phantom.version {
   "major": 2,
   "minor": 1,
   "patch": 1
}
phantomjs>

Cada comando é executado e o resultado é exibido. Use CTRL + C, CTRL + D ouphantom.exit() para sair do modo interativo.

Use o up/down teclas de seta para ouvir os comandos digitados anteriormente.

Existe outro recurso chamado autocompletion, o que ajuda a lembrar o comando. Basta digitar "fantasma" e clicar no botão "Tab" para obter uma lista de comandos disponíveis que você pode executar.

Resultado

O programa acima gera a seguinte saída.

phantomjs> phantom.→| 
phantomjs> phantom.cookies→| 
phantomjs> phantom.exit→| 
phantomjs> phantom.version→|

Neste capítulo, fornecemos mais alguns exemplos práticos para entender alguns recursos importantes do PhantomJS.

Exemplo 1 - Encontre a Velocidade da Página

Neste exemplo, usaremos PhantomJS para encontrar o page speed para qualquer URL de página fornecido.

var page = require('webpage').create(), 
   system = require('system'), 
   t, address;  

if (system.args.length === 1) { 
   console.log('Usage: loadspeed.js <some URL>'); 
   phantom.exit(1); 
} else { 
   t = Date.now(); 
   address = system.args[1]; 
   
   page.open(address, function (status) { 
      if (status !== 'success') { 
         console.log('FAIL to load the address'); 
      } else { 
         t = Date.now() - t; 
         
         console.log('Page title is ' + page.evaluate(function () { 
            return document.title; 
         })); 
         console.log('Loading time ' + t + ' msec'); 
      } 
      phantom.exit(); 
   }); 
}

O programa acima gera o seguinte output.

Command - phantomjs pagespeed.js http://www.google.com

Page title is Google 
Loading time 1396 msec

Exemplo 2 - Enviar um evento de clique para uma página

No exemplo a seguir, usaremos PhantomJS para enviar um click event para uma página.

var page = require('webpage').create(); 
page.onConsoleMessage = function(str) { 
   console.log(str); 
} 
page.open('http://phantomjs.org/api/phantom/', function(status) { 
   page.render('beforeclick.png'); 
   console.log(page.url); 
   
   var element = page.evaluate(function() {   
      return document.querySelector('img[src = "http://phantomjs.org/img/phantomjslogo.png"]'); 
   }); 
   page.sendEvent('click', element.offsetLeft, element.offsetTop, 'left'); 
   
   window.setTimeout(function () { 
      console.log(page.url); 
      page.render('afterclick.png'); 
      phantom.exit(); 
   }, 5000); 
   console.log('element is ' + element); 
});

O programa acima gera o seguinte output.

http://phantomjs.org/api/phantom/ 
element is [object Object] 
http://phantomjs.org/

Nosso programa criará os dois seguintes png imagens no binpasta. Essas duas imagens mostram a diferença antes e depois da execução do programa acima.

Exemplo 3 - enviar um formulário

O exemplo a seguir mostra como enviar um formulário usando o PhantomJS.

var wpage = require('webpage').create();  
wpage.open("http://localhost/tasks/submitform.html", function(status) { 
   console.log(status); 
   wpage.uploadFile('input[name = fileToUpload]', 'output.png'); 
   wpage.render("sform.png");  
   
   var element = wpage.evaluate(function() {   
      return document.querySelector('input[type = "submit"]');   
      // getting details of submit button using queryselector. 
   }); 
   wpage.sendEvent('click', element.offsetLeft, element.offsetTop, 'left');  
   
   // sendevent is used to send click event and also giving the left and top 
      position of the submit button. 
   
   window.setTimeout(function () { 
      console.log(wpage.url); 
      wpage.render("submit.png");  // screenshot is saved in submit.png 
      phantom.exit(); 
   }, 5000);  
   console.log('element is ' + element);  
});

submitform.html

O código a seguir mostra como usar o submitform.html Arquivo.

<html> 
   <head>
      <title>Window 2</title>
   </head> 

   <body>
      <form action = "submitform.php" method = "post" enctype = "multipart/form-data" 
         id = "form1">  
         <input type = "file" name = "fileToUpload" id = "fileToUpload"> 
         <input type = "submit" value = "Upload Image" name = "submit"> 
      </form> 
   </body>  
   
</html>

Depois que o formulário é enviado, ele vai para submitform.php.

submitform.php

submitform.php está apenas imprimindo os detalhes dos arquivos.

<?php 
   print_r($_FILES); 
?>

O programa acima gera o seguinte output.

Success 
element is [object Object] 
http://localhost/tasks/submitform.php

Imagens

A seguir estão as imagens para file upload e form submit.