Arquivo da categoria: Selenium

Selenium – O que é Selenium Basic/VBA

Selenium é uma biblioteca poderosa e versátil de código aberto que oferece um conjunto abrangente de ferramentas para automação de navegadores web. Embora seja comumente usado para testes web, ele também ganhou grande popularidade no campo de web scraping. Aqui estão algumas razões pelas quais o Selenium é considerado uma excelente opção para web scraping:

  1. Manipulação de Conteúdo Dinâmico: Muitos sites modernos dependem fortemente de conteúdo dinâmico que é carregado ou gerado por meio de JavaScript. Técnicas tradicionais de scraping, como análise de HTML com bibliotecas como BeautifulSoup, podem não ser capazes de lidar com esse conteúdo dinâmico. O Selenium, por outro lado, é excelente em lidar com conteúdo dinâmico. Ele pode interagir com a página da web em tempo real, executar código JavaScript e recuperar o conteúdo totalmente renderizado, permitindo que você extraia dados de sites que dependem fortemente de JavaScript.
  2. Automação de Navegadores: O Selenium permite que você automatize navegadores web, replicando interações semelhantes às de um ser humano com as páginas da web. Isso significa que você pode navegar por várias páginas, clicar em botões, preencher formulários, enviar dados e realizar várias outras ações programaticamente. Ao simular interações humanas, o Selenium permite que você acesse dados que podem estar ocultos por trás de telas de login, interaja com funcionalidades baseadas em AJAX ou percorra conteúdo paginado. Esse nível de automação torna o Selenium uma ferramenta poderosa para fazer scraping de sites complexos.
  3. Suporte a Vários Navegadores: O Selenium oferece suporte a vários navegadores da web, como Chrome, Firefox, Safari e Internet Explorer, entre outros. Esse suporte a vários navegadores permite que você escolha o navegador que melhor se adapte às suas necessidades de scraping ou replique o comportamento do seu público-alvo. Você pode escrever seu código de scraping uma vez e alternar facilmente entre diferentes navegadores, garantindo compatibilidade e flexibilidade.
  4. Seleção Robusta de Elementos: O Selenium fornece uma ampla variedade de métodos para localizar elementos em uma página da web, incluindo por ID, classe, XPath, seletores CSS e outros. Essa flexibilidade permite que você direcione com precisão os elementos que deseja extrair. Além disso, o Selenium oferece métodos avançados de interação com elementos, permitindo que você extraia texto, valores de atributos, execute cliques e manipule várias interações do usuário com facilidade.
  5. Ecossistema e Suporte da Comunidade: O Selenium possui uma comunidade extensa e ativa de desenvolvedores, o que significa que você pode encontrar muitos recursos, tutoriais e discussões para ajudá-lo em seus projetos de web scraping. O extenso ecossistema em torno do Selenium inclui frameworks, wrappers e ferramentas de terceiros que fornecem recursos adicionais e tornam o web scraping mais eficiente.

Embora o Selenium seja uma ferramenta poderosa para web scraping, vale ressaltar que ele pode ser exagerado para tarefas de scraping simples. Se o site que você está visando não depende fortemente de conteúdo dinâmico ou JavaScript, ou se você só precisa extrair dados HTML estáticos, pode ser mais apropriado usar uma biblioteca leve como BeautifulSoup ou Requests. No entanto, quando enfrentar cenários complexos de scraping ou sites dinâmicos, as capacidades do Selenium se destacam, tornando-o uma escolha principal para muitos projetos de web scraping.

Aqui, um exemplo simples de código VBA  usando Selenium Basic.

Sub AutomatizarTarefaWeb()
    Dim driver As New SeleniumWrapper.WebDriver
    Dim elemento As SeleniumWrapper.WebElement
    
    ' Abrir o navegador e navegar para um site
    driver.Start "chrome", "https://www.example.com"
    driver.Get "/"
    
    ' Localizar um campo de entrada pelo seu ID e inserir texto
    Set elemento = driver.FindElementById("campoDeEntrada")
    elemento.SendKeys "Olá, Selenium!"
    
    ' Localizar um botão pelo XPath e clicar nele
    Set elemento = driver.FindElementByXPath("//button[@id='botaoEnviar']")
    elemento.Click
    
    ' Aguardar o carregamento da página
    driver.Wait 5000
    
    ' Extrair o texto de um elemento específico
    Set elemento = driver.FindElementByClassName("textoResultado")
    MsgBox "Resultado: " & elemento.Text
    
    ' Fechar o navegador
    driver.Quit
End Sub

Certifique-se de ter a biblioteca Selenium Basic instalada e referenciada em seu projeto VBA antes de executar este código. Você pode encontrar a biblioteca Selenium Basic e instruções de instalação em sua página oficial no GitHub: https://github.com/florentbr/SeleniumBasic

Selenium – Atualizando o ChromeDriver automaticamente com VBA

A macro abaixo faz a atualização do Selenium ChromeDriver usando apenas o VBA:

Sub DownloadChromeDriver()
    Dim url As String
    Dim fileName As String
    Dim req As Object
    Dim stream As Object
    
    ' Define a URL e nome de arquivo para a última versão do ChromeDriver
    url = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE"
    fileName = "chromedriver.zip"

    ' Faz uma solicitação HTTP para obter o número da última versão do ChromeDriver
    Set req = CreateObject("MSXML2.XMLHTTP")
    req.Open "GET", url, False
    req.Send

    ' Obtém o número da última versão do ChromeDriver a partir da resposta
    Dim latestVersion As String
    latestVersion = req.responseText

    ' Constrói a URL para o binário do ChromeDriver com base no número da versão
    url = "https://chromedriver.storage.googleapis.com/" & latestVersion & "/chromedriver_win32.zip"

    ' Faz uma solicitação HTTP para baixar o binário do ChromeDriver
    req.Open "GET", url, False
    req.Send

    ' Salva o binário baixado no disco
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = 1 ' Binário
    stream.Open
    stream.Write req.responseBody
    stream.SaveToFile fileName, 2 ' Sobrescrever arquivo existente
    stream.Close

    ' Extrai o binário baixado para uma localização conhecida em seu computador
    Dim zipFilePath As Variant
    zipFilePath = ActiveWorkbook.Path & "\" & fileName
    Dim extractPath As Variant
    extractPath = Environ("userprofile") & "\AppData\Local\SeleniumBasic"

    Set objShell = CreateObject("Shell.Application")
    Set objSource = objShell.Namespace(zipFilePath).Items()
    Set objTarget = objShell.Namespace(extractPath)

    objTarget.CopyHere objSource, 16

    MsgBox "Versão do ChromeDriver " & latestVersion & " instalada com sucesso."

End Sub

A explicação de como ela funciona pode ser vista no vídeo abaixo:

SeleniumBasic – Erro de automação

O problema

Imagine a seguinte cena:

Você desenvolve o projeto para seu cliente usando o Selenium VBA como biblioteca, tudo funciona perfeitamente, em todos os navegadores, drivers, etc. Todos os testes passam maravilhosamente.

Então você envia o arquivo junto com todas as instruções de instalação. Mas, quando o cliente executa seu arquivo, o seguinte erro é apresentado:

A solução

Instale o .NET Framework 3.5 no computador. Você pode fazer o download dele aqui:

https://docs.microsoft.com/en-us/dotnet/framework/install/dotnet-35-windows-10

Após instalado, execute o aplicativo novamente.

A explicação

Apesar de rodar no contexto do VBA, que é aplicativo nativo do Windows, o SeleniumBasic é desenvolvido sob o .NET Framework, especificamente a versão 3.5, o que faz sua execução ser dependente dele.

Não adianta ter somente o .NET Framework 2.0 ou 4.0. Eles são independentes e precisam ser instalados separadamente.

Finalmente

Nada mais a declarar. Bom código a todos!

Selenium – Como esperar até um elemento estar presente na página

AVISO: Este artigo é um bonus para a comunidade, já que é parte de um curso que está em desenvolvimento (com algumas adaptações). Fiquem ligados para mais novidades sobre.

Se você faz parte do time que brinca com Selenium a algum tempo, já se deparou com a situação acima. Existem algumas formas de fazê-lo utilizando as próprias funções. Abaixo demonstro a maneira que melhor me serviu para tal propósito.

A Função IsElementPresent

Ela é parte do objeto WebDriver. O uso chega a ser ridiculamente simples. Se o elemento está presente, retorna True, do contrário, False. O problema é que o parâmetro que ele pede é um objeto do tipo By:

Ok, vamos precisar então saber quem é esse carinha.

O Objeto By

Se você teve a chance de olhar o código fonte do SeleniumBasic (e você deveria), verá que o By está em todo lugar. Como o fonte é em C#, seu uso é mais natural, mas em VBA, é um pouco mais chato, mas não impossível.

Nada melhor do que ver funcionando, certo?

Considere os códigos abaixos:

HTML:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>
      Selenium - Como esperar até um elemento estar presente na página
    </title>
    <script>
      function disparaContador() {
        setTimeout(function() {
          var novaDiv = document.createElement("div");
          novaDiv.style.display = "block";
          novaDiv.id = "escondido";
          novaDiv.innerHTML = "<h2>Ta dá!</h2>";
          document.body.appendChild(novaDiv);
        }, 3000);
      }
    </script>
  </head>
  <body>
    <h1>Selenium - Como esperar até um elemento estar presente na página</h1>
    <p>
      O elemento abaixo aparecerá após 3 segundos do botão abaixo ter sido
      clicado
    </p>
    <button id="disparaContador" onclick="disparaContador()">Vai</button>
  </body>
</html>

VBA:

'@Folder("VBAProject")
Dim driver As WebDriver
 
Sub EsperaPorElemento()
    Dim por As New By
 
    Set driver = New IEDriver
    Call driver.SetCapability("ignoreZoomSetting", True)
    driver.Get Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "") & "index.html"
    driver.FindElementById("disparaContador").Click
 
    While driver.IsElementPresent(por.ID("escondido"))
        'espera por um segundo
        'o uso do Application.Wait serve para não congelar a execução do VBA
        Application.Wait Now + TimeValue("00:00:01")
    Wend
    'neste ponto, o elemento já deve estar presente
    MsgBox driver.FindElementById("escondido").Text
End Sub

Em resumo, a página HTML tem um código que cria dinamicamente uma div 3 segundos após clicar no botão. Ou seja, o elemento não está lá quando a página é carregada, o que valida o código.

O código faz uso do IsElementePresent e do By para “esperar” o elemento estar presente na página.

Os mais atentos devem ter percebido que o By vai muito além do ID, tendo as opções de identificar o elemento através do TagName, ClassName, XPath, etc.

Baixe o código e execute.

ALERTA:
Não nomeia a variável do tipo By como by ou By. O VBA se perde todo e fica difícil entender o que está acontecendo. Por isso nomeiei como “por”, que seria uma tradução direta para o português.

Todo o código fonte está disponível aqui:

https://github.com/Tomamais/SeleniumCom … toNaPagina