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