ATENÇÃO NOVOS USUÁRIOS

Se registrou recentemente? Seu cadastro será avaliado e mendiante aprovação, a conta será ativada e você poderá usufruir do fórum. O tempo de avaliação gira em torno de 24 a 48 horas.

Esqueceu sua senha?

Você pode usar o mecanismo de lembrete neste link: Recuperar senha

Você receberá um link de reativação no email cadastrado.

Não recebeu o email? Lembre-se checar o Lixo Eletrônico.

SELENIUM – COMO ESPERAR ATÉ UM ELEMENTO ESTAR PRESENTE NA PÁGINA

A Web está aí, não há como negar. Ela é onipresente em praticamente toda operação eletrônica realizada nos dias de hoje. Como não podia ser diferente, o Excel, ferramenta máxima para analistas e profissionais das mais diversas áreas do mercado precisa estar alinhado com esta necesssidade. E ele está! Neste forum, o debate é focado em expor dúvidas, sugestões, modelos de código e exemplos de uso do Excel na Integração com tecnologias Web.
Avatar do usuário
webmaster
Administrador
Mensagens: 2816
Registrado em: Sex Jul 24, 2009 2:44 pm
Contato:

SELENIUM – COMO ESPERAR ATÉ UM ELEMENTO ESTAR PRESENTE NA PÁGINA

Mensagem por webmaster » Sex Mar 27, 2020 11:48 pm

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:
iselementpresent.png
iselementpresent.png (12.09 KiB) Exibido 10269 vezes
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:

Código: Selecionar todos

<!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:

Código: Selecionar todos

'@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


Tomás
https://www.tomasvasquez.com.br/blog
https://www.tomasvasquez.com.br/cursocsharp
https://twitter.com/tomamais
Se sua dúvida foi solucionada, acrescente [RESOLVIDO] ao título.

Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder