specflow selenium webdriver end end example
Exemplo de ponta a ponta do uso do Specflow & Selenium Webdriver:
Nisso Série de treinamento Specflow grátis , para Breve introdução sobre Specflow foi dado em nosso tutorial anterior.
Neste artigo, veremos um exemplo de ponta a ponta do uso de especificações BDD baseadas em Specflow e os testes serão executados por meio do Selenium Webdriver.
Os testes podem ser tão simples quanto testar a funcionalidade de login de um aplicativo. É apenas isso, vamos descrever esses testes usando Specflow e as implementações Step usarão o driver e comandos Selenium e o NUnit como framework de asserção.
Também usaremos o executor Specflow baseado em NUnit (ao contrário do Specrun, que não é de código aberto e introduz um atraso aleatório na versão gratuita).
O que você aprenderá:
Tutorial de vídeo: Specflow e Selenium
Assista ao tutorial em vídeo sobre Specflow e Selenium:
tipos de casos de teste em teste de software
Vamos começar.
Para começar, vamos criar um projeto de teste de unidade no Visual Studio e instalar os seguintes pré-requisitos:
# 1) Crie um projeto de teste de unidade
Instale o pacote Nuget para Nunit e Specflow.
Install-Package Specflow.NUnit
# 2) Instale o Webdriver do Selenium para o navegador Chrome.
Isso pode ser instalado por meio do console do Gerenciador de pacotes Nuget também por meio do comando abaixo.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Instale as bibliotecas do Selenium Webdriver e os Auxiliares de espera do Selenium para adicionar esperas de ExpectedCondition.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Agora remova o arquivo test.cs do projeto que é criado automaticamente.
Estamos executando esta etapa para evitar qualquer confusão, pois usaremos arquivos de recursos e arquivos de definição de etapas para Specflow.
# 5) Crie pastas para recursos e definições de etapas para armazenar arquivos de implementação de definições de recursos e etapas.
Esta não é uma etapa obrigatória, mas é útil para organizar os recursos e as implementações das etapas em pastas separadas.
# 6) No final das etapas acima, a estrutura da solução e o packages.config devem ser semelhantes aos mostrados abaixo.
Implementação de recursos e etapas
Agora vamos começar com o arquivo de recurso e a implementação da etapa real.
Sobre o recurso - O recurso de amostra será o de testar / validar a funcionalidade de pesquisa do site do Youtube. Estaremos procurando por uma palavra-chave e afirmando que o usuário foi redirecionado para a página de resultados da pesquisa.
Adicione um novo arquivo de feição e nomeie-o como YoutubeSearchFeature.feature
Adicione um cenário de funcionalidade de pesquisa e uma descrição de recurso conforme mostrado abaixo:
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
O cenário acima espera que o teste:
- Navegue até o site do Youtube: Isso exigirá uma estrutura de automação da Web como o Selenium, que usará um Webdriver para navegar até uma página da Web em um navegador.
- Pesquise uma palavra-chave: Esta etapa envolverá a procura de botões e elementos de entrada apropriados para digitar a palavra-chave e executar a pesquisa, respectivamente.
- Assegure que os resultados da pesquisa são exibidos e que o usuário está na página de resultados: Essa etapa envolverá afirmações sobre como verificar se o usuário acessou a página correta.
Agora vamos ver as implementações de cada uma das etapas.
Antes disso, vamos entender como iremos integrar a lógica / código Selenium na definição existente do Specflow.
Selênio ou qualquer outra ferramenta (ou stubs / mocks / drivers de teste de unidade, etc.) são essencialmente uma parte intermediária da Step Execution, mas o principal a ser entendido é a maneira de integrar esses dois Frameworks.
Specflow permite aos usuários escrever especificações de teste. Não dita a ferramenta que deve ser usada. Portanto, o desenvolvedor de teste é livre para escolher quantas ferramentas de teste quiser, dependendo do caso de uso que está sendo resolvido.
Para usar o Selenium neste cenário, precisamos do seguinte:
- Uma instância do WebDriver (usaremos o ChromeDriver para simplificar), que permitirá ao usuário realmente navegar para a página da web usando um navegador conforme a implementação do driver.
- Poucas declarações WebElement (e podem ser feitas apenas como parte das implementações Step) que são necessárias para interagir com o usuário e passar entradas e executar ações etc.
- Poucas afirmações no título da janela, urls, etc, que podem ser executadas na instância do driver.
Estaremos criando uma instância do ChromeWebdriver no arquivo Step Implementations.
Portanto, vamos criar o arquivo Step Definition. Como vimos no último artigo, Specflow fornece um mecanismo para gerar automaticamente as definições de Step (que podem ser personalizadas / modificadas posteriormente conforme necessário).
- Navegue até o arquivo de feição, clique com o botão direito e selecione “Gerar Definições de Etapa”.
- Crie um novo arquivo na pasta StepDefinitions conforme criamos anteriormente e nomeie o arquivo como YoutubeSearchFeatureSteps.cs
- Certifique-se de que todas as etapas do cenário foram vinculadas às definições de etapa de forma adequada.
Dica - Modificando as definições de etapas geradas automaticamente:
Agora, se você observar cuidadosamente, a definição de Step que foi gerada para nossa etapa de palavra-chave de pesquisa, ou seja, 'Eu inseri a Índia como palavra-chave de pesquisa', o código gerado automaticamente, não identifica / separa a palavra-chave de pesquisa e, portanto, não a parametriza.
[Given(@&'I have entered India as search keyword')] public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Mas não é isso que queremos. Precisamos que a palavra-chave de pesquisa seja parametrizada, caso contrário, para cada pesquisa de palavra-chave, teremos que criar uma definição de Step personalizada.
Então, vamos ver como modificar esta definição de Step para uma mais genérica, o que permitirá parametrizar a palavra-chave de busca. Isso pode ser feito por meio de um matcher regex simples.
Consulte o exemplo de código abaixo. Substituímos a palavra-chave de pesquisa por meio de uma correspondência de regex, ou seja, “ (. *) ”O que isso fará é substituir o valor de qualquer palavra-chave que você passar do Cenário e definirá o valor da palavra-chave de pesquisa no parâmetro de entrada denominado“ searchString ”no exemplo de código abaixo.
[Given(@'I have entered (.*) as search keyword')] public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
Dessa forma, ele mantém o código modular e evita código clichê repetido para cada implementação de Step.
Integração de selênio e lógica de definição de etapas
Agora vamos ver a integração real do Selenium com o Specflow. Uma vez que as definições das etapas são geradas, iremos adicionar código a elas para executar o cenário de teste real.
Vejamos, onde podemos colocar e inicializar a instância do driver Selenium Web para que esteja disponível durante a execução do cenário. Estaremos colocando o Driver como um campo privado da Binding Class que foi gerada. O driver será inicializado como parte da classe Construtor.
Desta forma, o driver permanece inicializado por todo o curso da duração do teste, pois temos apenas um arquivo Binding para todas as etapas (e ele é inicializado antes do início da execução do teste).
Observe também que também implementaremos o Descartável interface, de modo a Dispor a instância do driver após o qual ele não é mais necessário. Colocá-lo no método Dispose () garantirá que, uma vez que o Object da classe seja descartado, a instância do driver também possa ser descartada.
Esta é a aparência do código para declaração e inicialização da instância do WebDriver:
[Binding] public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); //... other Step defintion implementations public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } }
Com o exposto acima, a instância do driver pode ser usada como parte de qualquer implementação de Step que seja parte da execução do cenário.
Vamos agora ver a implementação da etapa de cada cenário individual.
# 1) Organizar etapas:
Given I have navigated to youtube website And I have entered India as search keyword
Ambas as etapas envolvem a interação com a instância do driver. A primeira etapa abre a janela do navegador e navega para o site do youtube
A segunda etapa procura o botão de entrada de pesquisa e insere “Índia” como a palavra-chave de pesquisa.
Abaixo está a implementação de ambas as etapas:
[[Given(@'I have navigated to youtube website')] public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } 7. [Given(@'I have entered (.*) as search keyword')] public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); }
Para a primeira etapa, observe a afirmação de que ela garante que a navegação para o youtube foi bem-sucedida, verificando o título da janela.
Observação: Pode haver várias maneiras de colocar Assertions em diferentes elementos da web ou propriedades de driver, mas o objetivo final deste tutorial é apenas ilustrar da maneira mais simplista.
Na segunda etapa, adicionamos uma espera dinâmica usando Condições esperadas o que garantirá que a caixa de pesquisa esteja visível antes que o código tente digitar a palavra-chave da pesquisa.
Além disso, estamos armazenando o searchString em um campo privado searchKeyword. Isso é feito para que a searchKeyword possa ser usada em outras implementações do Step também.
Dica - Transmitindo dados entre as etapas
A passagem / armazenamento de dados por esta abordagem (ou seja, por meio de variáveis de classe) é um dos meios pelos quais os dados podem ser compartilhados entre as ligações Step.
Existem outras maneiras de fazer isso, assim como o próprio Specflow fornece um Objeto de dicionário dinâmico chamado ScenarioContext. Veremos mais detalhes sobre isso nos próximos artigos.
# 2) Etapa de ação
When I press the search button
Agora vamos dar uma olhada na ação real, que é clicar no botão Pesquisar. O arquivo de implementação da etapa irá procurar o botão de pesquisa e clicar nele para executar a etapa do cenário.
O código para esta etapa se parece com o mostrado abaixo:
[When(@'I press the search button')] public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Finalmente, a etapa de afirmação:
Then I should navigate to search results page
Nesta etapa, estamos apenas verificando nas propriedades do Driver se a URL e o título da página contém a palavra-chave de busca ou não.
O código para esta etapa é mostrado abaixo:
[Then(@'I should be navigate to search results page')] public void ThenIShouldBeNavigateToSearchResultsPage() { // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); }
Execução
Agora, vamos tentar executar o Cenário e ver os resultados. Assim que o cenário for executado, todas as etapas do cenário serão executadas sequencialmente. O teste será abrir um navegador, navegar até um site e, em seguida, realizar alguma ação.
A saída do teste pode ser vista clicando no botão “Saída” do resumo do teste que mostra o sucesso / falha de cada etapa individual.
Pontas
Etapas de falha intermediárias
No caso de um cenário com etapas intermediárias que falham, observe que, nesses cenários, o Specflow simplesmente não executará nenhuma das etapas restantes desse cenário e marcará o resultado do teste como falho.
melhor ferramenta de limpeza para pc
Executando testes com adaptador NUnit
Para este exemplo, executamos nossos testes usando o executor de teste Specflow.NUnit (que instalamos por meio do Gerenciador de pacotes Nuget).
Isso é diferente em alguns aspectos, conforme mostrado abaixo, do executor Specrun que usamos no artigo anterior.
- O executor Specflow.NUnit é de código aberto.
- Não introduz nenhum atraso na execução dos testes.
Conclusão
Neste artigo, vimos um exemplo de ponta a ponta da integração do Selenium com a estrutura Specflow por meio de um cenário de teste simples de uma pesquisa de vídeo no aplicativo Youtube.
Durante a integração do Selenium, também examinamos como compartilhar dados entre diferentes associações por meio de campos de classe privada. Também cobrimos a execução do teste no corredor NUnit versus o corredor Specrun e comparamos ambos em detalhes.
Arquivos de código
YoutubeSearchFeature.feature
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
YoutubeSearchFeatureSteps.cs
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; using SeleniumExtras.WaitHelpers; using System; using System.Collections.Generic; using System.Linq; using TechTalk.SpecFlow; namespace SepcflowSelenium.StepDefinitions { [Binding] public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); [Given(@'I have navigated to youtube website')] public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } [Given(@'I have entered (.*) as search keyword')] public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); } [When(@'I press the search button')] public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); } [Then(@'I should be navigate to search results page')] public void ThenIShouldBeNavigateToSearchResultsPage() { System.Threading.Thread.Sleep(2000); // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); } public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } } }
Assista ao nosso próximo tutorial para saber mais sobre vinculações compartilhadas e com escopo, ganchos e reutilização de etapas no Specflow!
PREV Tutorial | PRÓXIMO Tutorial
Leitura recomendada
- Tutorial Cucumber Selenium: Cucumber Java Selenium WebDriver Integration
- Introdução ao Selenium WebDriver - Selenium Tutorial # 8
- Integração do Jenkins com o Selenium WebDriver: tutorial passo a passo
- Implementação do nosso primeiro script WebDriver - Selenium WebDriver Tutorial # 10
- Como lidar com alertas / pop-ups no Selenium WebDriver - Tutorial do Selenium nº 16
- Configuração e instalação completas do WebDriver com Eclipse - Selenium Tutorial # 9
- Verifique a visibilidade dos elementos da Web usando vários tipos Comandos do WebDriver - Selenium Tutorial nº 14
- Tutorial do GeckoDriver Selenium: Como usar o GeckoDriver em projetos do Selenium