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