Arquivo da categoria: VBA

Dicas, modelos, exemplos da ferramenta que faz a grande diferença a suíte Microsoft Office

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

VBA – ComboBox com duas colunas (ou mais do que isso)

Oh yeah! O ComboBox é muito mais versátil do que se pensa e neste vídeo, tento mostrar um pouco disso.

#VBA
#ComboBox

Código utilizado:

Private Sub CommandButton1_Click()
'MsgBox ComboBox1.List(ComboBox1.ListIndex, 1)
MsgBox ComboBox1.Value
End Sub
 
Private Sub UserForm_Initialize()
Dim Estados(1 To 5, 1 To 2) As String
 
'       L  C
Estados(1, 1) = "AC"
Estados(2, 1) = "BA"
Estados(3, 1) = "RJ"
Estados(4, 1) = "SP"
Estados(5, 1) = "SC"
 
'       L  C
Estados(1, 2) = "Acre"
Estados(2, 2) = "Bahia"
Estados(3, 2) = "Rio de Janeiro"
Estados(4, 2) = "São Paulo"
Estados(5, 2) = "Santa Catarina"
 
ComboBox1.List = Estados
End Sub

Acesse também

BLOG ► https://www.tomasvasquez.com.br/blog/
FÓRUM ► https://www.tomasvasquez.com.br/forum/
CURSO ONLINE DE C# ► https://www.tomasvasquez.com.br/cursocsharp

Aqui também!

FACEBOOK ► https://www.facebook.com/tomasvaquezsites
TWITTER ► https://twitter.com/tomamais
GOOGLE+ ► https://plus.google.com/+TomasvasquezBr/

Roteiro, apresentação, edição, etc, etc ► eu mesmo 🙂

VBA – Transferir dados do Excel para o Word

Mais uma inspirada no fórum. Com vocês, Excel e Word trabalhando juntos! Algo assim…

#VBA
#Excel
#Word

O código utilizado:

Function EscreverNoWord()
    Dim objWord 'o aplicativo Microsoft Word
    Dim objDoc 'o documento do word em si (doc ou docx)
    Dim objSelection 'o cursor de operações
    Dim text As String
 
    Set objWord = CreateObject("Word.Application") ' coloca o word na memória
    Set objDoc = objWord.Documents.Add ' Word, crie um novo documento em branco
 
    objWord.Visible = True ' Word, mostre sua cara
 
    Set objSelection = objWord.Selection 'me dê a referência do cursor do mouse
 
    For Each cell In Range("A1:A6")
        text = text &amp; cell.Value &amp; Chr(13)
    Next cell
 
    objSelection.TypeText (text) 'Digitar texto
End Function

Acesse também

BLOG ► https://www.tomasvasquez.com.br/blog/
FÓRUM ► https://www.tomasvasquez.com.br/forum/
CURSO ONLINE DE C# ► https://www.tomasvasquez.com.br/cursocsharp

Aqui também!

FACEBOOK ► https://www.facebook.com/tomasvaquezsites
TWITTER ► https://twitter.com/tomamais
GOOGLE+ ► https://plus.google.com/+TomasvasquezBr/

Roteiro, apresentação, edição, etc, etc ► eu mesmo 🙂