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