Utilizando Selenium em aplicações Unity - Tutorial 1

blog-image

Hoje falaremos um pouco sobre como utilizar a API de teste automatizado, selenium, para criação de um WebScrapper usando a Unity e descreveremos alguns comandos básicos que podem ser usados para achar elementos de uma página Web.

O que será necessário?

  • DLLs da Selenium C# na pasta Plugins da Unity.
  • ChromeDriver para executar os testes automatizados.

Configurações básicas de Projeto

A API do selenium usa chamadas do System.Reflection.Emit por este motivo precisamos:

  • Ativar o Net Framework 4.x no player settings.
  • Usar compilação Mono.

Conceitos básicos do Selenium

Selenium permite que você clique de forma automatizada, utilizando o driver de um browser, em componentes presentes em um IFRAME.

Vamos aos comandos básicos:

  • Precisamos o Path do chromeDriver.exe, para isso vamos manter o padrão definido a seguir - no editor o chromeDriver estará na pasta Plugins/Selenium e na build estará na mesma pasta do exe do executável. Definindo isso podemos usar o código:

public static string GetSeleniumPath()
{
#if UNITY_EDITOR
    return Application.dataPath + "\\Plugins\\Selenium";
#else
    return System.IO.Directory.GetParent(Application.dataPath).FullName;
#endif
}

  • Instancie um Driver utilizando:

var options = new ChromeOptions();
var driverPath = GetSeleniumPath();
using(var driver = new ChromeDriver(driverPath, options)) 
{
    //Toda a lógica de programação deve estar aqui dentro
}

  • Passe a URL para abrir a página do chrome que deseja fazer o web scrapper

//Faça o driver navegar para a URL que você deseja
driver.Navigate().GoToUrl(url);

  • Descubra o elemento que você deseja interagir. Nos exemplos abaixo recupero elementos pelo texto e pelo nome da classe e o elemento Pai de um elemento que já obtemos

var acharElementoPorTexto = driver.FindElement(By.XPath("//*[text()='TEXTO DO ELEMENTO']"));
var acharElementoPorClasse = driver.FindElement(By.XPath(".//*[contains(@class,'NOME DA CLASSE')]"));
var elementoPai = acharElementoPorTexto.FindElement(By.XPath(".."));

Procurando elementos básicos

Vamos usar o exemplo do BBB para tentar criar uma sequencia de iterações para clicar no botão de votação do BBB.

  • Abra e chrome em uma aba anônima e clique com o botão direito do mouse->inspecionar para selecionar o elemento que você gostaria de saber mais informações.

Neste exemplo acima podemos tentar obter o botão do Felipe utilizando:

//Acha o Texto 'Felipe'
var textoFelipe = driver.FindElement(By.XPath("//*[text()='Felipe']"));
//Recupera o elemento PAI ao elemento texto, no caso, o botão
var botãoFelipe = textoFelipe.FindElement(By.XPath("..")); 
//Clica no botão
botãoFelipe.Click(); 

Descobrindo elementos dentro de um IFRAME

  • Como dito acima, o selenium só acha elementos DENTRO DO IFRAME atual. Um IFRAME é uma página dentro de outra página e para recuperarmos elementos dentro dele precisamos adentra-lo.

//Recupera o elemento que se refere ao iframe que gostariamos de "adentrar"
var iframe = driver.FindElement(By.XPath("//iframe[contains(@src,'PÁGINA DE SOURCE')]")));
//Muda o driver para o iframe selecionado
driver.SwitchTo().Frame(iframe);
//Volta o driver para a Main Page
driver.SwitchTo().DefaultContent();

Estudo - Bot simples de votação

O bot abaixo foi criado com propósito de estudo do Selenium a fim de exemplificar comandos para se fazer um WebScrapper.

Download: Versão 0.3.

O Bot utiliza de 2 scripts:

  • BotFrame.cs - UI simples da unity que chama o Selenium quando o Botão Iniciar é clicado
  • SeleniumBot.cs - Código que usa o Selenium para executar a série de operações necessárias para votar na enquete do BBB do dia 31/03/2020

-> Qual a sequência de ações:

  • Instancie o Driver.
  • Passe a URL da página de votação
  • Ache o botão do participante que deseja votar e clique nele.
  • A globoplay pedirá o login, então tente achar o iframe de login que abrir e adentre nele, se o iframe for encontrado, recupere o campo de Login Senha e o botão de submeter e preencha estes campos.Para preencher um field usando selenium utilize o comando
  • Ache o captcha e clique nele.
  • Em caso de erro o captcha será recalculado, por isso podemos clicar novamente nele até acertar (probabilidade 20% de sucesso).
  • Tente achar o botão “Votar Novamente” e clique nele
  • Repita

PS: Caso queira compilar para um Standalone em Windows, copie o chromeDriver.exe presente na pasta Plugins/Selenium para o root de onde você está compilando

Bons estudos!

comments powered by Disqus