6
respostas

Acessar arquivo .js através do vba

Estou precisando acessar uma página web por meio do VBA que contem caixas de texto e botões. No entanto esses elementos não aparecem no responsetext, ou seja, não aparece no corpo do html, é como se essas caixas de texto e botões tivessem inseridas na pagina por meio de arquivos javascript.

Exemplo:

<!-- efetuar preload dos ícones -->
<span class="icons" style="opacity: 0; width: 0px; height: 0px;">autorenew</span>
6 respostas

Olá Estudante, tudo bem com você?

Se os elementos que você está tentando acessar estão sendo gerados dinamicamente por meio de JavaScript uma sugestão é você aguardar até que esses elementos estejam totalmente carregados antes de tentar interagir com eles usando VBA.

Exemplo de código:

' Aguarda até que o navegador tenha carregado completamente a página
Do While ie.Busy Or ie.readyState <> 4
    Application.Wait DateAdd("s", 1, Now)
Loop

Este código espera até que a página esteja totalmente carregada antes de tentar acessar os elementos, o que pode resolver o problema de não ver esses elementos no responsetext.

Todavia, caso precise de um web scraping mais robusto, sugiro que utilize a linguagem de programação Python, que possui mais recursos em vista das limitações do VBA, tanto em relação a manutenção quanto a desempenho. Além disso, como é um assunto externo ao curso e que não tenho acesso ao cenário completo do projeto, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema.

Espero ter ajudado. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi. Então não estou usando o objeto Internet Explorer pois foi descontinuado. Estou usando a codificação a seguir:

Set Request = CreateObject("MSXML2.XMLHTTP.6.0")
Set HTMLDoc = CreateObject("htmlfile")

With Request

    .Open "GET", URL
    .Send

    Debug.Print .Status, .StatusText
    Debug.Print .GetAllResponseHeaders

    HTMLDoc.body.innerHTML = .ResponseText

End With

Set Request = Nothing
tot = HTMLDoc.getElementById("navbar-container").Length

Olá Estudante!

Mesmo que você esteja usando a biblioteca MSXML2.XMLHTTP.6.0 para fazer a solicitação HTTP, você ainda pode aguardar o carregamento completo da página antes de interagir com os elementos dinâmicos e o código a seguir cumpre esse propósito:

Do While xmlhttp.readyState <> 4
    Application.Wait DateAdd("s", 1, Now)
Loop

Porém, como eu disse na mensagem anterior, caso precise de um web scraping mais robusto, sugiro que você use ferramentas mais potentes, como Python por exemplo, ou até mesmo o Selenium Type Library dentro do próprio VBA. Veja um pequeno exemplo de um código usando o Selenium Type Library no VBA, que após o carregamento da página, aguarda 5 segundos para capturar algum elemento dinâmico do JavaScript:

Sub CapturaDinamica()
    Dim navegador As New Selenium.ChromeDriver
    
    navegador.Start
    ' Para não abrir o navegador efetivamente
    navegador.AddArgument ("--headless")
    navegador.Get URL
    
    ' Aguardar 5 segundos
    Application.Wait (Now + TimeValue("0:00:05"))
    
    Debug.Print navegador.FindElementById("navbar-container").Attribute("innerText")
End Sub

Porém, como é um assunto externo ao curso e que não conheço seu cenário como um todo, deixarei alguns materiais extras que podem te auxiliar nessa jornada:

Espero ter ajudado. Abraços e bons estudos!

Quando tento abrir o link do google por meio do código a seguir a página não abre fisicamente mas fica escondida. Como faço para que o link seja realmente aberto visível?

Dim el, cont As MSHTML.HTMLDocument
    Dim html As String
    Dim HTMLDoc As Object
    Dim Doc As HTMLDocument

   'Set HTMLDoc = CreateObject("htmlfile")

    Dim Request As Object
    Set Request = CreateObject("winhttp.winhttprequest.5.1")
    url="www.google.com.br"
    Request.Open "GET", url, True
    
    'httpRequest.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    
    Request.Send
html = Request.ResponseBody
    
    Debug.Print html
   
   Set el = New MSHTML.HTMLDocument
 el.body.innerHTML = html
 

Os elementos do Response.Body estão aparecendod esta forma a seguir.

?????????????????????? †???????????? †??????????????????? †????????????????????? †??????????????????????????????????? †????????•?????????•?????????? †??????????????????????????????????•????????????????????•????????????????????????????????????????????††???????????? †??????????????????? †??????????????•???????›????›???????????????????????????????????????????????????????????????????4?????????????????????•??????????????•???????????????4???????????????????•??????????????•????????????????????????????????????????????????????????4?????????????????????????????????????????????????

Olá Estudante!

No código que você mandou, por padrão, ele apenas fará uma solicitação HTTP para obter o conteúdo HTML da página e, em seguida, analisará esse conteúdo HTML em um objeto MSHTML.HTMLDocument para que você possa inspecioná-lo ou manipulá-lo no código VBA.

Se você quiser abrir a página em um navegador, você deve utilizar o Selenium, conforme comentei nas mensagens anteriores e forneci um código funcional e indiquei alguns artigos com o passo a passo de configuração.

Sobre a saída do Debug.Print com vários pontos de interrogação, é o conteúdo bruto do corpo da resposta HTTP, retornada como um array de bytes (Response.ResponseBody). Uma sugestão de correção é tentar decodificar esses bytes:

Dim html As String
Dim bytes() As Byte

bytes = Request.ResponseBody
html = StrConv(bytes, vbUnicode) ' Decodificar bytes como UTF-8

Debug.Print html

Todavia, reforço que como eu não conheço o cenário completo do seu projeto e as tratativas que você tem que fazer, o que posso te ajudar é dando um direcionamento. Por todas as mensagens que trocamos, o que eu te recomendo é seguir a dica de usar o Selenium, a qual é um recurso mais poderoso para extrair dados das páginas e até mesmo deixá-la visível no ato da requisição.

Abraços e bons estudos!