2 – Iniciando um Projeto no Selenium e Cucumber – Parte I

Criando classes, features e métodos necessários

Após configurado o ambiente e o projeto, é hora de começar a criar as classes e features necessárias.

OBS: como o objetivo do blog é apresentar o básico da ferramenta para quem está iniciando na área, alguns conceitos poderão ser suprimidos. Contudo, aconselho a sempre buscar informações de boas práticas e padrões de uso adotados nas ferramentas 😉

Vamos começar pela feature “Cliente”.

Para isso, clique com o botão direito sobre “src/test/java” e acesse o menu “New > File”:

s37

s37b

Na janela que abrir, digite no campo “File name” o texto “Cliente.feature”:

s38

Após clicar em “Finish” o seguinte arquivo de extensão .feature será criado:

s39a

Observe em mais detalhes o arquivo .feature criado:

s39b

s39c

Já é criado um “template” dentro do arquivo, para auxiliar na montagem dos cenários de testes. Ele contém dicas e exemplos de cenários.

Vamos deletar os cenários de exemplo e criar o seguinte cenário:

Given efetuei login no sistema
And acessei o menu Clientes >> Inserir
When na tela Dados de Identificacao informo os dados de Pessoa Fisica
And na tela Dados de Identificacao clico em Avancar
And na tela Enderecos informo os enderecos
And na tela Enderecos clico em Salvar
Then na tela Enderecos sera exibida mensagem de sucesso
And efetuarei logout do sistema

OBS: note que Given, And, When e Then são palavras reservadas pelo Cucumber.

Após editar o arquivo .feature, tecle Ctrl+Shift+F para formatar o arquivo.

O resultado esperado será:

s40

Ao clicar em Salvar, os passos do cenário ficarão destacados em amarelo:

s41

s41b

Isso indica que NÃO EXISTEM métodos elaborados para os passos de testes. Imaginem que cada um dos passos de teste no Selenium equivale a um keywordTest no TestComplete. Lembram que este keywordTest pode ser considerado como um método? Pois bem, aqui iremos criar um método para cada um dos passos destacados em amarelo acima. OBS: note que temos mais Steps que Keywordtests se comparados ao visto nas aulas de TestComplete. Isso se deve ao fato que aqui alguns keywordtests foram “quebrados” em dois ou mais Steps.

Mas esses métodos serão criados em uma classe java chamada ClienteSteps. O sufixo “Steps” indica que nela somente teremos os métodos responsáveis pelos passos de testes.

Para isso, será clicado com o botão direito sobre “src/test/java” e acessado o menu “New > Class”:

s42

s42b

Na janela que abrir, informar o nome “ClienteSteps” no campo “Name”:

s43

Ao clicar em “Finish” o arquivo será adicionado:

s44

Agora vamos copiar os passos (steps) contidos no Cliente.feature e colar no ClienteSteps.java:

s45

s45b

Fizemos isso para facilitar a visualização de quais métodos teremos que criar.

Agora colocaremos um “@” na frente de cada step:

s46

Agora é preciso colocar o texto de cada step (com exceção da palavra reservada) dentro de um (“ ”), conforme ilustrado abaixo:

s47

Agora é necessário montar os métodos para cada um dos steps. Para fins didáticos, nesse momento será feita somente a “casca” dos métodos, conforme mostrado:

s48

Observe a imagem acima: cada step possui um método. É dentro desses métodos que os campos de tela serão preenchidos, botões serão clicados e menus serão acessados.

Mas antes de prosseguir, há mais uma coisa a se ajustar: o import para as palavras reservadas (note que elas estão sublinhadas em vermelho, o que indica que há um “erro”)

Para isso, posicione o ponteiro do mouse encima de cada uma das palavras e espere o menu popup aparecer:

s49

Clique sobre o primeiro item mostrado: “Import Given (cucumber.api.java.en)”. Ele então será adicionado à lista de imports da classe java:

s50

Note na imagem acima que depois da importação não há mais erros para ele, inclusive a palavra mudou de cor (ficou cinza).

Após repetir os passos acima para as palavras “And”, “When” e “Then”, tem-se:

s51

s51b

Agora a classe não apresenta mais erros.

Ao ir para a classe Cliente.feature e teclar “Ctrl + Shift + F”, não serão mais apresentados passos destacados em amarelo:

s52

Nesse momento temos a “Cliente.feature” que é equivalente ao “Test Items” do TestComplete e temos a “ClienteSteps.java” que contém métodos equivalentes aos “keywordTests” do TestComplete.

Agora é preciso criar a classe que seria o equivalente ao objeto “NameMapping” do TestComplete.

Para isso, será criada uma nova classe java, chamada “ClienteElementMap.java”, conforme mostrado na sequencia abaixo:

s53

s54

s55

É nessa classe que serão “mapeados” os objetos de tela. Para isso será utilizado um recurso muito útil do Selenium: o PageFactory!

Basicamente esse recurso é o seguinte: ao declarar os objetos de tela na classe “ClienteElementMap.java”, utilizaremos o id/name desses objetos em sua declaração.

Exemplo: Observe a página de inserção de clientes abaixo:

s56

Tecle F12 para aparecer os elementos da tela:

s57

Agora basta clicar sobre o ícone destacado na seta da imagem abaixo:

s58

Em seguida, mova o ponteiro do mouse sobre a caixa de texto “CPF/CNPJ”:

s59

Observe que a caixa de texto foi destacada. Após clicar sobre a caixa de texto, seu correspondente código html será destacado na janela da direita, conforme ilustrado abaixo:

s60

Observe a propriedade “id” desse elemento: id=”cpf_cnpj”. Esse id é o que iremos utilizar para “mapear” o objeto na classe “ClienteElementMap.java”:

A imagem abaixo ilustra o “mapeamento”:

s61

Isso nada mais é do que a declaração de uma variável do tipo “WebElement” chamada “cpf_cnpj”. Contudo, observe na imagem acima que o tipo “WebElement” não está sendo reconhecido (está sublinhado em vermelho). Isso é porque ainda não foram realizados os “imports” do Selenium.

Para isso, posicione o ponteiro do mouse sobre a palavra “WebElement”:

s62

No menu suspenso que aparecer, clique em “Import ‘WebElement (org.openqa.selenium)’”.

O resultado pode ser visto abaixo:

s63

Agora é necessário repetir os passos para os demais elementos da tela de dados de identificação (campos de texto, radiobuttons, combos e botão). O resultado é apresentado abaixo:

s64

Observe que os nomes dos elementos são IDÊNTICOS aos id’s deles na página.

Nesse momento tem-se 3 classes/arquivos no projeto:

  1. Cliente.feature: onde descrevemos os cenários baseados em chamadas de Steps;
  2. ClienteSteps.java: onde serão chamadas as implementações dos Steps (o equivalente aos KeywordTests do TestComplete);
  3. ClienteElementMap.java: onde ficam as informações dos objetos de tela (o equivalente ao NameMapping do TestComplete);

Mas, como faríamos para executar os testes propriamente dito? Como executar os cenários de testes que estão descritos nos arquivos .feature?

Para executá-los, é necessário criar uma outra classe que será responsável por somente executar os testes.

Para isso, clique com o botão direito sobre “src/test/java” e acesse o menu “New Class”:

s65

Na janela que abrir, informe “ClienteTest” no campo “Name” conforme ilustrado abaixo:

s66

Após clicar em “Finish”, a classe é adicionada ao projeto:

s67

Nessa classe, adicione o seguinte código:

s68

@RunWith(Cucumber.class)
@CucumberOptions(features = “src/test/java/Cliente.feature”,
glue = { “” }, monochrome = true, dryRun = false)

Obviamente apresentou alguns erros pois ainda não foram realizados os devidos imports.

A sequência de imagens abaixo mostra os imports sendo realizados:

s69

s70

s71

s72

A classe “ClienteTest.java” será a responsável por executar os testes. Nela estão indicadas as features que serão chamadas por ela.

Nesse exemplo, o caminho “src/test/java/Cliente.feature” exibe qual feature ele chama: a “Cliente.feature”.

Embora a estrutura do projeto já pareça completa nesse instante, ainda há mais algumas classes a serem adicionadas. Observe abaixo a classe “ClienteSteps.java”:

s51b

Observe que entre seus métodos temos Steps relacionados a ações que são realizadas não só na página Dados de Identificação, mas também Steps referentes a ações como efetuar login, efetuar logout e acessar menus, os quais não necessariamente são ações realizadas no preenchimento de um cliente (“Dados de Identificação” e “Endereços”). Se fizermos a chamada dos objetos de tela diretamente na classe Steps, “amontoaríamos” objetos de diversas partes/páginas do sistema. Para evitar isso, e também para organizar melhor o código, criaremos classes com o sufixo “Page”, as quais irão chamar os objetos contidos nas classes de sufixo “ElementMap”. Assim, uma classe de sufixo “Step” irá chamar os métodos de classe de sufixo “Page”.

Embora não pareça claro o objetivo descrito acima ou até confuso, vamos prosseguir com a criação de mais classes, assim tudo ficará mais claro 😉

Dica: para facilitar a compreensão, imagine que um KeywordTest no TestComplete agora é representado por uma classe de sufixo “Step” + uma classe de sufixo “Page” + uma classe de sufixo “ElementMap”.

Do mesmo jeito que foram criadas as classes .java anteriores, crie a classe “ClientePage.java”, conforme ilustrado abaixo:

s73

Adicione na classe um “extends ClienteElementMap” conforme ilustrado abaixo, assim a classe poderá “enxergar” os objetos contidos na classe “ClienteElementMap”:

s74

Agora é só colocar nessas classes de sufixo “Page” os métodos que serão utilizados pelos Steps lá da classe “ClienteSteps.java”. Soa complicado não? Não é não 😉

Uma dica muito boa é criar somente a “casca” desses métodos com o uso da classe “ClienteSteps.java”.

Observe novamente a classe “ClienteSteps.java”, especialmente os métodos destacados abaixo:

s75

Os métodos destacados são métodos cujas ações/interações ocorrem na tela de cadastro de cliente, sejam os dados de identificação ou endereço. Começaremos a criação dos métodos da classe “ClientePage.java” com base nos métodos da página “ClienteSteps.java”:

s76

Basicamente foi feito o seguinte: foi instanciada a classe “ClientePage.java” e chamado os métodos necessários dessa classe. Obviamente há várias marcações de erro na imagem acima pois a classe “ClientePage.java” ainda não possui os métodos ali chamados. É hora de criá-los. Naturalmente agora está mais fácil pois já sabemos quais métodos criar na classe “ClientePage.java”.

Ainda na classe “ClienteSteps.java”, posicione o ponteiro do mouse sobre um dos métodos que estão com erro, conforme exemplo abaixo:

s77

No exemplo acima, ao posicionar o ponteiro do mouse sobre o método que não existe, o Eclipse mostra uma janela sugerindo a criação do método na classe “ClientePage.java”. Basta então clicar sobre a opção “Create method ‘InformarDadosIdentificacaoPF() in type ‘ClientePage’” para criá-lo automaticamente, conforme ilustrado abaixo:

s78

Note que foi criado “automagicamente” o método “informarDadosIdentificacaoPF()” na classe “ClientePage.java”. Agora é só refazer os passos para os demais métodos, resultando em:

s79

Agora é só “preencher” esses métodos com os passos de testes, como os cliques em botões, preenchimento de caixas de texto, etc…

Comecemos pelo mais simples: “clicarAvancar()”:

s80

s81

Ao digitar “avancar.” dentro do método “clicarAvancar”, estamos simplesmente chamando o objeto “WebElement avancar” declarado na classe “ClienteElementMap.java” (observe as imagens acima). É possível chamá-lo assim facilmente pois a classe “ClientePage.java” possui aquele “extends ClienteElementMap.java”, ou seja: a classe “ClientePage.java” é uma extensão da classe “ClienteElementMap.java”:

Nas imagens acima, note o menu que apareceu depois de digitar o “.”: ali tem-se todas as ações que dispomos sobre o objeto WebElement “avancar”. Nesse caso, queremos somente clicar no botão “Avançar” para podermos avançar de página, então será selecionada a opção “click()”, conforme ilustrado abaixo:

s82

Pronto! Método finalizado. Agora é só realizar o mesmo para o método “informarDadosIdentificacaoPF()”, colocando os objetos na ordem desejada junto com as ações necessárias:

Segue abaixo o código necessário para os campos “Tipo de Pessoa”, “CPF/CNPJ”, “Nome/Razão Social”, “Email” e “Data de Nascimento”:

s83

Para selecionar um objeto do tipo radiobutton, basta efetuar um “.click()”, e para os campos que são uma caixa de texto, utiliza-se o “.sendKeys(“Texto desejado”)”.

O método está quase pronto, faltando apenas os campos “Sexo” e “Estado Civil”:

s84

Mas esses campos são combos. Como selecionar um item dentro de um combo? A resposta está abaixo:

s85

É preciso criar um objeto do tipo “Select” a partir do objeto “WebElement sexo” conforme ilustrado acima. E não pode esquecer de realizar o import correto, que é o segundo da lista: “Import ‘Select’ (org.openqa.selenium.support.ui)”. Após isso, é só utilizar o novo objeto “cmbSexo” para selecionar o item desejado, conforme ilustrado na imagem abaixo:

s86

Repetindo os mesmos passos para o combo “Estado Civil”, tem-se:

s87

Finalmente, tem-se os métodos para preencher os dados de identificação de um cliente pessoa física e então avançar para a próxima página.

Nesse momento é preciso preencher os métodos da classe “ClientePage.java” relacionados aos dados de endereço, conforme destacados abaixo:

s88

Antes de tudo, precisamos “mapear” os elementos dos dados de endereço da tela do sistema abaixo:

s89

Efetuando o mapeamento desses elementos de modo análogo ao efetuado para os elementos de dados de identificação, tem-se:

s90

Efetuado o mapeamento desse elementos, é momento de preencher os métodos “informarEnderecos” e “clicarSalvar” da classe “ClientePage.java”. Esse preenchimento é ilustrado abaixo:

s91

Resta agora o método “verificarMensagemSucesso” da classe “ClientePage.java”, que simplesmente verificará se foi mostrada a mensagem de sucesso ou não. Mas esse método veremos num momento posterior. Afinal, com tantas classes e métodos criados “para cá e para lá”, precisamos fazer uma recapitulação senão quem não tem intimidade com desenvolvimento vai se sentir perdido, e esse não é o objetivo do blog.

Recapitulação do que foi visto na aula

É comum vermos bons profissionais da área de qualidade terem um “receio” ou até “medo” da expressão “testes automatizados” pois ao ouvirem essa expressão logo vem em mente: métodos e classes intermináveis, códigos complexos de entender, entre outros pensamentos. Esses pensamentos, além de ansiedade e impaciência (na minha opinião), são os que fazem muitos deixarem de dar o primeiro passo.

Quando me refiro a “ansiedade e impaciência”, me refiro à “curva de aprendizagem”: não é do dia para a noite que você vai sair dominando tudo a respeito de uma linguagem de programação ou de uma ferramenta de automação. É preciso ir aos poucos, e ter consciência que quanto mais praticar melhor desenvolverá suas habilidades. Não se compare a desenvolvedores plenos ou seniors que “despejam” linhas e linhas de códigos em minutos e que dominam diversas tecnologias/frameworks. Pare eles chegarem no nível que estão, eles também tiveram que passar por muito estudo, aprendizado e muita prática, o que não foi do dia para noite.

Enfim, se você sentiu “ansiedade e impaciência” na aula de hoje, e está com a sensação de ter se perdido, meu conselho é: esvazie a mente! Sim, tire de sua mente todo esse pensamento de “código, código, código…. AAAAHHHHH! ME PERDI! Eu quero a minha mãe!”. Em vez disso, proponho o seguinte: utilize sua imaginação e suas skills de analista de testes!

Como analista de testes, você já deve ter elaborado alguns cenários de testes, correto? Pois bem, como você faria um pequeno cenário de teste (caminho feliz) para a funcionalidade de cadastro de clientes do nosso sistema? Uma sugestão é apresentada abaixo:

  • Efetuar login no sistema;
  • Acessar o menu “Clientes >> Inserir”;
  • Na tela “Dados de Identificação”, preencher os campos e clicar no botão “Avançar”;
  • Na tela “Endereços”, preencher os campos e clicar no botão “Salvar”;
  • Na tela “Endereços”, deve aparecer a mensagem de “Cadastro efetuado com sucesso”;

Veja que nosso cenário de teste é bem simples e objetivo, típico daqueles que temos que fazer em provas de entrevista de emprego, concorda?

Pois bem! Imagine que este cenário de teste é o ponto de partida para iniciar a automação de testes funcionais. E a ligação desse cenário de testes no Selenium se dá através do Cucumber!

Com o uso de palavras reservadas do Cucumber (Given, And, When, Then) nós “escrevemos” o cenário de teste no Cucumber:

  • Given efetuei login no sistema
  • And acessei o menu Clientes >> Inserir
  • When na tela Dados de Identificacao informo os dados de Pessoa Fisica
  • And na tela Dados de Identificacao clico em Avancar
  • And na tela Enderecos informo os enderecos
  • And na tela Enderecos clico em Salvar
  • Then na tela Enderecos sera exibida mensagem de sucesso
  • And efetuarei logout do sistema

Note que no Cucumber temos mais passos de testes do que antes. Isso se deve ao fato que “quebramos” alguns passos em passos menores. Isso foi feito pelos seguintes motivos:

  • Cada passo de teste escrito no Cucumber terá um método Java correspondente;
  • Quebrando em passos de testes menores, os correspondentes métodos serão menores, facilitando a manutenção;
  • Quebrando em passos de testes menores, aumentam as possibilidades de reutilização do passo em cenários diferentes;

Pergunta: “Até que ponto devo quebrar os passos de testes em passos menores? ”

Resposta: “Praticando! ”

Utilize sua imaginação: imagine que aquele passo de teste do teu cenário de testes é um passo de teste do Cucumber, e que aquele passo de teste do Cucumber tem um método Java correspondente. Está claro até aqui? Escreva num papel, faça desenhos, etc, até que você consiga visualizar essa estrutura se formando em sua mente:

desenho 1

O desenho acima mostra algo que fiz para visualizar a estrutura se formando em minha mente. Para mim ela mostra a relação entre um cenário de teste e o Cucumber, e entre o Cucumber e o Java. Ela me mostra que um passo de teste do meu cenário de testes pode se transformar em 1, 2 ou mais passos de teste no Cucumber. E que um passo no Cucumber irá chamar um método no Java.

Essa foi a imagem que eu fiz em minha mente. Qual foi a sua? Desenhe aí! 😉

Agora vem a visualização da parte Java. Na aula de hoje criamos algumas classes java, com os sufixos “ElementMap”, “Page”, “Steps” e “Test”.

Pergunta: “Porque tanta classe Java?”
Resposta: “Boas práticas! ”
Réplica da pergunta: “Resposta besta e evasiva! ”
Réplica da resposta: “É porque eu ainda não expliquei! Controle a ansiedade!”
Tréplica da pergunta: “Tá bom! ”

Piadas infames à parte, a razão por termos tantas classes Java com esses sufixos são justamente para melhor organização da estrutura do teste automatizado, o que lhe auxiliará no futuro a eventual manutenção delas, bem como uma melhor reutilização de métodos, evitando ficar escrevendo códigos e mais códigos repetitivos que na prática fariam a mesma coisa. Além disso, criando seu teste automatizado seguindo estruturas recomendadas, você irá facilitar o entendimento de seu teste para outras pessoas que forem efetuar manutenção nele de modo que não encontrem dificuldades.

Essas boas práticas você encontra em blogs e sites especializados em Selenium e Cucumber.

Bom, voltemos ao uso da nossa mais importante ferramenta: a imaginação. Está claro para você que um passo de teste do Cucumber chama um método Java, correto? E onde raios está esse método Java? Ele está em uma classe que contém somente métodos chamados por passos de testes do Cucumber: a classe de sufixo Steps (Steps = Passos, em inglês).

Entendeu agora o porquê do uso do sufixo “Steps”? É para identificar onde colocamos os métodos chamados por passos de testes do Cucumber. Imagine, rabisque num papel, desenhe essa relação entre passos de testes do Cucumber e a classe de sufixo “Steps”

desenho 2

O desenho que eu fiz acima demonstra claramente para mim que um passo de teste do Cucumber irá chamar um método Java de uma classe de sufixo “Steps”. E para você?

Mas que método é esse, como eu faria ele? Novamente, desenhe-o:

desenho 3

O desenho acima mostra como eu teria que fazer o método java na classe de sufixo “Steps” para o meu passo de teste do Cucumber:

Seguindo a nomenclatura do Cucumber, eu copio o passo de teste para a classe de sufixo “Steps” correspondente, colocaria um “@” na frente da palavra reservada “And” e colocaria dentro de um “(“”)” todo o resto do passo de teste. Depois disso só colocaria uma “casca” de um método com nome sugestivo (no exemplo “clicarAvancar”).

Essa estrutura você fará para todos os passos de testes que você tiver. Simples não? Observe que até esse momento você poderia montar toda a estrutura sem pensar em uma única linha de código. Você só precisou se preocupar em fazer um bom cenário de testes e seus respectivos métodos java.

Tranquilo até aqui? Então vamos imaginar mais agora, olhando para as classes de sufixo “Page” e “ElementMap”.

Sobre as classes de sufixo “Page” e “ElementMap”, são as classes que irão interagir com os elementos de tela:

  • “ElementMap”: mapeia os objetos da tela;
  • “Page”: contém os métodos que chamam os objetos de tela e interagem com eles (preencher o campo, clicar no botão, selecionar um item, essas coisas);

A classe de sufixo “ElementMap” é utilizada somente pela classe de sufixo “Page” correspondente.

OBS: Poderíamos ter simplificado nesse ponto e colocado a declaração dos elementos (o “mapeamento” deles) dentro da “Page” e não ter criado a “ElementMap”. Isso vai da escolha de cada um. Aqui optou-se por criá-la para mostrar que também é possível organizar a declaração dos elementos em uma classe separada dos métodos.

E aqui entra a pergunta: “que métodos eu terei que criar nas classes de sufixo “Page”? ”. A resposta é bem simples: aqueles métodos que tu precisar utilizar dentro dos métodos da classe de sufixo “Steps”!

Veja o método de uma classe de sufixo “Steps” abaixo:

    @And (“na tela Dados de Identificacao clico em Avancar”)
public void clicarAvancar(){

}

Essa “casca” é um método da classe de sufixo “Steps”, que diz que precisa clicar no botão “Avançar” da tela “Dados de Identificação”. Mas o responsável por efetuar o clique no botão propriamente dito é um método da classe de sufixo “Page”, o qual sequer foi criado ainda.

É aqui que vemos quais métodos devemos criar na classe de sufixo “Page”: serão criados de acordo com as necessidades dos métodos da classe de sufixo “Steps”. Observe o método abaixo, agora completo:

@And (“na tela Dados de Identificacao clico em Avancar”)
public void clicarAvancar(){
ClientePage clientePage = new ClientePage();
clientePage.clicarAvancar();
}

São somente duas linhas de código: a primeira declara uma variável do tipo “ClientePage”, e a segunda linha chama o método (de nome sugestivo) “clicarAvancar()” dessa classe.

Conforme visto nessa aula, é possível gerar “automagicamente” a casca desse método na “ClientePage”. Sendo assim:

public void clicarAvancar() {
// TODO Auto-generated method stub
}

Aqui está a “casca” do método “clicarAvancar()” da classe de sufixo “Page”. Agora é só preencher com os elementos de tela que desejamos interagir, informando qual interação. Nesse exemplo, clicar no botão “Avançar”:

public void clicarAvancar() {
avancar.click();
}

Pronto! Está feito! Do início ao fim você foi capaz de automatizar o passo de teste “clicar no botão Avançar”. Complexo? Difícil? Se tiver paciência e usar sua imaginação, não! Utilize sua imaginação! Desenhe!

desenho 4

Agora que tudo ficou mais claro, releia com bastante atenção essa aula do início ao fim, tendo a visão de como as classes se relacionam entre si! Você verá que tudo vai fazer mais sentido.

Essa aula termina por aqui senão ficará muito extensa. E o objetivo dessa aula é ajudá-lo a “pensar” e “visualizar” a estrutura das classes e como elas se relacionam entre si, então não faz sentido avançar muito. É extremamente importante que você tenha captado o propósito dessa aula pois ela é a base de tudo.

EXERCÍCIO: o objetivo desse exercício é ajudá-lo a fixar os conceitos mostrados nessa aula, para isso:

  1. Releia com bastante atenção essa aula;
  2. Baixe o arquivo versao-2.ppt  e renomeie ele para “versao2.zip” e extraia. Ele é o nosso sistema;
  3. Dentro da pasta do sistema, abra o arquivo “configurar_bancodedados.html” pelo Google Chrome e clique em “Gerar Base de Dados”. Esse passo é muito importante para que o sistema funcione em seu navegador Google Chrome.
  4. Rabisque em uma folha de papel alguma estrutura de classes e suas relações de forma que elas fiquem claras em sua mente.
  5. Crie a classe “Cliente.feature” e adicione os passos de teste necessários conforme visto na aula;
  6. Crie a classe “ClienteSteps.java” e adicione nela os passos de testes criados na classe “Cliente.feature” e faça os ajustes necessários conforme apresentado na aula (uso do @, imports necessários, criação da “casca” dos métodos);
  7. De volta à classe “Cliente.feature” tecle “CTRL + SHIFT + F” e salve para se certificar que nenhum passo ficou destacado em amarelo. Se ficou é porque ele não teve seu correspondente método java criado na classe “ClienteSteps.java”;
  8. Na pasta do sistema (aquele que você baixou no item 2), abra o arquivo “index.html” no Google Chrome, logue no sistema (utilizando login = john e pass = john), e acesse o menu “Clientes >> Inserir”;
  9. Crie a classe “ClienteElementMap.java” e, com o sistema aberto, mapeie todos os elementos das seções “Dados de Identificação” e “Endereços”;
  10. Crie a classe “ClienteTest.java” conforme apresentado nessa aula, realizando todos os imports necessários;
  11. Crie a classe “ClientePage.java”, não esquecendo de adicionar o “extends” correspondente;
  12. De volta à classe “ClienteSteps.java”, “preencha” os métodos necessários, fazendo as chamadas aos métodos da classe “ClientePage.java” conforme visto na aula;
  13. Com base na classe “ClienteSteps.java”, crie na classe “ClientePage.java” os métodos correspondentes. Dica: utilize os “atalhos” mostrados nessa aula: posicione o ponteiro do mouse sobre o método que ainda não existe na classe “ClientePage.java” e faça o Eclipse gerar “automagicamente” a casca desse método;
  14. Com as cascas dos métodos da classe “ClientePage.java” criados, preencha-os conforme visto na aula – métodos “informarDadosIdentificacaoPF()”, “informarEnderecos()” e “clicarSalvar()”;

IMPORTANTE: guarde seu projeto ao final da aula, pois será dado continuidade a ele na próxima aula.

45 comentários sobre “2 – Iniciando um Projeto no Selenium e Cucumber – Parte I

  1. Adriano 10 de maio de 2017 / 00:23

    Boa noite. Primeiramente parabéns pelo breve ‘tutorial’ de introdução a selenium + cucumber, estou iniciando meus conhecimentos nessas tecnologias, querendo aprofundar mais sobre ambas ferramentas e outras a mais de automação. Gostaria ate de conselhos sobre o que mais ou quais mais estudar. Queria tirar uma dúvida, sobre esse post, o arquivo disponibilizado no item “Exercicio” contem todo o sistema descrito para se obter os “IDs” do sistema A Fantastica Fabrica de Guarda-Chuvar? É que fui seguindo os passos a passos desde o post anterior, porém no momento de identificar os IDs para serem utilizados no comando WebElement, fiquei sem saber de qual sistema você esta se referenciando, já que o caminho pela imagem era local.

    Curtir

    • Automação Fora da Caixa 10 de maio de 2017 / 01:10

      Boa noite! Bem vindo ao Automação Fora da Caixa.

      Sim, esse arquivo é o sistema que eu utilizo nas imagens. Após baixá-lo, renomear a extensão para .zip e descompactá-lo você tem acesso ao sistema. (Tive que fazer esse truque da extensão ppt pois não consegui subir um arquivo de extensão .zip.)

      Todos os IDs/objetos do sistema vem dessa pasta. Na prática o “sistema” é 100% local, e as informações ficam todas armazenadas no browser. Não precisa sequer estar conectado à internet para utilizar esse sistema de treinamento. Aqueles html’s e os javascripts da pasta são o sistema.

      Após o passo 8 do exercício você já estará logado no sistema, então basta acessar os menus, e interagir à vontade com os objetos. É o que eu mostro nas imagens quando falo sobre teclar F12, onde já acessei o menu Clientes > Inserir e comecei a analisar os objetos da tela.

      Sobre conselhos, eu diria para investir parte do teu tempo em estudar um pouco de java, ao menos os conceitos básicos, no caso de você estar com seu Java “enferrujado”. Se não me engano na Caelum tem umas apostilas online free bastante interessantes sobre Java.

      Xpath’s também vale muito a pena estudar, pois com Selenium você vai precisar montar xpath’s nas situações que os elementos da tela não possuem ID.

      Não sei se consegui responder todas as tuas dúvidas, então fique à vontade para questionar 😉

      Abraço

      Curtir

      • Adriano 10 de maio de 2017 / 02:10

        Muito obrigado. Ajudou muito a clarear sim. Eu já tinha visto alguns artigos em blogs falando sobre as extensões FireBug e Firepath que inclue o Xpath, porém ainda não adentrei direito nesse quesito, nessa utilização dessas extensões. Já adicionei ao meu Firefox, porém ainda não comecei a seguir os passos de utilização dos mesmos, porém pelo pouco que li, vejo bastante util mesmo para encontrar elementos e conseguir obter os seus valores e poder realizar a validação do resultado esperado. Voltando ao seu post, no comando que você fala de executar “CTRL + SHIFT + F” na qual depois ira sumir o destaca em amarelo dos steps da estrutura da feature, porém comigo mesmo executando o comando, o destaque em amarelo permanece. O que pode ser que eu tenha feito errado?

        Curtir

      • Automação Fora da Caixa 10 de maio de 2017 / 02:33

        Se permaneceu destacado em amarelo é porque o Cucumber não encontrou algum método java para esse step. Uns errinhos bobos que eventualmente eu cometo são: 1 – criar o método na classe de sufixo Step e esquecer de salvar antes de voltar para a feature e teclar “CTRL + SHIFT + F”, 2 – ao copiar o step da feature para a classe Steps eu me passar e colocar também a palavra reservada dentro das aspas duplas. Por exemplo, eu tenho o step “And cliquei no botao Avancar” na feature e lá na classe de sufixo Step eu coloco @And (“And cliquei no botao Avancar”) – tem um “And” sobrando dentro das aspas duplas. Veja se não foi um desses casos.

        Tu consegue postar aqui o Step da feature e o Step da classe Steps com o método dele para compararmos?

        Curtir

      • fabiana 13 de maio de 2020 / 17:06

        Boa tarde, tudo bem? Onde eu pego esse arquivo pra fazer o download? Obrigada, Fabiana

        Curtir

      • Cristiano 13 de maio de 2020 / 22:44

        Boa noite!

        Tudo bem! E contigo?

        Esse “sisteminha” da fábrica de guarda-chuvas tu baixa ele ali no final do artigo, no exercício descrito ali. É um .zip (que eu nomeei pra .ppt pra eu poder subir no wordpress) com instruções de como utilizar. Mais instruções tu vê ali na descrição do exercício! 😉

        Qualquer dúvida é só perguntar!

        Curtir

      • fabiana 13 de maio de 2020 / 17:08

        Onde encontro esse arquivo, para mapear os elementos? Tks! Fabiana

        Curtir

  2. Adriano Almeida 10 de maio de 2017 / 14:18

    Bom dia, eu verifiquei ambas as situações, porém não comete nenhuma das duas, sempre salvo antes de qualquer outro passo a ser seguido e eu tinha retirado sim, as palavras chaves de dentro das ” “. Segue abaixo a estrutura da feature e da class:

    FEATURE :

    #Author: your.email@your.domain.com
    #Keywords Summary :
    #Feature: List of scenarios.
    #Scenario: Business rule through list of steps with arguments.
    #Given: Some precondition step
    #When: Some key actions
    #Then: To observe outcomes or validation
    #And,But: To enumerate more Given,When,Then steps
    #Scenario Outline: List of steps for data-driven as an Examples and
    #Examples: Container for s table
    #Background: List of steps run before each of the scenarios
    #””” (Doc Strings)
    #| (Data Tables)
    #@ (Tags/Labels):To group Scenarios
    # (placeholder)
    #””
    ## (Comments)
    #Sample Feature Definition Template
    @tag
    Feature: Title of your feature
    I want to use this template for my feature file

    Scenario: Inserir Cliente Pessoa Fisica
    Given efetuei login no sistema
    And acessei o menu Clientes >> Inserir
    When na tela Dados de Identificacao informo os dados de Pessoa Fisica
    And na tela Dados de Identificacao clico em Avancar
    And na tela Enderecos informo os enderecos
    And na tela Enderecos clico em Salvar
    Then na tela Enderecos sera exibida mensagem de sucesso
    And efetuarei logout do sistema

    CLASS :

    package foradacaixa;

    import cucumber.api.java.en.And;
    import cucumber.api.java.en.Given;
    import cucumber.api.java.en.Then;
    import cucumber.api.java.en.When;

    public class ClienteSteps {

    @Given (“efetuei login no sistema”)
    public void efetuarLogin() {

    }
    @And (“acessei o menu Clientes >> Inserir”)
    public void acessarMenuClientesInserir() {

    }
    @When (“na tela Dados de Identificacao informo os dados de Pessoa Fisica”)
    public void informarDadosIdentificacaoPF() {

    }
    @And (“na tela Dados de Identificacao clico em Avancar”)
    public void clicarAvancar() {

    }
    @And (“na tela Enderecos informo os enderecos”)
    public void informarEnderecos() {

    }
    @And (“na tela Enderecos clico em Salvar”)
    public void clicarSalvar() {

    }
    @Then (“na tela Enderecos sera exibida mensagem de sucesso”)
    public void verificarMensagemSucesso() {

    }
    @And (“efetuarei logout do sistema”)
    public void efetuarLogout() {

    }
    }

    Curtir

    • Automação Fora da Caixa 11 de maio de 2017 / 00:09

      Boa noite!

      Copiei a feature e a classe pro meu projeto aqui, e funcionou perfeitamente. Nenhum dos steps deu problema, encontrou todos.

      Realmente é bastante estranho esse problema, primeira vez que me deparo com algo assim. Mas como diria Jack, vamos por partes. Seguem abaixo algumas sugestões. Me avise se alguma dela resolve o problema, do contrário continuaremos com a investigação 😉

      1 – Se na feature você clicar sobre um step e em seguida teclar F3, você permanece na feature ou é direcionado para a classe ClienteSteps? Se for direcionado é sinal que ele encontrou o step na ClienteSteps.

      2 – Se o passo 1 não funcionou, coloca um ^ no início e um $ no fim de cada step na classe ClienteSteps, salve o arquivo, e faça um CTRL+SHIFT+F na feature, salve a feature novamente e repita o passo um. Por exemplo:

      @And (“^na tela Enderecos clico em Salvar$”)
      public void clicarSalvar() {

      }

      3 – No teu projeto deve ter uma pasta chamada “Maven dependencies”. Dentro dela estão os .jars cucumber-java, cucumber-core, cucumber-html, cucumber-jvm-deps, cucumber-junit e gherkin? Meu palpite nesse caso é de que talvez algum .jar esteja faltando no teu projeto. Em tempo: revisou teu pom.xml do projeto, estão todas as dependências lá?

      4 – No Eclipse, vá em “Project > Clean…”, limpe o projeto, aguarde o eclipse realizar a limpeza e tente novamente CTRL+SHIFT+F no arquivo feature e salve-o.

      Curtir

      • Adriano 10 de maio de 2017 / 23:44

        Boa noite.

        Eu executei todas as opções que você indicou, porém nada fez com que tira-se o amarelo em destaque. Verifiquei de novo, as dependencias estão no arquivo pom.xml, as .jars estão na pasta de Maven Dependencies, o clean foi executado e depois o comando “Ctrl + Shift + F” porém nada ocorreu de diferente. O F3 ao exeuctar ele não está direcionando para a classe ClienteSteps e mesmo colocando ^ e o $ não está ocorrendo nada diferente.

        Uma dúvida quanto ao primeiro passo, somente para garantir que fiz corretamente. Clica sobre o Given ou And, ou até mesmo no step todo e depois pressiona a tecla F3, correto? Se for esse o procedimento, eu fiz e não adiantou.

        Eu reparei que nos steps da feature está aonde fica a numeração das linhas de código, tem um icone de alerta na qual ao passar o mouse por cima tem escrito, em um dos steps, “Step ‘efetuei login no sistema ‘ does not have a matching glue code’. O que seria isso?

        Curtir

  3. Adriano 10 de maio de 2017 / 23:54

    Boa noite, eu de novo, desculpe o incomodo. É que depois de tentar de tudo, resolvi salvar tudo de novo e fechar o eclipse e abrir de novo. Agora já nao apareceu mais o amarelo em destaque. Não sei oq realmente houve, mas como java e as IDEs dele são meio loucas e os códigos as vezes não funciona, depois vc copia e cola em outra maquina e ele roda de boa. Não consigo entender as vezes esse comportamento anormal do Java. Mas obrigado pelo help. Me tira uma dúvida, quando irá postar a sequência?

    Curtir

    • Automação Fora da Caixa 11 de maio de 2017 / 20:16

      Hehehe! Os problemas mais complexos possuem as mais simples soluções. Que bom que deu tudo certo. Eu costumo postar toda quinta feira à noite a sequência das aulas.

      Curtir

  4. Adriano Almeida 11 de maio de 2017 / 10:51

    Duvida: Eu posso criar outros cenários ou outras features e chamar os steps dentro da classe ClienteSteps? Ou teria que criar uma classe nova para cada feature criada ou cada cenário criado? Outra coisa, se for de reutilizar a classe ClienteSteps para outros cenários ou features, como seria a organização dela perante a um projeto com um número grande de cenários (casos de testes) ou de features?

    Curtir

    • Automação Fora da Caixa 11 de maio de 2017 / 20:31

      Em uma feature você pode chamar steps de diversas classes de sufixo Steps. E na feature você poderá ter diversos cenários relacionados à funcionalidade da qual a feature é responsável. Por exemplo: cadastro de cliente pessoa física, cadastro de cliente pessoa juridica, validação dos campos xyz da tela de cadastro de cliente, etc..

      Na classe ClienteSteps o padrão é manter nela somente os steps que são relacionados à funcionalidade Cliente. Se por exemplo você tiver um step “pesquisar pedido”, esse step provavelmente irá para um conjunto de classes e feature responsáveis pela funcionalidade Pedido.

      Já dentro de um método da classe ClienteSteps é possível e bastante comum chamarmos métodos de de classes de sufixo Page. A aula seguinte mostra um pouco sobre isso.

      Aqui eu estou seguindo a ideia do PageObjects ao organizar as classes e métodos. Se você pesquisar por esse termo poderá encontrar bastante informações.

      Curtir

  5. MAURICIO SANTOS PEDROSO 25 de janeiro de 2018 / 04:27

    Boa Noite, tudo bem?
    Poderia me dizer onde eu faço o download do ambiente de teste?
    Obrigado.

    Curtir

    • Automação Fora da Caixa 25 de janeiro de 2018 / 10:30

      Olá! Ao final desse post tem um exercício. No item 2 do exercício tem um link de um arquivo para baixar – não esquecer de alterar a extensão de .ppt para .zip e então descompactar – e os items seguintes do exercício explicam como proceder para configurar o ambiente de teste. Qualquer dúvida, não exite em perguntar 😉

      Curtir

      • MAURICIO SANTOS PEDROSO 26 de janeiro de 2018 / 02:33

        Muito obrigado amigo e desculpe o transtorno.

        Curtir

  6. Gabriel 22 de janeiro de 2019 / 15:01

    Olá, fiz todos os passos corretamente porém no cliente.feature ainda permanece as marcações amarelas. O que pode ser?

    Curtir

    • Cristiano 23 de janeiro de 2019 / 20:12

      Boa noite!

      Desculpe a demora em responder. Essa semana tem sido corrida pra mim.

      Bom, eu lembro que há um tempo atrás outra pessoa teve o mesmo problema que o teu, e na época tentamos de tudo. Curiosamente, a solução foi fechar o projeto, fechar o Eclipse, e depois reabrir tudo. Magicamente ele identificou os steps.

      Chegou a tentar essa “solução”?

      Curtir

      • Gabriel 24 de janeiro de 2019 / 12:09

        Resolvido! Obrigado….

        Curtir

  7. Michael Lima 29 de janeiro de 2019 / 00:33

    Olá, também estou com problemas relacionados ao criar o arquivo feature. Nele não aparece o template descrito na aula. Já fiz todos os procedimentos dos comentários, deletei a pasta m2, até exclui o eclipse e o reinstalei… conhece alguma possível solução?

    Curtir

    • Michael Lima 29 de janeiro de 2019 / 18:26

      Para registro de outros casos semelhantes a meu, cujo toda a instalação ocorreu sem problemas mas o arquivo .feature quando não cria o template e nem altera as cores. O passo de correção é clicar com o botão direito no arquivo .feature> open With> Other> Editor (com o ícone do Cucumber).

      Curtir

      • Cristiano 29 de janeiro de 2019 / 22:13

        Boa noite! Muito obrigado por postar a solução encontrada! 🙂

        Eu realmente não saberia identificar o porque desse problema que tu teve, pois sempre que eu criei o arquivo .feature seguindo aqueles passos descritos na aula, ele aparecia com o template.

        Curtir

  8. Cristiano Gaspar 15 de maio de 2019 / 12:21

    Hoje fiz os passos mas continuo com erros na importação o código do ClienteTeste.java
    @RunWith(Cucumber.class)
    Aqui o Cucumber.class fica com erros , e ja importei cfe abaixo:

    import org.junit.runner.RunWith;
    import cucumber.api.CucumberOptions;
    import cucumber.api.junit.Cucumber;

    A mensagem da lampada é > Type mismatch: cannot convert from Class to Class

    Alterei para isso mas não corrige o que eu posso fazer??

    Curtir

    • Cristiano 15 de maio de 2019 / 13:20

      Boa tarde!

      Tu poderia colar aqui o código dessa tua classe, e também todo o código do teu arquivo pom.xml (aquela parte que mostra toda a estrutura xml)?

      Curtir

  9. Cristiano Gaspar 15 de maio de 2019 / 15:16

    Faltou um pedaço da expressão de sugestão do eclipse:

    Type mismatch: cannot convert from Class to Class

    Ao aceitar a importação do: import org.junit.runner.Runner;
    A expressão muda de
    Para: @RunWith((Class) Cucumber.class)

    Mas todo este código continua com erro : (Class) Cucumber.class)

    Curtir

    • Cristiano Gaspar 15 de maio de 2019 / 15:22

      Classe AtivarTeste.java

      package auto_cucumber;

      import org.junit.runner.RunWith;
      import cucumber.api.CucumberOptions;
      import cucumber.api.junit.Cucumber;

      @RunWith(Cucumber.class)
      @CucumberOptions(features = “src/main/java/auto_cucumber/Ativar.feature”,
      glue = { “” }, monochrome = true, dryRun = false)

      public class AtivarTest {

      }

      ARQUIVO POM.XML

      4.0.0
      br.com.dcg.cucumber
      auto_cucumber
      0.0.1-SNAPSHOT

      info.cukes
      cucumber-java
      1.2.5

      org.seleniumhq.selenium
      selenium-java
      3.141.59

      io.cucumber
      cucumber-junit
      3.0.2
      test

      Curtir

    • Cristiano 15 de maio de 2019 / 16:01

      Olhei tua classe, e vi que ela está como

      public @interface Cucumber {

      }

      Não entendi o porque do “@interface” ali, mas o fato é que quando eu mudei de “Cucumber” para “Cucumbers” e renomeei o arquivo da classe java também para “Cucumbers”, o erro não aconteceu mais:

      public @interface Cucumbers {

      }

      Pelo que eu vi, acho que dá conflito se tu tiver uma classe com o nome “Cucumber” que utilize o “Cucumber.class”.

      Experimenta renomear a classe para algo diferente e vê se o problema persiste. Aqui resolveu:

      public class Cucumbers {

      }

      Curtido por 1 pessoa

    • Adriana 4 de janeiro de 2021 / 12:23

      Cristiano , o meu projeto não está dando certo. Não estou conseguindo acessar esse link no drive do google, para baixar o projeto. Verificar onde estou errando. Por gentileza , disponibilizar o projeto.Obrigada.

      Curtir

      • Cristiano 4 de janeiro de 2021 / 19:34

        Boa noite! Tudo bem? O que exatamente não está funcionando no teu projeto? Até qual passo tu conseguiu executar do exercício? Consegue passar mais detalhes?

        Também tentei baixar o projeto do Cristiano Gaspar ali, mas parece que ele já o deletou!

        Curtir

      • Adriana 5 de janeiro de 2021 / 09:22

        Cristiano, consegui fazer rodar o cenário. Porém não está logando . Está apresentando esse erro : java.lang.NullPointerException: Cannot invoke “org.openqa.selenium.WebElement.sendKeys(java.lang.CharSequence[])” because “this.login” is null
        at foradacaixa.LoginPage.efetuarLogin(LoginPage.java:7)
        at foradacaixa.ClienteSteps.efetuei_login_no_sistema(ClienteSteps.java:14)
        at ?.Dado efetuei login no sistema(src/test/java/Cliente.feature:11)

        Se puder me passar o seu e-mail.

        Curtir

      • Adriana 5 de janeiro de 2021 / 13:59

        Cristiano, desconsiderar minha observação : 5 de janeiro de 2021 / 09:22 – Consegui resolver.Obrigada.

        Curtir

  10. Wilson 3 de março de 2020 / 15:44

    Olá, boa tarde ! primeiramente gostaria de parabenizar pelo conteúdo do blog ta muito massa e estou aprendendo muito, esta muito bem explicado !!! , porém gostaria de tirar uma dúvida para reproduzir a aula de forma correta gostaria de saber onde, ou como posso entrar o no site de exemplo ” A fantastica fábrica de guarda-chuvas” para que eu possa mapear os elementos da tela poderiam me ajudar por favor ?

    Curtir

    • Cristiano 4 de março de 2020 / 11:56

      Bom dia! Muito obrigado! 🙂

      Bom, esse “sisteminha” da fábrica de guarda-chuvas tu baixa ele ali no final do artigo, no exercício descrito ali. É um .zip (que eu nomeei pra .ppt pra eu poder subir no wordpress) com instruções de como utilizar. Mais instruções tu vê ali na descrição do exercício! 😉

      Qualquer dúvida, só postar aqui!

      Curtir

  11. Isabela Isis 14 de abril de 2020 / 15:40

    Por onde eu tenho acesso ao programa?

    Curtir

    • Cristiano 15 de abril de 2020 / 11:27

      Bom dia!

      Esse “sisteminha” da fábrica de guarda-chuvas tu baixa ele ali no final do artigo, no exercício descrito ali. É um .zip (que eu nomeei pra .ppt pra eu poder subir no wordpress) com instruções de como utilizar. Mais instruções tu vê ali na descrição do exercício! 😉

      Curtir

  12. Francisco Ferreira 9 de fevereiro de 2021 / 19:00

    Boa Noite. Um excelente material. Gostei bastante.
    Estou com um problema. Não estou conseguindo identificar o elemento. Consigo acessar a Page.java, mas sempre da Nullpointer na mesma linha.

    Steps.java

    @And(“acessar a tela”)
    public void acessarTela() {
    TelaPage telaPage= new TelaPage();
    telaPage.efetuarLogin();

    Page.java

    public void efetuarLogin() {

    driver.findElement(Campo_Login).sendKeys(“admin”);
    }

    Map.java

    public static By Campo_Login = By.cssSelector(“.tableinlayer > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(1) > input:nth-child(1)”);

    Está sempre dado problema na linha do “Page.java”. Já tentei vários meios, até o descrito nesse tutorial.

    Fiz o teste inserindo o driver.findElement tudo na Steps.java e funciona.
    Ele consegue identificar o elemento e escrever “Admin”. Mas usando essa separação em steps, Page e Map eu não estou conseguindo 😦

    Curtir

    • Cristiano 9 de fevereiro de 2021 / 20:37

      Boa noite! Bem vindo ao blog!

      Fiquei em dúvida ali no teu código. Só pra eu me situar melhor, preciso perguntar: tu está seguindo o tutorial do blog, ou tá fazendo outros exercícios de outras fontes? Pergunto pois tu faz a identificação do teu ‘campo_login’ por cssSelector, sendo que o login eu comento na aula 3 (que é a aula seguinte a esta) onde eu só chamo o id dele, sem uso de cssSelector. Além disso, o modo como tu declara a variável ‘Campo_Login’ é diferente do que eu tenho feito nessa sequência de aulas.

      Outra coisa que me chamou a atenção é o teu sendkeys(“admin”), pois no blog eu só utilizo o ‘john’ e o ‘paul’ para fazer login.

      Se teu código é de um exercício diferente do blog, fica meio difícil de eu conseguir ajudar, pois podem ser n coisas que estão causando o nullpointer.

      Mas dando um ‘chute no escuro’ com base somente no código que tu colou ali, eu vejo que na classe map tu definiu um objeto com nome ‘Campo_Login’. Sendo assim, na classe page, tu deveria chamar esse objeto diretamente, como na linha abaixo:

      Campo_Login.sendKeys(“admin”);

      Em outras palavras: tu não precisaria fazer um driver.findElement dado que tu já tem o objeto definido, bastaria chamar o objeto e mandar um sendKeys nele.

      Espero ter ajudado.

      Curtir

      • Francisco Ferreira 10 de fevereiro de 2021 / 10:20

        Olá Cristiano. Consegui resolver. Fui precipitado e não tinha lido a aula 3. Depois que estudei lá, fiz as modificações que você informou e o teste funcionou. Muito obrigado 🙂

        Mais uma vez, excelente tutorial. Material muito rico e bem explicado. Muito legal esse passo a passo, informando o que é cada erro e suas correções.

        Abraço.

        Curtir

  13. Francinaldo 13 de abril de 2022 / 16:47

    mestre eu não consigo baixar o arquivo versao-2.ppt e renomeie ele para “versao2.zip” e extraia. Ele é o nosso sistema;

    Curtir

      • Fabricio 3 de novembro de 2022 / 14:31

        Cristiano, ainda tem aulas sobre TestComplete? Eu vi algumas aqui, estou precisando de uma ferramenta para automação delphi

        Curtir

      • Cristiano 3 de novembro de 2022 / 20:53

        Boa noite! Tenho somente aquela sequência de 15 aulas do TestComplete. São aquelas disponíveis na página inicial do blog.

        Curtir

Deixe um comentário