Este post foi originalmente publicado em http://officevbavsto.blogspot.com/2011/03/vba-internet-acessando-sites-da-web_12.html

Neste artigo, eu concluo a série como interagir com sites usando VBA e Internet Explorer. Hoje, escrevo sobre execução de scripts JavaScript, rotina de tratamento para carregamento de página e outras dicas.

Executando Scripts JavaScript

Sub AcessaPagina()

   Dim ie As InternetExplorer
   Set ie = New InternetExplorer
 
   ie.Navigate "http://www.google.com.br"
   ie.Visible = True
 
   ie.Document.parentwindow.execscript ("alert('Hellow World')")

End Sub
  • A propriedade parentWindow obtêm uma referência ao objeto container da janela [1]. Podemos dizer que a propriedade parentWindow retorna uma referência à janela (objeto Window) que contém o objeto Document [3]. Essa propriedade é suportada apenas no Internet Explorer [2].
  • Obtemos a propriedade parentWindow para podermos invocar o método responsável pela execução de Scripts - execScript [6].
  • O método execScript executa o script [4].

Este método pode ser útil se você quer usar um script escrito em outra linguagem de script além de JavaScript [5]. Este método suporta linguagens de script tais como JavaScript, JScript, VBS e VBScript [5].

Abaixo, segue um exemplo de uso deste método com VBScript:

ie.Document.parentwindow.execScript "msgbox("""")", "VBScript"

Linguagens de script diferentes de JavaScript devem ser especificadas no segunda parâmetro do método execScript, como no exemplo acima.

Por que executar javascript? Suponha que você tem um site onde exista uma validação de dados. Você pode submeter os dados do formulário diretamente, ao invés de clicar no botão "Gravar". Assim você consegue "furar" a validação de dados existente no site, por exemplo.

ie.Document.parentwindow.execScript ("metodo_gravar()")

No código abaixo, desabilitamos a caixa de texto de pesquisa na página do Google, e mudamos o texto do botão “Pesquisar” para “É nois”.

Sub AcessaPagina()

   Dim ie As InternetExplorer
   Set ie = New InternetExplorer
   
   ie.Navigate "http://www.google.com.br"
   ie.Visible = True
   
   'Disabilita a caixa de texto de pesquisa
   ie.Document.parentwindow.execScript ("document.forms[0].q.disabled=true")
   
   'Muda o texto do botão de "Pesquisa Google"
   ie.Document.parentwindow.execScript _

("document.getElementById('gbqfsa').innerText='É nois'")

End Sub

Nota: Todos esses comandos de mudar as características da página tem efeito apenas no seu navegador. Eles não afetam o servidor da página. Se você atualizar a página (F5) verá que as mudanças feitas através do método execScript desaparecerão.

Carregamento de páginas

Abaixo alguns códigos para tratar o carregamento de página:

Código 1:

Sub AcessaPagina()
   Dim ie As InternetExplorer
   Set ie = New InternetExplorer
   
   ie.Navigate "http://www.google.com.br"
   ie.Visible = True
   
   Do While ie.Busy
   Loop
End Sub

Busy: é uma propriedade que retorna um valor Booleano (True ou False) que indica se o objeto (no nosso caso o Internet Explorer) está ocupado em uma operação de navegação (carregando uma página) ou Download [7].

Código 2:

Sub AcessaPagina()
   Dim ie As InternetExplorer
   Set ie = New InternetExplorer
   
   ie.Navigate "http://www.google.com.br"
   ie.Visible = True
   
   Do Until ie.Document.readyState = "complete"
   Loop
End Sub
  • A propriedade readyState retorna o status do documento (objeto Document) atual [8].

Os possíveis valores de retorno da propriedade readyState são [9]:

  • “uninitialized”: O documento não foi inicializado ainda;
  • “loading”: O documento está carregando;
  • “loaded”: O documento terminou de carregar;
  • “interactive”: O usuário pode interagir com o documento mesmo que não esteja totalmente carregado;
  • “complete”: O documento está totalmente carregado.

Código 3:

Sub AcessaPagina()
   Dim ie As InternetExplorer
   Set ie = New InternetExplorer
   
   ie.Navigate "http://www.google.com.br"
   ie.Visible = True
   
   Do Until ie.readyState = READYSTATE_COMPLETE
   Loop
End Sub

Semelhante ao Código 2, mas aqui estamos usando valores enumerados do enumerador “tagREADYSTATE”.

Qual a diferença entre ie.Busy e ie.document.readyState?

Em alguns momentos o objeto InternetExplorer sinalizará que o Navegador não está mais ocupado (ie.Busy retorna False), mas pode acontecer de uma parte do documento ou de um frame não estar totalmente carregado. Para estes casos, o melhor é utilizar o Código 2 e 3 mencionados acima.

Mudando a Barra de Status

Sub AcessaPagina()
   Dim ie As InternetExplorer
   Set ie = New InternetExplorer
   
   ie.Navigate "http://www.google.com.br"
   ie.Visible = True
   
   ie.StatusBar = "Mudei a barra de status!"
End Sub

A propriedade StatusBar retorna o objeto StatusBar [11].

Fechando o navegador

Sub AcessaPagina()
   Dim ie As InternetExplorer
   Set ie = New InternetExplorer
   
   ie.Navigate "http://www.google.com.br"
   ie.Visible = True
   
   ie.Quit
   Set ie = Nothing
End Sub

O método Quit fecha o objeto [12] (no exemplo em questão, o objeto é o navegador do Internet Explorer).

Créditos

Photo by Markus Spiske from Pexels

Referência Bibliográfica