Escolar Documentos
Profissional Documentos
Cultura Documentos
com Selenium
Parte I
Automatizando
Imaginemos um formulário com 20 campos, obrigatórios,
validações e dentre outras surpresinhas? Isso acaba sendo
cansativo e demorado para preencher todos esses campos,
correto? Sim, demora muito.
Cenário
Faremos um exemplo básico de abrir a página do Bing, consultar
alguma coisa e fazer uma validação se o o total do resultado foi o
esperado.
Mãos à massa!
Primeiro teremos que copiar o nosso WebDriver (já feito
download) para a pasta do nosso projeto ou em qualquer outro
lugar. Escolhi deixá-lo na pasta do Google Chrome.
C:\Program Files (x86)\Google\Chrome
install-package Selenium.WebDriver
Conclusão
Mais simples que isso impossível. Vimos que podemos facilitar
diversos cenários de testes usando o Selenium. Num próximo post,
vamos fazer um exemplo mais intermediário usando algumas
coisas extras do Selenium.
Testes Automatizados
com Selenium
Parte II
Actions
É uma classe específica que automatiza interações avançadas com
o browser, como por exemplo movimentos do mouse, cliques,
pressionar as teclas, interações do menu de contexto, etc.
Demonstração
Vamos fazer uma demonstração com o site da Amazon, com o
seguinte cenário:
Segundo exemplo
Iremos construir (usando Build) múltiplas ações em uma única
execução.
Para cada ação finalizada, iremos utilizar o Release para
“remover/matar” esta ação do elemento anterior.
Conclusão
Bem, acho que deu pra explicar mais ou menos o uso da
classe Actions. Esta classe nos permite fazer uma série de coisas
interessantes e usaremos em outros momentos.
Testes Automatizados
com Selenium
Parte III
Waits
Não poderia continuar os posts sem falar de Waits. Mas que
diabos é Waits? Esse cara serve para que a execução da tarefa
ocorra em uma certa quantidade de tempo antes de continuar com
o próximo passo. Um exemplo bem comum disso são as
requisições AJAX (execuções assíncronas), um botão que habilita
após preencher um campo, etc.
Implicit Waits
Uma espera implícita informa ao WebDriver para pesquisar na
página, um elemento (ou elementos) por um certo período de
tempo. A configuração padrão é 0 (zero). Uma vez definida, a
espera implícita é usada para a vida da instância do WebDriver.
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1
0));
var element = driver.FindElement(By.Id("id_element"));
Explicit Waits
É uma forma de inserir esperas através de comandos específicos.
Existem 2 tipos de esperas explícitas: WebDriverWait e Fluent
Waits.
install-package Selenium.Support
Fluent Waits
É outro tipo de espera explícita onde você pode definir a pesquisa
e ignorar a exceção para continuar com a execução das ações caso
o elemento não seja encontrado. No C# não existe uma classe
específica como no Java, onde se faz de forma fluente toda a
configuração. (veja aqui sobre FluentWait com Java)
Conclusão
Afinal, a espera implícita nos permite “burlar”, mascarando os
erros reais. Ignora tipos específicos de excepção, como por
exemplo NoSuchElementExceptions. Não seria interessante
usá-la no projeto. Inclusive todos recomendam fortemente não
utilizar. Basta o time do Selenium remover esta opção, já
ajudaria! :o)
IJavaScriptExecutor js = (IJavaScriptExecutor)Webdriver;
ou
IJavaScriptExecutor js = Webdriver as IJavaScriptExecutor;
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("arguments[0].style.border='2px solid
red'", element);
}
Usando CSS diretamente via javascript, apliquei 2 pixels de borda
e a informei a cor vermelha.
Por que usei arguments[0]?
O arguments é uma variável local disponível dentro de todas as
funções. Este objeto é um Array.
Imagine criar uma função de soma (exemplo muito tosco este,
somente para exemplificar):
function sumNumbers(x, y)
{
var n1 = arguments[0];
var n2 = arguments[1];
return (n1 + n2);
}
Com o arguments, podemos pegar esses valores de x e y.
Dê uma olhadinha aqui nesta documentação.
SelectElement
Esta classe manipula as opções em um elemento HTML de
seleção. O famoso dropdown ou combobox. Ela é muito simples de
utilizar.
Código HTML
<!DOCTYPE html>
<html>
<body>
<select id="id_dropdown">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="opel">Opel</option>
<option value="audi">Audi</option>
</select>
</body>
</html>
Código C#
Referências
IJavaScriptExecutor.ExecuteScript Method
Executes JavaScript in the context of the currently selected frame or
window.seleniumhq.github.io
WebDriver executeAsyncScript vs executeScript
What is the difference between executeAsyncScript and executeScript? How can i use
event such as window.onload? I tried…stackoverflow.com
SelectElement Class
Provides a convenience method for manipulating selections of options in an HTML
select element.seleniumhq.github.io
ITakesScreenshot Interface
Defines the interface used to take screen shot images of the screen.seleniumhq.github.io
Selenium + SpecFlow + NUnit
+ ExtentReports
Reportando a execução dos testes
Além disso, pode ser configurada para suportar Java e .NET nos
principais frameworks de testes existentes. Também é permitido
registrar todos os passos dos testes num Report Server usando o
banco MongoDB. Para isso, ele utiliza uma biblioteca chamada
Klov. Mas, não iremos abordar neste momento.
install-package Nunit
install-package NUnit3TestAdapter
install-package Specflow
install-package SpecFlow.NUnit
install-package Selenium.WebDriver
install-package Selenium.WebDriver.ChromeDriver
install-package ExtentReports
Utilizando Hooks
O SpecFlow tem um cara que nos ajuda em algumas coisas
interessantes, o nome dele é Hooks. Os Hooks são event bindings,
ou seja, pode ser usado, disparado, para executar um evento em
um momento específico, como por exemplo: executar uma função
antes de executar os testes ou depois de uma feature criada, enfim!
Exemplo básico:
[Binding]
public class MeuHook
{
[AfterTestRun]
public void SalvarArquivoTexto()
{
// seu codigo aqui
}
}
Toda vez que você executar seu teste , tendo uma classe Hook para
fazer determinados processos, automaticamente irá passar por
esse trecho de código.
Abaixo o nosso Hook. Criei a classe com esse nome para nosso
exemplo. Vou explicar o seu conteúdo:
Executando
Vamos então executar o teste e vamos ver o resultado! Por aqui
não deu erro algum, mas podemos simular um erro para que nosso
Report mostre onde foi.
Agora com erro…
Assert.AreEqual(expected, 2);
Conclusão
Foi um exemplo simples, nada de tão complexo. Mas dá pra
vermos que o ExtentReports nos ajuda nesse processo de
relatórios. Existem várias outras configurações desta API, mas não
entrei em tantos detalhes. Dê uma fuçada para conhecer um pouco
mais. Vale apena!
MsTest
O Visual Studio Unit Testing Framework (MS Test), parte
integrante da própria IDE de desenvolvimento da Microsoft.
NUnit
Framework open source, foi portado inicialmente JUnit (um dos
primeiros frameworks para testes unitários na plataforma Java).
xUnit
Já o xUnit, é uma ferramenta de teste de unidade gratuita,
também open source, foi escrito pelo inventor original do NUnit
v2, é o mais novo framework para testes unitários em .NET.
MsTest
Desde a versão Visual Studio 2012 Update 1, é possível criar
testes com vários parâmetros de entrada, adicionando à
assinatura do método os
attributos DataTestMethod, DataRow.
NUnit
Para esse framework, crie um projeto Class Library (.Net Core) e
não se esqueça de instalar os pacotes abaixo:
install-package Microsoft.NET.Test.Sdk
install-package NUnit
install-package NUnit3TestAdapter
xUnit
Já com nosso amigo xUnit, temos alguns outros benefícios
interessantes, como por exemplo além de testar múltiplos
parâmetros, podemos testar uma classe inteira ou um método de
uma classe específica, ambos como parâmetro. Mas antes, crie um
projeto de testes do tipo xUnit, ou um projeto Class Library (.Net
Core) e instale os pacotes abaixo:
install-package xunit
install-package xunit.runner.visualstudio
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Referências
Comparing xUnit.net to other frameworks > xUnit.net
xUnit.net does not require an attribute for a test class; it looks for all test methods in all public
(exported)…xunit.github.io
Parametrizando Testes
Unitários
Aplicando nos frameworks MsTest, NUnit e xUnit
MsTest
O Visual Studio Unit Testing Framework (MS Test), parte
integrante da própria IDE de desenvolvimento da Microsoft.
NUnit
Framework open source, foi portado inicialmente JUnit (um dos
primeiros frameworks para testes unitários na plataforma Java).
xUnit
Já o xUnit, é uma ferramenta de teste de unidade gratuita,
também open source, foi escrito pelo inventor original do NUnit
v2, é o mais novo framework para testes unitários em .NET.
MsTest
Desde a versão Visual Studio 2012 Update 1, é possível criar
testes com vários parâmetros de entrada, adicionando à
assinatura do método os
attributos DataTestMethod, DataRow.
NUnit
Para esse framework, crie um projeto Class Library (.Net Core) e
não se esqueça de instalar os pacotes abaixo:
install-package Microsoft.NET.Test.Sdk
install-package NUnit
install-package NUnit3TestAdapter
xUnit
Já com nosso amigo xUnit, temos alguns outros benefícios
interessantes, como por exemplo além de testar múltiplos
parâmetros, podemos testar uma classe inteira ou um método de
uma classe específica, ambos como parâmetro. Mas antes, crie um
projeto de testes do tipo xUnit, ou um projeto Class Library (.Net
Core) e instale os pacotes abaixo:
install-package xunit
install-package xunit.runner.visualstudio
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Referências
Comparing xUnit.net to other frameworks > xUnit.net
xUnit.net does not require an attribute for a test class; it looks for all test methods in all public
(exported)…xunit.github.io