VBA – Interagindo com páginas Web com o Selenium WebDriver

Selenium Logo

Introdução

Tem um tempo que publiquei aqui neste blog um artigo sobre como manipular uma página de internet no navegador através do VBA usando o Internet Explorer (este aqui: https://www.tomasvasquez.com.br/blog/microsoft-office/vba-interagindo-com-o-objeto-internet-explorer).

Foi um exemplo simples, mas como o interesse por extração de informações de páginas cresceu tremendamente, o artigo gerou enorme interesse e as discussões no forum afloraram, principalmente com problemas relacionados ao assunto.

O fato é que, o VBA nunca foi muito amigo de integração com a internet. O único recurso que os programadores VBA tinham em mãos era a integração com o Internet Explorer, onde a navegação era simulada para que os dados pudessem ser extraídos. Porém, a internet evolui em uma velocidade insana e como pudemos acompanhar, o Internet Explorer não seguiu nessa velocidade. Isso é tão verdade que a Microsoft vai descontinuar o navegador para lançar em seu lugar o Edge, que vem junto com o Windows 10. Como se isso já não fosse razão suficiente para procurar alternativas, o IE demonstrava certas limitações na simulação da navegação, algumas páginas já não rodavam e o IE11 quebrava uma série de funções.
Já tinha passado da hora de existir outra opção para o feito de extrair informações de páginas da web.

O que é o Selenium

E é aqui que entra o Selenium. O Selenium nasceu como um plugin de automação de rotinas em um browser. Para um programador VBA, é fácil entender o Selenium como se fosse o VBA do Navegador. Com ele, você pode programar, automatizar e até mesmo gravar algo parecido com macros, onde o Selenium grava todas as interações que você realiza em uma página para poder executar depois, podendo inclusive efetuar alterações no código.

Origem

O Selenium veio primeiramente auxiliar na automação de rotinas no navegador, começando pelo Firefox. Ele é até hoje um plugin ou extensão do navegador Firefox chamada Selenium IDE. Com o passar do tempo, o pessoal de testes tomou gosto pelas funcionalidades do Selenium, já que muitas das tarefas de navegação podiam ser automatizadas e repetidas, reduzindo o esforço e a possibilidade de erros drasticamente. O Selenium ganhava uma identidade no mercado de desenvolvimento de software que foi explorada em seguida pelos desenvolvedores.

A criação do WebDriver

Nos últimos anos, a disciplina de Testes de Software ganhou força. É só procurar por artigos e materiais nas redes e sites especializados. Com isso, os testes automatizados por software vieram logo em seguida. Nem é preciso ir muito longe. As “novas linguagens” já nascem quase preparadas para esse tipo de rotina e as que já estavam no mercado se adaptaram para isso.

O Selenium WebDriver veio para entregar aos programadores uma biblioteca que permite através de programação manipular o navegador para automatizar a navegação. Atualmente, o Selenium WebDriver oferece suporte a linguagens como Ruby, C#, Java, Python, Javascript e…. VBA! E é aqui prezados leitores que mora nosso interesse nesta ferramenta.

Instalando

Sim, é possível manipular o Selenium através de código VBA. Primeiro, é preciso instalar o Selenium-VBA, que é a versão da biblioteca que permite a manipulação o Selenium pelo código no VBA.

O Selenium-VBA é gratuito e vem sendo mantido como código aberto, por isso, vem tendo constantes mudanças e pode em alguns casos sofrer com instabilidades.

Estou usando o Selenium-VBA que pode ser baixado neste link:

https://code.google.com/p/selenium-vba/

A versão exata usada para este artigo foi:

http://dl.bintray.com/florentbr/generic/SeleniumWrapperSetup-1.0.23.0.exe

Ao finalizar a instalação, a última tela pergunta se você quer instalar o plugin do Selenium IDE no navegador Firefox. Isso é opcional, mas como é possível extrair muita informação útil do plugin, recomendo que o instale.

Exemplo no VBA

Como iniciei o artigo mencionando a interação com o Internet Explorer, vou replicar o mesmo exemplo utilizando o Selenium VBA.

Comece abrindo o Excel numa nova planilha, abra o Editor do VBA (Alt+F11) e comece adicionando a Referência à biblioteca “SeleniumWrapper Type Library”.

Referências no VBA

Se essa opção não aparecer, verifique a instalação do Selenium.
Em seguida, adicione um novo módulo no VBA (Menu Inserir->Módulo e adicione o seguinte código)

Public driver As New SeleniumWrapper.WebDriver
 
Public Sub AbreELogaNoForum()
    Dim MyPass As String, MyLogin As String
redo:
    MyLogin = Application.InputBox("Por Favor entre com o Login", "Forum Tomás Vásquez", Default:="login", Type:=2)
    MyPass = Application.InputBox("Por favor entre com a senha", "Forum Tomás Vásquez", Default:="Password", Type:=2)
    If MyLogin = "" Or MyPass = "" Then GoTo redo
    driver.Start "chrome", "http://www.tomasvasquez.com.br/"
    driver.setImplicitWait 5000
 
    driver.Open "/forum/ucp.php?mode=login"
    driver.findElementById("username").SendKeys MyLogin
    driver.findElementById("password").SendKeys MyPass
    driver.findElementByName("login").Click
 
End Sub
 
Public Sub FechaBrowser()
    driver.stop
End Sub

Para este exemplo, escolhi o Chrome, que explicarei depois o motivo. Se tudo der certo, o código vai pedir que você digite o usuário e senha do fórum (válidos). Após isso, o Chrome se abrirá, navegará até a página de login de fórum, entrará com suas credenciais e tentará fazer o login na página.

Ok, isso é pouco. Pois bem, vamos tentar explorar um pouco mais do que o Selenium WebDriver pode fazer por nós. Vou mudar a funcão AbreELogaNoForum para além de logar no fórum, navegar até a Pesquisa padrão do fórum e procurar por ocorrências com as palavras “Internet Explorer” e retornar o resultado na tela. Veja como ficou abaixo:

Public Sub AbreELogaNoForum()
 Dim MyPass As String, MyLogin As String
redo:
 MyLogin = Application.InputBox("Por Favor entre com o Login", "Forum Tomás Vásquez", Default:="login", Type:=2)
 MyPass = Application.InputBox("Por favor entre com a senha", "Forum Tomás Vásquez", Default:="Password", Type:=2)
 If MyLogin = "" Or MyPass = "" Then GoTo redo
 driver.Start "chrome", "http://www.tomasvasquez.com.br/"
 driver.setImplicitWait 5000
 
 driver.Open "/forum/ucp.php?mode=login"
 driver.findElementById("username").SendKeys MyLogin
 driver.findElementById("password").SendKeys MyPass
 driver.findElementByName("login").Click
 
 driver.setImplicitWait 1000
 'navega até a pesquisa
 driver.Open "/forum/search.php"
 driver.setImplicitWait 2000
 'digita o critério e pesquisa
 driver.findElementById("keywords").SendKeys "Internet Explorer"
 'procura o botão de Pesquisar através de CSS Selector e clica
 driver.findElementByCssSelector("[value=Pesquisar]").Click
 driver.setImplicitWait 2000
 'obtem o resultado e joga num MsgBox
 MsgBox driver.findElementByClassName("searchresults-title").Text
 
End Sub

Explicando o código, entre uma navegação e outra chamo a função driver.setImplicitWait, que recebe como parâmetro a quantidade de milisegundos (1000 milisegundos = 1 segundo) que a rotina deve esperar antes de executar a próxima instrução. Isso é necessário pois a velocidade de transição entre uma página e outra depende de muitos fatores, desde a velocidade do computador até a velocidade da internet. Ajuste-o para cada caso.

Aqui o resultado foi o seguinte:

Resultado da pesquisa no fórum

Note que neste código, já começamos a explorar funcionalidades inerentes ao HTML5, como seletores complexos de CSS para alcançar determinados elementos.

Obviamente, este é um exemplo que está longe de explorar o potencial do que o Selenium pode fazer. O intuito aqui foi apresentar uma alternativa ao Internet Explorer para automatizar a navegação em páginas da web. Explorarei mais opções de navegação e do Selenium em outros artigos.

Curiosidades

Apesar do Selenium ter nascido com o Firefox, na versão utilizada neste artigo o mesmo dá erro. O bug é conhecido da comunidade do Selenium e está em análise. Até a presente data, mesmo na última versão o erro não havia sido corrigido. O Internet Explorer também pode ser utilizado se for o caso. Não testei com o Microsoft Edge.

A escolha pelo Chrome deve-se ao fato do navegador ser baseado Chromium, que é de código aberto. Com isso, a quantidade de customizações e configurações é enorme e pode ser melhor explorada do que nas alternativas.

Cuidados

Sempre que você o utiliza o Selenium WebDriver, uma instância do “Driver” é criada em memória. Note que o código é divido em 2 funções, sendo uma que abre o navegador e outra que o fecha. Esta última é necessária, por mesmo que você feche o Excel e o navegador, a instância do Driver ficará em memória.

Por fim, não utilize para fins impróprios, como inundar a internet com lixo, automatizando a entrada de dados. Primeiramente, recorra ao bom senso. Depois, a internet é rastreável e é fácil chegar até o causador do problema.

Finalizando

O Selenium é “A”alternativa à automação de navegação web e extração de dados para os programadores VBA. Já utilizei em alguns projetos para clientes e funcionou muito bem, chegando a fazer desde navegação avançada até extração de dados e automação de download de arquivos. Logo publicarei outras opções de código que a biblioteca Selenium Webdriver oferece de customizações para melhor demonstrar o potencial da ferramenta.

Bom proveito!

Comentários

comentários