3 – Iniciando um Projeto no Selenium e Cucumber – Parte II

Prosseguindo com a aula passada, continuaremos a “preencher” os métodos restantes da classe “ClienteSteps.java”:

s92

Começaremos pelo segundo Step mostrado na imagem acima. Poderíamos criar um método na “ClientePage.java” responsável pelo acesso do menu “Cliente >> Inserir”, ou então criar um novo conjunto de classes (MenusPage.java, MenusElementMap.java) onde agruparíamos todos os métodos relacionados a navegação de menus. A primeira opção evita de criar mais classes, mas a segunda opção permite uma melhor organização dos métodos (teríamos todos os métodos e WebElements de menus num lugar só).

Seguiremos a segunda opção:

s93

As classes acima foram criadas seguindo a mesma lógica de criação das classes “ClientePage.java” e “ClienteElementMap.java” (“MenusPage.java” extende “MenusElementMap.java”, não esqueça disso).

Agora é hora de mapear os elementos de menus.

s94

A imagem acima mostra a obtenção das informações para o menu “Clientes”. Observe que não há propriedade “id” ou propriedade “name” para ele. E agora?

Nesse caso é preciso usar xpath, e usar algumas coisinhas mais na declaração do WebElement. Observando a imagem acima, vemos que temos um objeto do tipo “a” (um link) com o texto “Clientes”. Usaremos essa informação disponível:

s95

Na imagem acima temos um “@FindBy(xpath = “//a[text()=’Clientes’]”)” sobre a declaração do elemento. O que é isso? Basicamente ele diz que esse elemento deverá ser encontrado (“FindBy”) através do xpath informado (xpath = “//a[text()=’Clientes’]”). Esse xpath está dizendo basicamente o seguinte: “todos os links cujo texto seja igual a “Clientes””.

Pergunta: “Como você chegou a esse xpath? Como você sabia como montar o xpath? ”
Resposta: “Pesquisando”

Eu não domino xpath. Se tenho uma necessidade de algo, eu pesquiso pela solução 🙂

Sobre o “@FindBy”, este é um recurso do Selenium. Se você pesquisar na documentação do Selenium irá encontrar muitas informações a respeito.

Na imagem acima, o “@FindBy” ainda apresenta um erro. Isso se deve ao fato de ainda não ter sido realizado o “import” devido. A imagem abaixo ilustra o import a ser utilizado:

s96

Prosseguindo com o mapeamento do menu, as imagens abaixo ilustram as informações disponíveis do submenu “Inserir”:

s97

s98

Observe que nesse link temos um valor de “href” (“inserircliente_identificacao.html”). Podemos utilizar essa informação, que é única na página, para elaborarmos o “FindBy”. Abaixo tem-se o resultado obtido:

s99

Dessa vez, ao invés de usarmos xpath, utilizamos o css.

Pergunta: Poderíamos ter utilizado a mesma ideia aplicada no menu “Cliente”, com text()=’Inserir’?

Resposta: Sim, poderíamos! Contudo o link “Inserir” não é único na página, o que poderia causar algum conflito com o caminho de menu “Pedidos >> Inserir” que possui um submenu “Inserir” igual ao submenu “Inserir” do caminho “Clientes >> Inserir”. Em outras palavras: o “//a[text()=’Inserir’]” encontraria os dois objetos. Essa foi a razão de termos utilizado o “href”.

Mapeados os objetos do menu “Cliente >> Inserir”, é hora de criar o método que fará o caminhamento desse menu. Ele será feito na classe “MenusPage.java”:

s100

Voltando à classe “ClienteSteps.java”, tem-se:

s101

O método está pronto. Tem-se agora o método “efetuarLogin”. Para o login, criaremos as classes “LoginPage.java” e “LoginElementMap.java”.

s102

Abaixo tem-se a classe “LoginElementMap.java” com os elementos de login já adicionados:

s103

Abaixo tem-se a classe “LoginPage.java” com o método “efetuarLogin” já criado:

s104

Retornando à classe “ClienteSteps.java”, o método “efetuarLogin” dela fica:

s105

Nosso cenário está quase pronto. Vamos rodar o teste para ver se funciona. Para isso, clique com o botão direito sobre a classe “ClienteTest.java” e acesse o menu “Run As  >> Junit Test”:

s106

Abaixo o resultado da execução:

s107

s108

Tudo escangalhado! Nada deu certo! Porque isso? Há um bocado de razões pelo teste não ter funcionado. Mas “vamos por partes”, como diria o saudoso Jack.

Observe que tentamos efetuar o login no sistema SEM abrir o browser E acessar a página inicial do sistema!! Isso mesmo, não temos ainda o código responsável por abrir o browser e acessar a página inicial do sistema! Essa lógica deve ser chamada antes da execução do cenário de teste: [Abrir o Browser] >> [acessar página inicial] >> [cenário de teste]

Utilizando a ferramenta chamada “imaginação”, imagine que teremos diversos cenários de testes (cadastros, consultas, pesquisas de clientes, pedidos, etc). Cada um desses cenários possui como PRÉ-REQUISITO a abertura do browser e acesso à página inicial do sistema, para só então termos a execução dos cenários propriamente dito. Ou seja, temos algumas coisas a serem feitas ANTES de cada cenário, comum a TODOS os cenários. Para situações como esta utilizamos a anotação @Before, cujo método que a possui será executado antes de cada cenário. É uma boa prática colocar essa anotação (assim como outras específicas) em uma classe à parte, chamada “TestRule”. Maiores informações podem ser obtidas no link abaixo:

http://junit.org/junit4/javadoc/4.12/org/junit/rules/TestRule.html

Abaixo tem-se a criação de uma classe nova, chamada “TestRule.java”, já com o método criado:

s109

A anotação apresenta erro pois ainda não foi feito o import:

s110

Após o import realizado:

s111

OK! Classe pronta. Mas o que queremos fazer antes de cada cenário? Queremos abrir o browser e acessar a página inicial do sistema.

Para abrir o Chrome, precisamos utilizar o objeto WebDriver. Para isso, declaramos uma variável estática do WebDriver, conforme ilustrado abaixo:

s112

Realizando o import correto:

s113

s114

Abaixo o código necessário para iniciar o driver, abrir o browser e acessar a página:

s115

Ainda tem um erro, novamente porque o import ainda não havia sido realizado:

s116

s117

A primeira linha de código indica onde está o executável do Chrome.

A segunda linha de código indica que vamos utilizar o Chrome.

A terceira linha de código indica para abrir a página maximizada.

A quarta linha de código indica o endereço a ser aberto. Nesse caso um caminho local dado que estamos executando localmente o “index.html”.

Agora, como utilizamos essa classe nos nossos cenários? Simples: basta executar a classe “ClienteTest.java”, clicando com o botão direito sobre ela e acessando o menu “Run As >> Junit Test”:

s118

Como resultado, foi aberto o Chrome e acessado a página inicial conforme ilustrado abaixo:

s119

Contudo, erros ainda apareceram:

s120

s121

Tivemos um “NullPointerException” na linha 6 da classe “LoginPage” dentro do método “efetuarLogin”. Ao clicar sobre o link “LoginPage.java: 6” mostrado no print acima, somos direcionados ao ponto do erro:

s122

O objeto “login” estava nulo no momento da execução. Por que isso? Porque não tínhamos inicializado os WebElements ainda. Aliás, em nenhuma das classes eles foram inicializados. Para inicializá-los é preciso criar um construtor em cada uma das classes de sufixo “Page” e dentro deles chamar o método do Selenium chamado “PageFactory”.

Porém, antes disso, vamos adicionar mais um método na classe “TestRule.java” pois iremos utilizá-la no “PageFactory”:

s123

Basicamente é um método estático que retorna o objeto WebDriver da classe “TestRule.java”. É preciso criar esse método pois ele será utilizado nos métodos construtores.

Feito isso, iremos criar métodos construtores nas classes de sufixo “Page”:

s124

s125

s126

Os construtores fazem uma chamada ao método “initElements” (inicializar os elementos) recebendo em um dos parâmetros o objeto driver da classe “TestRule.java”.

Criados os construtores, agora é hora de executar o teste novamente:

s127

E o resultado é:

s128

Falhou!!! Tá difícil, hein!!! O que aconteceu? Vamos analisar o log:

s129

s130

Basicamente o que temos no log é o seguinte:

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”//a[text()=’Clientes’]”}

Ele diz que não conseguiu encontrar o elemento através do xpath de “//a[text()=’Clientes’]”. Esse é o menu Clientes! Mas em que ponto exatamente houve a falha do teste? Novamente, observe no log do console:

s131

Ao clicar sobre o link “(MenusPage.java:14)” mostrado na imagem acima, somos direcionados para o exato ponto onde tivemos a falha da execução:

s132

Basicamente, o Selenium não conseguiu clicar sobre o menu porque segundo ele o elemento não existia. Então vamos olhar a tela do sistema, no momento onde ela parou: O sistema não tinha logado!!!!!!

s133

s134

O sistema simplesmente não efetuou o login! Mas qual a razão disso?

Um dos objetivos desse blog é mostrar meus acertos e meus erros. Pois bem! Esse problema foi um “erro” meu! Na verdade, é mais um fato novo que eu aprendi durante a elaboração dessa aula. Eu passei praticamente 2 dias tentando descobrir o porquê desse erro, sendo que quando eu executava manualmente o sistema o login era efetuado sem erros (e no TestComplete nunca tive esse problema).

Depois de muito pesquisar, descobri a causa. Como esse sistema de treinamento utiliza uma base de dados Web SQL Database criada no Chrome, o Selenium não carregava essa base ao iniciar o Chrome. Então como ele não encontrava a tabela “USUARIO” (onde são guardadas as informações de logins e senhas) estourava uma exceção “por debaixo dos panos” e o sistema travava na tela de login.

Segue então a solução: precisei colocar mais algumas linhas de código lá na classe “TestRule.java”, no método “beforeCenario”:

s135

s136

O que foi feito é o seguinte: como as informações de base de dados ficam nos dados de usuário do navegador, era preciso dizer ao Selenium para carregar essas informações ao abrir o Chrome. É isso o que as duas linhas de código fazem. Criam um objeto do tipo “ChromeOptions” e nele é explicitado para carregar os dados do usuário do Chrome. Em seguida é passado por parâmetro no driver (vide a seta vermelha).

O caminho “C:/Users/Windows 8/AppData/Local/Google/Chrome/User Data” indica onde estão essas informações. Esse é um caminho padrão do Chrome, bastando mudar somente o usuário. Nesse exemplo o nome do usuário é “Windows 8”. Em sua máquina deverá ser colocado o nome do usuário logado nela.

Pergunta: “Porque fazer toda essa “enrolação” do problema? Porque já não colocou o método correto logo de início? ”.

Resposta: “Para mostrar que nunca devemos perder a humildade! ”.

Réplica da Pergunta: “Bateu a cabeça? O que isso tem a ver com o problema? ”.

Falo de humildade aqui no sentido de admitir que todo dia estamos aprendendo algo novo, e que jamais devemos dizer ou convencer a si próprio de coisas como “Eu domino a tecnologia XYZ! ”, “Eu sei bastante sobre o assunto, tenho X anos de experiência! ”.

Tenha em mente que sempre há a necessidade de aprender algo novo! Essa opção do Chrome Options, por exemplo, eu aprendi enquanto escrevia essa aula. Passei uns dois dias tentando descobrir qual era o problema do sistema não logar durante a execução automatizada. Enfim, tenha em mente que ao trabalharmos com automação de testes, sempre iremos aprender algo novo.

IMPORTANTE: devido a essa peculiaridade do sistema de treinamento utilizar uma base de dados e termos que carregar as informações de usuário do Google Chrome, é importante certificar-se que o Google Chrome não possui páginas abertas no momento da execução do teste, do contrário o Selenium se perderá e o teste irá falhar miseravelmente.

Efetuado o ajuste, vamos agora executar novamente o teste (já com todas as páginas do Google Chrome fechadas):

s137

Abaixo temos o resultado:

s138

s139

Observe que dessa vez o sistema logou, mas o teste não conseguiu avançar a partir dali. Olhando o log do Console tem-se a seguinte informação:

s140

s141

s142

Temos a informação de que não foi possível encontrar o elemento com xpath “//a[text()=’Clientes’]”, que nada mais é o nosso menu “Clientes”. Mas ele apareceu na tela, e o xpath está correto. O que aconteceu então?

Se você não caiu de “paraquedas” aqui nas aulas de Selenium, ou seja, acompanhou as aulas de TestComplete, já tem uma ideia do que fazer: interpretar o que aconteceu!

Se o elemento está sendo exibido corretamente na tela, e não foi encontrado durante a execução, podemos levantar a hipótese: o elemento existia NO MOMENTO em que o Selenium procurou por ele? Em outras palavras: no instante que o elemento foi requisitado, ele já estava carregado na tela ou não?

Assim como no TestComplete temos implicitamente o aguardo por alguns segundos do elemento aparecer antes do teste falhar (nas propriedades do projeto se configura esse tempo), o mesmo temos no Selenium! Contudo, é preciso digitar essa linha de código, o que NÃO HAVÍAMOS FEITO ANTES. Para isso, basta adicionar a linha abaixo lá no método “beforCenario” da classe TestRule:

s143

O que essa linha de código faz é o seguinte: ela diz para o driver aguardar por qualquer elemento aparecer na tela por até 10 segundos.

Executando novamente o teste para testar a hipótese:

s144

s145

s146

s147

Olhando a sequência de imagens acima, nota-se que agora a falha foi sobre o submenu. Porque? Porque não encontrou o submenu, sendo que encontrou o menu e havíamos setado um implicity wait de 10 segundos?

Novamente, um pouco de interpretação aqui: o funcionamento do menu desse nosso sistema de treino funciona posicionando o mouse SOBRE o menu para então o SUBMENU APARECER e então ser clicado. Embora o “click” seja efetuado, ele acaba não sendo suficiente para o submenu aparecer.

Para situações como essa é bastante comum utilizar o Actions, conforme ilustrado a seguir (não esquecer de realizar o import apropriado conforme ilustrado na segunda imagem abaixo):

s148

s149

Resumidamente o que o esse bloco de código faz é criar um objeto “Actions” utilizando o driver da nossa classe “TestRule”, seta os movimentos sobre o menu e submenu (linhas 17 e 18) e “constrói” um clique sobre o submenu após mover-se sobre o menu e o submenu.

Executando novamente o teste, tem-se o seguinte resultado:

s150

Parece que executou perfeitamente o step que faz o acesso ao menu e então partiu para o terceiro step onde falhou. Contudo, ao olhar para a tela do browser:

s151

Como assim? Diz que o acesso ao menu foi feito com sucesso, mas sequer acessou a página de dados de identificação???

Lembram-se que teoria é uma coisa e prática é outra? Pois bem, o objeto utilizado acima (Actions) é um dos mais recomendados para se utilizar em caminhamento de menus. Contudo, há sempre exceções, como no exemplo do nosso teste. Aqui simplesmente não funcionou! Como não deu certo, vamos partir para outro caminho: Robot! Vamos utilizar esse objeto para tentar realizar esse caminhamento de menu! O que ele faz é basicamente o seguinte: move o ponteiro do mouse para algum lugar da tela. Nosso objetivo será mover esse ponteiro do mouse para cima do menu para assim aparecer o submenu desejado.

Abaixo foi criado um método privado na classe “MenusPage.java” para realizar esse trabalho:

s152

O que o método apresentado acima faz é simplesmente mover o ponteiro do mouse para alguma posição da tela. No caso essa posição se dá através de algum WebElement recebido por parâmetro, ou seja, o elemento no qual desejamos posicionar o ponteiro do mouse. Abaixo uma breve explicação sobre esse método:

// obtém a altura da página interna
long intAlturaPagina = (Long) ((JavascriptExecutor) TestRule.getDriver())                                                            .executeScript(“return document.documentElement.clientHeight”);

O que ele faz é pegar a altura da parte interna do browser (aquela parte onde ficam os elementos da página) utilizando um script java para isso, e então guarda o valor em uma variável do tipo long.

// obtém a altura da janela (browser)
int intAlturaJanela = TestRule.getDriver().manage().window().getSize().height;

Faz quase a mesma coisa que o código anterior, a diferença é que pega a altura do browser como um todo, incluindo a barra de ferramentas do browser, e não somente a parte interna da página exibida no browser.

// obtém a diferença de altura entre janela e página
int intDiferencaAltura = intAlturaJanela – (int) intAlturaPagina;

Guarda em uma variável a diferença da altura entre a janela do browser e a altura da página interna.

// obtém as coordenadas relativas do objeto
int intCoordXElemento = elemento.getLocation().getX();
int intCoordYElemento = elemento.getLocation().getY();

Obtém as coordenadas x e y do objeto desejado:

// move para a posição esperada do objeto
int intCoordXEsperada = intCoordXElemento;
int intCoordYEsperada = intCoordYElemento + intDiferencaAltura;
Robot robot = new Robot();
robot.mouseMove(intCoordXEsperada, intCoordYEsperada);

Aqui definimos as coordenadas x e y onde devemos posicionar o ponteiro do mouse. A posição x é a mesma posição x do objeto. Já a posição y é definida como a soma da posição y do elemento mais a diferença de altura entre janela e página.

Em seguida é criado um objeto “Robot” e chamado o método “mouseMove” dele passando as coordenadas esperadas.

Pergunta: “Porque a coordenada y não poderia ser simplesmente a posição y do objeto? ”

Resposta: “Porque a posição y do objeto é obtida em relação à página (mais interna, menor), enquanto que o objeto Robot precisa da posição y em relação à janela (mais externa, maior). Simplesmente tivemos que fazer um ajuste de coordenadas. ”

Elaborado o método privado, vamos chamá-lo dentro do método “acessarMenuClientesInserir” e passando por parâmetro o objeto “menuInserir”, conforme ilustrado abaixo:

s153

“E lá vamos nós” executar novamente o teste:

s154

s155

FINALMENTE FUNCIONOU!

O caminho de menu foi feito, os dados das páginas foram preenchidos e o cadastro foi realizado com sucesso!!!

Nesse momento talvez esteja se perguntado do porquê não ter sido apresentado logo o objeto “Robot”, do porquê de ter sido feita toda essa enrolação até ter chegado a ele.

Com essa “enrolação” foi possível apresentar outros meios de realizar um caminhamento de menu no Selenium (utilizando Actions) e mostrar que nem tudo tem uma receita pronta: o mais importante é você ter consciência de que cada sistema tem uma peculiaridade, um comportamento diferente, o que sempre vai te obrigar a aprender algo novo em cada situação.

O objetivo desse blog é compartilhar conhecimento e experiências pessoais, então aqui vai mais uma:

Esse objeto “Robot” por exemplo, eu aprendi a utilizar ele enquanto escrevia essa aula. Sim, imagina a minha cara quando descobri que simples cliques sobre os menus/submenus não funcionariam, assim como o objeto “Actions”? Simplesmente perdi uns 2 dias entre compreensão do problema e a busca da solução.

Enfim, o recado principal da aula de hoje é: seja persistente! Haverá momentos que você poderá ficar trancado em algum problema, então é preciso ter calma para compreender o problema e buscar a solução.

OBS: Vale destacar que essa aula e aula anterior são as mais difíceis dessa “2ª Temporada” de aulas. Sendo assim as demais aulas que estão por vir serão muito mais fáceis 🙂

Na próxima aula, veremos uma biblioteca bastante interessante para gerar relatórios (algo equivalente ao relatório do TestComplete, mas para Selenium): o ExtentReports! Até lá! 😉

EXERCÍCIO: o objeto desse exercício é fixar conhecimentos relacionados a caminhamentos de menus com o uso de objetos Action e Robot, bem como a interpretar os resultados da execução de testes quando estes falham. Para isso:

  1. Crie as classes “MenusPage.java” e “MenusElementMap.java”;
  2. Mapeie os objetos de menu e submenu relativos ao caminho de menu “Inserir >> Clientes” conforme apresentado na aula;
  3. Crie as classes “LoginPage.java” e “LoginElementMap.java”;
  4. Mapeie os objetos de login conforme apresentado na aula;
  5. Na classe “ClienteSteps.java”, desenvolva o método “acessarMenuClientesInserir()”, fazendo a chamada ao método correspondente na classe “MenusPage.java”;
  6. Na classe “ClienteSteps.java”, desenvolva o método “efetuarLogin()”, fazendo a chamada ao método correspondente na classe “LoginPage.java”;
  7. Crie a classe “TestRule.java” e adicione o método “beforeCenario()” com as anotações e imports necessários conforme visto na aula, bem como a variável de classe “private static WebDriver driver;” ;
  8. Ainda na classe “TestRule.java”, desenvolva o método “beforeCenario()”, adicionando as linhas de código apresentadas na aula, incluindo o código referente ao implicitWait e o objeto ChromeOptions. Esse método é o responsável por abrir o browser e navegar para a página inicial, bem como setar opções do driver;
  9. Ainda na classe “TestRule.java”, crie e desenvolva o método “getDriver()” conforme apresentado na aula. Ele irá retornar o objeto driver da classe;
  10. Em todas as classes de sufixo “Page”, adicione seus respectivos construtores, e dentro deles coloque o código de inicialização dos elementos (PageFactory.initElements(TestRule.getDriver(), this);) ;
  11. De volta à classe “MenusPage.java”, desenvolva o método “acessarMenuClientesInserir()” conforme visto em aula para a situação em que irá utilizar o objeto ROBOT, e utilizando o método privado que move o mouse sobre o elemento. Não esqueça de copiar o método privado fornecido abaixo para dentro da classe, e realizar os imports necessários;
  12. De volta à classe “LoginPage.java”, desenvolva o método “efetuarLogin()”;
  13. Execute o teste com o uso da classe “ClienteTests.java” e veja se funcionou. Faltou algo? Faltou alguma implementação? Investigue, revise seu código… Lembre-se de fechar todos os browsers antes de cada execução;
  14. Encontrando alguma dificuldade em executar, escreva nos comentários. Farei o possível para ajudá-lo! 😉

OBS: É importante ter seu código funcionando corretamente ao final dessa aula pois ele será utilizado na próxima aula.

 

EXTRA: código do método privado “moverMouseSobreElemento(Weblement elemento)”

private void moverMouseSobreElemento(WebElement elemento) throws Exception {
// obtém a altura da página interna
long intAlturaPagina = (Long) ((JavascriptExecutor) TestRule.getDriver())
.executeScript(“return document.documentElement.clientHeight”);

// obtém a altura da janela (browser)
int intAlturaJanela = TestRule.getDriver().manage().window().getSize().height;

// obtém a diferença de altura entre janela e página
int intDiferencaAltura = intAlturaJanela – (int) intAlturaPagina;

// obtém as coordenadas relativas do objeto
int intCoordXElemento = elemento.getLocation().getX();
int intCoordYElemento = elemento.getLocation().getY();

// move para a posição esperada do objeto
int intCoordXEsperada = intCoordXElemento;
int intCoordYEsperada = intCoordYElemento + intDiferencaAltura;
Robot robot = new Robot();
robot.mouseMove(intCoordXEsperada, intCoordYEsperada);

}

76 comentários sobre “3 – Iniciando um Projeto no Selenium e Cucumber – Parte II

  1. Adriano 22 de maio de 2017 / 17:42

    Prezado,

    Parabéns pelo post. Tenho uma dúvida, a class TestRule tem a mesma função que eu escrever dentro de um @Test da JUnit “WebElement tipo = driver.findElement(By.id(“”));” ??? Pq como ele encontra os elementos das páginas, sem ter setado por qual item buscar do código HTML, como foi feito na class MenusElementMap, onde é informado através do “xpath” ou “css”:

    @FindBy(xpath = “//a[text()=’Clientes’]”)
    protected WebElement menuClientes;

    @FindBy(css = “[href=’inserircliente_identificacao.html’]”)
    protected WebElement submenuClientesInserir;

    Revisando os códigos, não vi referência dessas nas classes ClienteElementMap e nem na LoginElementMap. Somente manipulando o tipo de WebElement, seja para click(), ou sendKeys(), nas classes de sufixo “Page”.

    Curtir

    • Automação Fora da Caixa 22 de maio de 2017 / 18:43

      Boa noite!

      Acho que não entendi muito bem as tuas dúvidas. Vou tentar responder pelo que eu acho que entendi. Se eu não entendi certo e respondi outra coisa, me pergunte novamente 😉

      Eu estou utilizando a classe TestRule basicamente para colocar alguns objetos/métodos comuns aos cenários.

      Por exemplo, a inicialização/obtenção de um objeto driver. Foi criado um objeto driver e um método para pegar esse objeto:
      public static WebDriver getDriver() {
      return driver;
      }

      Se você reparar no construtor das classes de sufixo Page, é chamado o método PageFactory.initElements onde um dos parâmetros é o objeto acima (TestRule.getDriver()).

      O que esse método da PageFactory do Selenium faz é inicializar todos aqueles elementos declarados nas classes de sufixo ElementMap. Lembre-se que a classe de sufixo Page “extende” a classe de sufixo ElementMap, o que permite enxergar todos aqueles WebElements declarados na ElementMap, e então “inicializá-los”. É esse PageFactory.initElements que permite os objetos serem encontrados. Se você comentar essa linha de código e rodar o teste, nenhum WebElement será encontrado, e teu teste irá mostrar um erro de objeto nulo para os WebElements da classe de sufixo ElementMap.

      Sobre o “WebElement tipo = driver.findElement(By.id(“”));” que você comentou: Se você fizer algo como “WebElement tipo = TestRule.getDriver.findElement(By.id(“”));” em algum método da classe de sufixo Page, você poderá sim obter esse WebElement da página. Inclusive por ali você consegue obter outros métodos do objeto driver (como o findElements, que retorna uma lista de elementos).

      OBS: também pode-se simplificar a relação entre as classes de sufixos “Page” e “ElementMap” suprimindo a segunda, e declarando os WebElements dentro da classe de sufixo Page. Nesse caso tem-se uma única classe (a de sufixo Page) com a declaração dos objetos e os métodos da página a que ela se refere. Eu estou utilizando essa abordagem de separação de “Page” e “ElementMap” apenas para ilustrar outras possibilidades.

      Curtir

  2. Adriano 23 de maio de 2017 / 09:25

    Entendi. Então pelo método da PageFactory em cada classe de sufixo “Page” ele localiza todos os elementos da página, substituindo a utilização do “driver.findElements”, correto? E compreendo a utilização do ElementMap e da Page para organizar e separar o código para ficar mais compreensivel e legivel, pois como vc disse, colocando pelo driver.findElement não precisava da classe ElementMap. Mas ficou uma dúvida com relação a isso, como o método da PageFactory, consegue identificar que, por exemplo, na classe LoginPage, no método “efetuarLogin()”, os elementos “login”, “senha” e “btnLogin” referente aos “WebElement” da classe “LoginElementMap”, se refere aos campos na página de Login: Login, Senha e o botão Efetuar Login? Fui inspecionar essa página pelo código HTML e verifiquei que, os nomes das variaveis passadas na classe “LoginElementMap” tem a mesma nomenclatura dos “IDs” de cada um desses campos da página, Login, Senha e o botão Efetuar Login, isso foi por acaso, ou temos que utilizar mesma nomenclatura para que o PageFactory identifique o elemento que você obter e executar uma ação?

    Curtir

    • Automação Fora da Caixa 23 de maio de 2017 / 13:56

      Exatamente isso! O PageFactory “faz para nós” o driver.findElement. Mas para que ele consiga fazer isso, os nossos webElements na classe ElementMap devem ser declarados com nomes idênticos aos id’s/name’s dos elementos, do contrário ele não acha. E nas situações em que o elemento que desejamos utilizar não possui id ou name, utilizamos aquela anotação @FindBy, daí o Selenium vai procurar o elemento de acordo com o critério informado ali no @FindBy (xpath, css)

      Curtir

      • Adriano Almeida 24 de maio de 2017 / 10:27

        Entendi, muito bom. Sucesso…parabéns mais uma vez pelo blog e por compartilhar esse conhecimento. Obrigado.

        Curtir

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

    Outra coisa que acabei esquecendo de perguntar, no método “acessarMenuClientesInserir()” vc insere duas informações:

    Actions actions = new Actions (TestRule.getDriver());
    actions.moveToElement(menuClientes);
    actions.moveToElement(submenuClientesInserir);
    actions.click().build().perform();

    e depois antes de rodar o teste e obter com sucesso, segundo bloco de código:

    this.moverMouseSobreElemento(menuClientes);
    submenuClientesInserir.click();

    Deve-se manter ambos os códigos dentro do método ou apenas um deles? Se executo somente o primeiro, o meu código da problema na classe ClientePage, na linha que contém o “fisica.click();”, como se não identifica-se que esse elemento existe ou que no momento da execução não estava sendo exibido, ae talvez tenho que colocar um “wait” ate a exibição do elemento.

    Se executo somente com o segundo bloco de código, ele da erro no “submenuClientesInserir.click();”.

    Se executo com os dois código dentro do método, ele da problema em um dos dois, a depender da ordem em que estejam no método.

    Curtir

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

      São dois blocos de código distintos. Eu tentei mostrar duas abordagens diferentes. Uma utilizando o Actions, e outra utilizando o Robot. Ali no passo 11 do exercício eu comento a utilização do Robot pois ele foi o que funcionou aqui nos meus testes. O Action me causou o mesmo problema que tu teve (bem no ponto da aula onde eu comento “Como assim? Diz que o acesso ao menu foi feito com sucesso, mas sequer acessou a página de dados de identificação???”)

      Curtir

  4. morphell 23 de maio de 2017 / 10:01

    Estou adorando as publicações sobre automação. Algo extremamente necessário nos dias de hoje. Estou aprendendo muito e preciso de uma ajuda.
    Fiz tudo de ponta a ponta, mas ao rodar a classe ClienteTests.java o Eclipse não gera erro, mas não roda o teste e o console apresenta a mensagem:

    ClienteTests[JUnit]C:\Program Files\Java\jdk1.8.0_91\bin\javaw.exe

    Já pesquisei na Internet mas não achei solução 😦

    Abraços.

    Curtir

    • Automação Fora da Caixa 23 de maio de 2017 / 14:16

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

      Esse comportamento que você descreveu parece aquele comportamento onde ao executar o teste nenhum cenário é encontrado. Reparou se no log do JUnit (aquele do canto superior esquerdo da tela) aparece alguma informação do tipo “0 cenários executados”, “1 cenários executados” ou algo assim?

      A sua classe ClienteTests.java está apontando corretamente para a feature? (Talvez alguma letra trocada/fora de ordem que impeça da feature ser encontrada). A feature está no caminho procurado pela classe ClienteTests? Pergunto isso pois já passei por situações semelhantes a essas, onde era só um detalhezinho que tinha passado batido.

      Curtido por 1 pessoa

  5. Adriano 23 de maio de 2017 / 10:34

    Prezado,

    Executando novamente, coloquei inicialmente na classe ClientePage antes do comando “fisica.click();” os comandos: “WebDriverWait wait = new WebDriverWait(TestRule.getDriver(),20); e wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(“fisica”)));”. Executei o teste de novo, colocando como comentário na classe MenusPage o código: “this.moverMouseSobreElemento(menuClientes);
    submenuClientesInserir.click(); ”

    O mesmo funcionou de boa. Depois coloquei como comentário os códigos: “WebDriverWait wait = new WebDriverWait(TestRule.getDriver(),20); e wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(“fisica”)));” que tinha inserido na classe ClientePage e executei de novo o teste e o mesmo executou com sucesso.

    Depois coloquei como comentário na classe MenusPage todo o método “private void moverMouseSobreElemento(WebElement elemento)” e executei de novo o teste e o mesmo executou com sucesso.

    Não compreendi esse comportamento, pq no seu projeto, estava dando vários erros de visualizar e identificar o submenuClientesInserir e no meu caso, ou na minha maquina, ele esta executando de boa sem precisar do método para moverMouseSobreElemento ?

    Curtir

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

      Essa é uma daquelas situações “místicas” onde o código funciona em uma máquina mas não funciona tão bem na outra. Será que o ponteiro do teu mouse não deu o “acaso” de estar na posição correta? Teria que fazer mais testes pra compreender o porque do comportamento. Mas aqui para mim a utilização do Actions não funcionou, então eu tive que criar o método moverMouseSobreElemento com uso de Robot para funcionar. E optei por mostrar os dois nessa aula a título de ilustração.

      Aproveito pra citar um exemplo real que eu e um colega passamos meses atrás. Na época utilizávamos o HP UFT na automação de uma página web. Lembro que ele desenvolveu um código para varrer uma grid na tela, ler informações e interagir com alguns comboboxes de dentro dessa grid. Na máquina dele executava perfeitamente. Na minha lá no meio da execução o HP UFT “morria”, se fechava e derrubava todo o teste. Até hoje não descobrimos o porque disso 😦

      Curtir

      • Adriano Almeida 24 de maio de 2017 / 11:05

        kkkkkkkkkkk, é complicado essas coisas “místicas” como você mencionou, pior é que muitas vezes mesmo você olhando o código e colocando do mesmo jeito não funciona, ae você copia e cola e o mesmo funciona. Vai saber o que ocorrer por de trás. Mas obrigado mais uma vez pelas informações, é sempre bom realmente ter mais opções para resolver os problemas que encontramos. Irei investigar melhor o porque que funciona sem o Robot e também porque com o Robot ele está parando na linha “submenuClientesInserir.click();”.

        Curtir

  6. Adriano 23 de maio de 2017 / 16:56

    Outra dúvida, existe alguma outra forma de verificar a base de dados sem ser utilizando o “Options”? Que acessa direto o local aonde encontra-se a base de dados no Chrome. Tentei usar a seguência de comandos abaixo, porém mesmo usando o wait ele não está identificando que existe o usuário na base, dando com inválido o usuário e senha:

    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.get(“file:///C:/Users/adriano.monteiro/Documents/Projeto_Maven/Vers%C3 %A3o%202/configurar_bancodedados.html”);

    WebElement btnDados = driver.findElement(By.id(“gerarbanco”));
    btnDados.click();

    WebDriverWait wait = new WebDriverWait(driver, 20);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(“mensagem”)));

    WebElement mensagem = driver.findElement(By.id(“mensagem”));
    assertTrue(mensagem.getText().equals(“Configuração efetuada com sucesso”));

    driver.get(“file:///C:/Users/adriano.monteiro/Documents/Projeto_Maven/Vers%C3%A3o%202/index.html”);

    WebDriverWait wait1= new WebDriverWait(driver, 30);
    wait1.until(ExpectedConditions.visibilityOfElementLocated(By.id(“login”)));

    driver.get(“file:///C:/Users/adriano.monteiro/Documents/Projeto_Maven/Vers%C3%A3o%202/index.html”);

    Curtir

    • Automação Fora da Caixa 23 de maio de 2017 / 19:18

      Eu particularmente não conheço. Por default o driver abre uma página web sem os dados de usuário no navegador. Como aquela base de dados fica nos dados do usuário do browser, é preciso utilizar o Options.

      Se eu entendi teu código, você está tentando “inicializar” a base de dados na execução do teste e então utilizando a mesma página fazer o acesso ao sistema, eliminando a necessidade do Options? É bastante interessante essa abordagem! 🙂

      Fiz uma pesquisa rápida no google e achei algo interessante sobre o driver.get que você está utilizando e o driver.navigate.to que eu utilizo nos testes:

      https://stackoverflow.com/questions/5664808/difference-between-webdriver-get-and-webdriver-navigate

      http://www.seleniumhq.org/docs/03_webdriver.jsp

      Tentou trocar o get pelo navigate.to para verificar se ele consegue encontrar a base? O navigate.to mantém um histórico das páginas, quem sabe ele mantenha também o histórico da base criada no início do teu bloco de código (é um palpite, teríamos que testar para ver se funciona)

      Me mantenha informado se obtiver sucesso 😉

      Curtir

      • Adriano Almeida 24 de maio de 2017 / 11:14

        Exatamente isso que estou tentando fazer, utilizando uma outra abordagem para ver se funciona. Porém ele não esta conseguindo encontrar ainda a base de dados. Irei verificar o navigate.to para ver se funciona e lhe mantenho informado sim. Obrigado mais uma vez..

        Curtir

      • Adriano Almeida 24 de maio de 2017 / 13:00

        Testei usando o navigate.to porém não deu certo…vou dar continuidade no curso, se por acaso nas pesquisas eu achar algo, testo novamente, se não fica-se com essa abordagem utilizando o options mesmo. Brigado

        Curtido por 1 pessoa

  7. Adriano Barreto Monteiro de Almeida 25 de maio de 2017 / 18:23

    Cristiano, me tira uma dúvida, tem como fazermos um outro projeto contendo comandos ou expressões mais complexas de validação automatizadas? Ou esses exemplos desse curso já trabalha basicamente com o que é visto no dia a dia? Obrigado

    Curtir

    • Automação Fora da Caixa 25 de maio de 2017 / 19:47

      Nesse sisteminha de treino eu tentei simular muitas situações que ocorrem no dia a dia. Ele é utilizado também nas aulas de TestComplete e lá eu procurei dar uma enfase em questões teóricas, como interpretação de comportamentos da tela/do sistema e a “replicação” desse comportamento para a ferramenta de automação. Lá tem diversas dicas dentro das aulas. Já aqui nas aulas de Selenium eu procurei ser um pouco mais objetivo para não ficar repetitivo.

      Além da questão que eu vivo “martelando” no blog de “entender o que o sistema faz e como ele se comporta” ANTES de começar a automatizá-lo, outros pontos que eu destacaria e que costumam acontecer no dia a dia são:

      – aquelas situações que nós vivenciamos onde um código não funcionou na minha máquina mas na sua acabou funcionando: isso eventualmente acontece no dia a dia, então sempre é bom pegarmos scripts desenvolvidos numa máquina e tentar rodar em outra;

      – não existe (se existe eu desconheço) ferramenta de automação infalível. Sempre haverá alguma coisa que você tentará automatizar e o modo “recomendado/indicado” para aquela situação não funcionará devido a peculiaridades do seu sistema, então você terá de usar a criatividade para realizar a automação; (vide Actions e Robot)

      – no sistema de treino que eu utilizo a maioria dos objetos possuem id/name, mas isso não é regra: no dia a dia provavelmente você terá sistemas onde muitos dos objetos que você precisará interagir não terão um id/name, seja por ser algum sistema legado (que na época que foi desenvolvido sequer se imaginava em automação funcional) ou por “descuidos” do desenvolvimento. Recentemente vivi uma situação que tive que automatizar uma página cuja maioria dos elementos de tela claramente foram feitos através de “copy/paste”, então a maioria deles tinham o mesmo “name”, ou então não tinham id nem name. Em situações como esta, tive que utilizar aquele xpath “medonho” cheio de divs,tables,tr, td para conseguir automatizar. Então aqui fica uma dica: invista um tempo para estudar xpath, pois você vai precisar cedo ou tarde fazer algumas expressões mais complexas.

      Enfim, aqui no blog estou tentando abordar sim situações/temas mais genéricos que costumam acontecer no dia a dia. Mas algo mais complexo/específico, só de acordo com o sistema a ser automatizado. E como sabemos que cada projeto de software é único, a automação funcional também o será. Em outras palavras: eu poderia tentar trazer algo mais complexo aqui que eu tenha utilizado nos sistemas que eu automatizei e tal, mas esse algo mais complexo poderia ser irrelevante para muitos outros sistemas (por exemplo, os que você ou outro leitor precisa automatizar).

      Curtir

      • Adriano Almeida 27 de maio de 2017 / 12:46

        muito bom, Cristiano. Vlw por todas as dicas, irei fazer o “Curso” do TestComplete para entender melhor algumas interpretações e entendimentos dos problemas enfrentados no dia a dia, ou como vc disse, os mais comuns e depois trabalhar com as excersões encontradas em projetos especificos. Não comecei o acompanhamento pelo TesComplete, pois aqui na região onde eu moro, na Bahia, eles somente utilizando software OpenSource, então nunca vi e nunca mexe no TestComplete, mas pela primeira Aula que você mencionou tem um Trial dele para poder fazer o exercicio. Muito Obrigado.

        Curtir

      • Automação Fora da Caixa 27 de maio de 2017 / 15:41

        Pois é. Eu iniciei o blog pelo TestComplete pela didática que a ferramenta possui. Como o intuito do blog é tentar ser um “ponto de partida” para quem quer dar os primeiros passos com automação funcional, achei ela mais interessante para esse propósito. O trial dela é de 30 dias, mas eu soube que entrando em contato com a SmartBear é possível conseguir mais 30 dias após os primeiros 30 dias terem expirado.

        Curtir

      • Fagner 10 de julho de 2021 / 20:14

        olá meu caro christiano blz
        sou o Fagner tenho deficientcia visual teria como vc disponibilisar seu codigo via email para eu fazer o download e a companhar seu projeto obrigado

        Curtir

      • Cristiano 11 de julho de 2021 / 13:55

        Boa tarde! Bem vindo ao blog! Te enviei por email o projeto, junto com algumas instruções de configuração! Qualquer dúvida é só perguntar!!

        Curtir

  8. Tiago 28 de setembro de 2017 / 17:09

    Primeiramente meus parabéns pelo excelente material, muito bom mesmo. Eu estou com uma duvida, eu crie uma feature para Login, uma outra feature para acessar o menu Aluno e outra para salvar o aluno. Como eu faço para que após finalizar a feature de login, iniciar a feature acessar o menu de Aluno utilizando da pagina que ja foi aberta no login ? E dai por diante? Eu também criei três class do tipo Test uma para cada feature esta correto? Obrigado

    Curtir

    • Automação Fora da Caixa 29 de setembro de 2017 / 04:25

      Olá! Bem-vindo ao blog! Meu comment ficou um pouco extenso pois tentei explicar detalhadamente suas dúvidas. Se algo não ficou claro ou faltou eu responder algo, fique à vontade para questionar 😉

      Tente imaginar um arquivo .Feature como uma coleção de testes (o .Feature pode conter 1 ou mais cenários de testes). Imagine que cada teste é uma sequência de passos, por exemplo: ‘1-abrir sistema’, ‘2-efetuar login no sistema’, ‘3-acessar menu XYZ’, ‘4-Inserir uma informação’.

      Vamos imaginar a .Feature que você fez somente para acessar o menu. Ela por si só já seria um cenário de testes ‘completo’? Ou seria mais um ‘passo de teste’ a ser utilizado em um ou mais cenários de testes? Veja o exemplo acima: ‘acessar menu XYZ’. Aqui você tem só um passo, não um cenário de teste. Então respondendo uma das suas perguntas: nesse contexto que você citou (criar uma feature somente para acessar o menu) não faria sentido.

      Agora suponhamos a seguinte realidade: você precisa fazer alguns testes para verificar se os diversos menus do sistema estão funcionando. Um cenário destes testes poderia ser : ‘1-acessar aplicação’,’2-fazer login’,’3-acessar menu X’. Então nesse contexto faria sentido ter um arquivo .Feature dedicado aos testes de menu que você está fazendo no sistema. Consegue visualizar os diferentes contextos/objetivos dos testes?

      No seu exemplo, você criou 3 features com o intuito de chamar as três em sequência. Essa sequência pode ser vista como um cenário de teste (login no sistema, acessar menu Aluno, salvar menu Aluno) . Se é um cenário, não faz sentido estar ‘quebrado’ em diferentes features. (O que faz sentido é a implementação de cada (passo) step em suas respectivas classes de sufixo Step).

      Sobre as classes de sufixo Test, nesse contexto que você me passou, não fariam muito sentido. Repito: NESSE CONTEXTO. Em outros contextos pode sim fazer sentido.

      Sobre rodar arquivos .Feature em uma sequência pré-determinada, eu não sei dizer se há alguma maneira. O que eu sei é que você pode criar as classes de Test para rodar 1 ou mais features, filtrando ou não por tags. No blog tem umas aulas que falam sobre a criação das classes de Test bem como o uso de Tags.

      Curtir

  9. MAURICIO SANTOS PEDROSO 26 de janeiro de 2018 / 04:41

    Boa Noite amigo.
    Queria agradecer pelo post e pelas informações contidas nele, de ótima explicação.
    Mas infelizmente estou com um probleminha, não consegui executar meu teste nenhuma vez, pois ele nem chega a abrir o chrome e aparece uma mensagem dizendo: “test class not found in selected project”.

    Já verifiquei se o ClienteTest está apontando para a feature corretamente, já verifiquei os steps, o testRule, mas infelizmente não sei a causa do problema.

    Obs: Ele sempre para no Given, mas como já verifiquei creio que não seja um problema na feature, até efetuei o download da nova versão do eclipse caso fosse algum problema de IDE.

    Obrigado, att.

    Curtir

    • Automação Fora da Caixa 26 de janeiro de 2018 / 11:39

      Olá! Esse erro é novo pra mim. Acredito que possa ser algum caminho/referência trocado. Gostaria de olhar o log de erro que aparece no teu console. Teria como postá-lo aqui para analisarmos?

      Por desencargo de consciência, chegou a revisar na classe de teste as opções que estão lá no CucumberOptions, especialmente o caminho apontado na opção ‘features’?

      Curtir

      • MAURICIO SANTOS PEDROSO 26 de janeiro de 2018 / 12:42

        Bom dia! Vou postar aqui pra você poder analisar.

        Essa é a classe de teste:

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

        }

        Essa é a TestRule:

        public class TestRule {
        private static WebDriver driver;

        @Before
        public void beforeCenario() {
        System.setProperty(“webdriver.chrome.driver”, “src/test/resources/chromedriver/chromedriver.exe”);

        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.navigate().to(“file///C:\\Users\\Maurício Gorete\\Desktop\\Versão 2”);
        }

        public static WebDriver getDriver() {
        return driver;
        }
        }

        Sinceramente não sei se o endereço da página está correto, mas eu tinha trocado até para http://google.com.br, só para ver se pelo menos abria.

        Aqui está o log de erro:

        java.lang.NullPointerException
        at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
        at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
        at com.sun.proxy.$Proxy19.sendKeys(Unknown Source)
        at foradacaixa.LoginPage.efetuarLogin(LoginPage.java:12)
        at foradacaixa.ClienteSteps.efetuarLogin(ClienteSteps.java:12)
        at ✽.Given efetuei login no sistema(src/test/java/Cliente.feature:25)

        Ao clicar na última linha, aparece uma janela com o erro em questão: “test class not found in selected project”.

        E ao clicar na penúltima linha ele leva para a página de steps, na linha 12, loginPage.efetuarLogin():

        public class ClienteSteps {
        @Given (“efetuei login no sistema”)
        public void efetuarLogin() {
        LoginPage loginPage = new LoginPage();
        loginPage.efetuarLogin();
        }

        Verifiquei também a classe page, aí está:

        public class LoginPage extends LoginElementMap{

        public LoginPage() {
        PageFactory.initElements(TestRule.getDriver(), this);
        }

        public void efetuarLogin() {
        login.sendKeys(“john”);
        senha.sendKeys(“john”);
        btnLogin.click();
        }
        }

        Desde já agradeço pelo apoio.

        Curtir

      • Automação Fora da Caixa 26 de janeiro de 2018 / 13:01

        Fiquei com dúvidas na classe TestRule, a respeito do teu caminho driver.navigate().to(“file///C:\\Users\\Maurício Gorete\\Desktop\\Versão 2”);

        1 – Chegou a tentar utilizar somente ‘/’ no lugar dos ‘\\’?

        2 – Se reparar nos meus prints do post, eu utilizo alguns caracteres especiais por causa de espaços e acentos nos diretórios – exemplo: ‘/Versão 2/’ está como ´/Vers5C3%A3o%202/´. Vê se isso não se aplicaria no teu caso.

        3 – Se reparar no print citado acima, o caminho termina apontando para o arquivo index.html. Percebi que o teu caminho aponta pro diretório mas não pro arquivo html.

        Dá uma verificada nesse caminho e me mantenha informado. Fique à vontade para fazer novas perguntas 😉

        Curtir

  10. MAURICIO SANTOS PEDROSO 26 de janeiro de 2018 / 13:54

    Prontinho, verifiquei:

    Testei desse jeito como você postou acima:

    driver.navigate().to(“file:///C:/Vers5C3%A3o%202/index.html”);

    Testei assim também que foi como você colocou na imagem do post lá em cima:

    driver.navigate().to(“file:///C:/Vers%C3%A3o%202/index.html”);

    Eu só alterei a pasta pro C: para ficar mais fácil.

    E tentei retirar todos os caracteres especiais da pasta e alterar no eclipse para ver se rodava:

    driver.navigate().to(“file:///C:/Versao2/index.html”);

    Todas as tentativas dão no mesmo resultado.

    Obrigado pela resposta rápida.

    Curtir

    • Automação Fora da Caixa 26 de janeiro de 2018 / 15:09

      Humm. Achava que pudesse ser algo no caminho, mas não. Aí fui ver com mais atenção teu log e tinha uma pista. Daí eu fui tentar reproduzir.

      Aliás, demorei um pouco a responder pois estava montando a minha VM com o ambiente pra tentar reproduzir o erro (tinha formatado o pc dias atrás).

      1 – Tenho uma última dúvida: tentou colocar um break point nesse no método da classe Page no ‘login.sendKeys(“john”);’? Ele está vindo nulo, como se não existisse, correto?

      O que eu fiz aqui foi alterar meu objeto webelement ´login´ da classe ´LoginElementMap´ para ´login2´, que é um nome que não existe na página de Login. Daí substituí ‘login.sendKeys(“john”);’ para ‘login2.sendKeys(“john”);’ Meu stacktrace aqui ficou muuuito semelhante ao teu.

      2 – Acredito que o problema esteja ali na ´LoginWebElementMap´. Poderia postar teu código dessa classe aqui, incluindo os imports dela?

      3 – No momento do erro a página index.html já foi carregada, mostrando o campo de login e senha?

      Curtir

      • MAURICIO SANTOS PEDROSO 26 de janeiro de 2018 / 15:24

        Na verdade ele nem abre o Chrome, mas assim que eu chegar em casa tento fazer o que você citou e lhe respondo.
        Muito Obrigado.

        Curtir

      • MAURICIO SANTOS PEDROSO 26 de janeiro de 2018 / 17:10

        Boa Tarde.
        Verifiquei o que você pediu, mas não domino muito de debug, mas fiz o possível.
        Ele para exatamente no login.sendKeys(“john”), se eu coloco breakpoint depois disso ele nem inicia, e quando eu coloco breakpoint no login.sendKeys(“john”), se eu fiz correto ele me retorna -1.

        Aqui está o código da LoginElementMap:

        package foradacaixa;

        import org.openqa.selenium.WebElement;

        public class LoginElementMap {
        protected WebElement login;
        protected WebElement senha;
        protected WebElement btnLogin;
        }

        Segue também o da LoginPage:

        package foradacaixa;

        import org.openqa.selenium.support.PageFactory;

        public class LoginPage extends LoginElementMap{

        public LoginPage() {
        PageFactory.initElements(TestRule.getDriver(), this);
        }

        public void efetuarLogin() {
        login.sendKeys(“john”);
        senha.sendKeys(“john”);
        btnLogin.click();
        }
        }

        E como mencionei antes, nem abrir o chrome chega a abrir.

        Desde já obrigado.

        Curtir

      • Automação Fora da Caixa 26 de janeiro de 2018 / 17:39

        Que estranho não abrir o Chrome pra ti. As tuas versões do Chrome e do chromedriver são as mais atuais? Te pergunto isso porque hoje eu tive que atualizar meu chromedriver pra uma versão compatível com o Chrome mais atual. Aqui estou com o chromedriver 2.35 e o Chrome 64.0.3282.119. Se não for esse o problema eu vou te pedir pra me enviar por email teu projeto zipado pra eu dar uma olhada. Tá muito estranho isso 😦

        Curtir

  11. MAURICIO SANTOS PEDROSO 26 de janeiro de 2018 / 18:23

    Aqui no meu caso a única coisa que não estava atualizado era o Google Chrome, mas já atualizei e continua a mesma coisa. Realmente tá muito estranho isso, só não quero tomar muito seu tempo amigo, se não for te incomodar muito posso te enviar por e-mail sim, só me passar o e-mail.

    Muito obrigado.

    Curtir

    • Automação Fora da Caixa 26 de janeiro de 2018 / 18:29

      Entrei em contato contigo pelo email que tu usou no blog. Verifica lá se recebeu!

      Fica tranquilo que estou de férias, tenho um tempo livre para verificar o que está acontecendo, hehehe!

      Curtir

      • MAURICIO SANTOS PEDROSO 26 de janeiro de 2018 / 20:30

        Muito Obrigado Cristiano.
        Esse cara é bom, é ninja. kkk
        Só pra constar como foi resolvido o problema:

        Básicamente na classe TestRule, onde é feita a chamada do chrome driver eu tinha colocado o import do @Before errado.

        Eu coloquei este, “import org.junit.Before;”, que é o importe do Junit, e é por isso que o chromedriver não estava abrindo.

        O import correte é este, “import cucumber.api.java.Before;”, que é o import do cucumber.

        Sendo assim funcionou tudo maravilhosamente.

        Mais uma vez agradecendo ao excepcional trabalho deste grande profissional, Cristiano, que dispôs do seu tempo para criar esse blog e nos ajudar.

        Curtir

  12. Maximiliano 27 de janeiro de 2018 / 18:14

    Olá Cristiano!

    Também estou com algumas dúvidas que não consegui entender como devo implementar.

    Por gentileza conseguiria me ajudar?

    Curtir

  13. Maximiliano 27 de janeiro de 2018 / 21:34

    Se possível mandar um print da tela como estava a classe ClienteTest, logo após de ter criado a classe TestRule. Quando tentou executar a primeira vez, o print da sua explicação está tapado com o menu aberto para realizar a execução.

    A minha está classe Test está assim:

    package tests;

    import org.junit.runner.RunWith;

    import cucumber.api.CucumberOptions;
    import cucumber.api.junit.Cucumber;

    @RunWith(Cucumber.class)
    @CucumberOptions(features = “classpath:features”, tags = “@Cadastro”,
    glue = {“”}, monochrome = true, dryRun = false)

    public class CadastroTest {

    Curtir

  14. MAURICIO SANTOS PEDROSO 28 de janeiro de 2018 / 01:10

    Boa Noite Cristiano.
    Tudo bem?
    Me tira mais uma dúvida.
    Ao utilizar esse código na classe testRule o navegador não deveria ser fechado?

    @After
    public void afterCenario() {
    driver.quit();
    }

    Foi feito o import org.junit.After;

    Mas o meu continua aberto.
    Poderia me ajudar?

    Obrigado.

    Curtir

    • Automação Fora da Caixa 28 de janeiro de 2018 / 11:56

      Opa! Vou lhe dar dicas para esse problema, pode ser? hehehe!

      Dica 1: pense como tu resolveu o problema anterior, aquele de não abrir o navegador. Qual era a razão? Quando encontrar a solução, posta aqui. Sim, tu vai encontrar ela 😉

      Dica 2: eu utilizo o driver.close(), não sei se o driver.quit() funcionaria 😉

      Curtir

      • MAURICIO SANTOS PEDROSO 29 de janeiro de 2018 / 00:37

        Bah Cristiano, verdade. hahaha
        Estava bem na minha cara, Te peço até desculpa por te incomodar.
        Realmente o import do after estava errado.
        Eu coloquei o import org.junit.After;

        Mas o correto é o import cucumber.api.java.After;

        Agora funcionou normalmente.
        Obrigado Cristiano.

        Curtir

  15. Gabriela 20 de junho de 2018 / 13:21

    Ola,
    Boa tarde, tudo joia?
    Gostaria de saber como você fez o método “verificarMensagemSucesso” ?

    O meu na verdade é um teste de login que para que eu possa saber se deu certo tenho que verificar se ele entrou na pagina, você consegue me ajudar com isso?

    Desde já grata!

    Curtir

    • Gabriela 20 de junho de 2018 / 14:01

      Tem como me passar seu email?

      Porque eu gostaria de tirar mais uma duvida com você.

      Tenho que automatizar duas situações em uma tela de login:

      1) Logando corretamente com senha e email validos, nesse caso esta só faltando metodo que te perguntei acima referente ao “verificarMensagemSucesso” como disse o meu na verdade é um teste de login que para que eu possa saber se deu certo tenho que verificar se ele entrou na pagina, você consegue me ajudar com isso?

      2) Deixando o campo senha em branco por exemplo o sistema deveria consistir e me retornar uma mensagem informando por exemplo: “Campo Obrigatorio”, como seria essa função?

      Desde já grata!

      Curtir

      • Cristiano 20 de junho de 2018 / 22:11

        Olá! Seguem respostas:

        1) respondi na pergunta anterior sobre o método “verificarMensagemSucesso” ;). Se eu entendi bem, você precisar se certificar que entrou em uma nova página. Na aula “9 – Reaproveitamento de código e tags do Cucumber”, no tópico de Tags, eu dou um exemplo que parece se encaixar bem nesse teu teste. Lá eu dou um exemplo de smoke teste onde desejo verificar se uma página foi carregada. Eu faço isso utilizando o findElements by id (está explicado em detalhes com um exemplo na aula 9 😉 )

        2) Acredito que seja muito idêntico ao que foi realizado no “verificarMensagemSucesso”, onde lemos uma propriedade de um objeto.

        Qualquer dúvida, não hesite em perguntar!

        OBS: Nas aulas eu comento sobre o uso do wait com a ressalva de que ele não é o ideal para ser usado no dia a dia. Caso seja necessário utilizar algum wait no teu projeto, sugiro pesquisar na web pelo objeto WebDriverWait (muito mais prático e útil de se utilizar)

        Curtir

    • Cristiano 20 de junho de 2018 / 21:58

      Oi! Seja bem vinda!

      O método “verificarMensagemSucesso” eu explico como foi feito lá na aula “6 – Asserts e mais algumas coisinhas”. É logo no início dessa aula 😉

      Curtir

  16. Adriano 20 de agosto de 2018 / 11:57

    Tudo bem Cristiano!? Parabéns pelo tutorial, muito bem explicado. Só realmente estou com um problemão, estou em um projeto que tenho que usar o Cucumber e obedecer uma arquitetura, então esta default não posso usar, contudo não estou conseguindo fazer a classe runner “enxergar” a classe com as steps em outro pacote e nem mesmo as features chegam a ser desmarcadas. Já tentei tudo que me passou pela cabeça, a configuração do glue simplesmente parece não ter efeito algum. Passei o final de semana todo estudando o Maven pois já estou acreditando que é erro em alguma config de construção da build, se puderes me ajudar agradeço muito. Como é um projeto de automação de teste, não há nada no pacote de testes, apenas na main.

    A arquitetura que tenho que usar é nessa base

    ├——————–src
    │ ├───main
    │ | └───java
    │ | └───projeto
    │ | └───modelo
    │ | ├───features
    │ | ├───runner
    │ | └───stepdefinitions
    │ └───test
    └───target
    ├───classes
    │ └───projeto
    │ └───modelo
    │ ├───features
    │ ├───runner
    │ └───stepdefinitions
    └───test-classes
    └───projeto
    └───modelo

    Curtir

  17. itanauã 25 de abril de 2019 / 10:52

    Olá, espero que ainda vejas os comentários aqui rsrs
    Estou com bronca, o meu chrome abre e fecha rapidamente e não chega a executar o teste

    Alguma clue?

    Obrigada!

    org.openqa.selenium.NoSuchSessionException: no such session
    (Driver info: chromedriver=2.20.353124 (035346203162d32c80f1dce587c8154a1efa0c3b),platform=Mac OS X 10.13.6 x86_64) (WARNING: The server did not provide any stacktrace information)
    Command duration or timeout: 98 milliseconds
    Build info: version: ‘3.0.1’, revision: ‘1969d75’, time: ‘2016-10-18 09:49:13 -0700’
    System info: host: ‘MBP-de-Itanaua.home’, ip: ‘192.168.1.3’, os.name: ‘Mac OS X’, os.arch: ‘x86_64’, os.version: ‘10.13.6’, java.version: ‘1.8.0_11’
    Driver info: org.openqa.selenium.chrome.ChromeDriver
    Capabilities [{message=session not created exception
    from unknown error: Runtime.executionContextCreated has invalid ‘context’: {“auxData”:{“frameId”:”1DF75D95A36EE9021B3DEE4764CC479A”,”isDefault”:true,”type”:”default”},”id”:1,”name”:””,”origin”:”://”}
    (Session info: chrome=73.0.3683.103)
    (Driver info: chromedriver=2.20.353124 (035346203162d32c80f1dce587c8154a1efa0c3b),platform=Mac OS X 10.13.6 x86_64), platform=ANY}]
    Session ID: 732b16a99c035e3b6a44cedefd9c4bb6
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:216)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:635)
    at org.openqa.selenium.remote.RemoteWebDriver.get(RemoteWebDriver.java:322)
    at org.openqa.selenium.remote.RemoteWebDriver$RemoteNavigation.to(RemoteWebDriver.java:902)
    at foradacaixa.TestRule.beforeCenario(TestRule.java:18)
    .
    .
    .

    Curtir

    • Cristiano 25 de abril de 2019 / 22:19

      Boa noite!

      Sim, ainda vejo os comentários, hehe! To sempre acompanhando! 🙂

      Bom, fica meio difícil tentar identificar a causa, mas vou chutar algumas ideias que me vieram em mente, talvez alguma delas seja a solução:

      1 – Versão do Chrome e versão do chromeDriver incompatíveis entre si (vide compatibilidade em http://chromedriver.chromium.org/downloads). Aliás, se eu estou lendo corretamente o log, o chromedriver que tu está utilizando é o 2.2 com o Chrome 73, e lá na página diz que o chromedriver recomendado é o 2.46. Tentou checar isso?

      2 – Algum objeto não instanciado (só debugando pra ver 😦 )

      Pergunta: foi recentemente que começou a ocorrer o problema? Já funcionou alguma vez?

      Me mantenha informado dos avanços!

      Cristiano.

      Curtir

      • itanauã 14 de maio de 2019 / 15:49

        Demorei mas voltei! 😀

        Então… baixei o chromedriver mais novo e tinha dado esse erro

        Starting ChromeDriver 75.0.3770.8 (681f24ea911fe754973dda2fdc6d2a2e159dd300-refs/branch-heads/3770@{#40}) on port 20444
        Only local connections are allowed.
        Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.

        Dei uma googlada e encontrei alguns dizendo pra pegar o anterior, a versão 74.
        Ai agora tá funcionando 😀

        Obrigada!

        Curtir

      • Cristiano 14 de maio de 2019 / 22:13

        Que bom 🙂

        Geralmente são detalhes como esses de compatibilidade de versão que fazem o driver não funcionar!

        Curtir

  18. Cristiano 17 de maio de 2019 / 13:00

    Quando executei recebi a mesg abaixo como se meu chrome nao fosse compativel , meu crhome esta com a versão Versão 74.0.3729.157 Baixei a mesma versão do Chrome driver e coloquei na pasta, dei um clean no projeto e executei
    Novamente ainda ocorre o erro abaixo:

    org.openqa.selenium.SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 75
    Build info: version: ‘3.141.59’, revision: ‘e82be7d358’, time: ‘2018-11-14T08:17:03’
    System info: host: ‘EZWKS-185’, ip: ‘192.168.13.185’, os.name: ‘Windows 10’, os.arch: ‘amd64’, os.version: ‘10.0’, java.version: ‘1.8.0_191’
    Driver info: driver.version: ChromeDriver
    remote stacktrace: Backtrace:
    Ordinal0 [0x00BF7DF3+1474035]
    Ordinal0 [0x00B707D1+919505]
    Ordinal0 [0x00B0CB43+510787]
    Ordinal0 [0x00AA1B0F+72463]
    Ordinal0 [0x00A9E3F3+58355]
    Ordinal0 [0x00AC0CE4+199908]
    Ordinal0 [0x00AC069D+198301]
    Ordinal0 [0x00ABEECB+192203]
    Ordinal0 [0x00AA5FF6+90102]
    Ordinal0 [0x00AA765A+95834]
    Ordinal0 [0x00AA7554+95572]
    GetHandleVerifier [0x00D5231C+1249612]
    GetHandleVerifier [0x00CA1575+525221]
    GetHandleVerifier [0x00CA1310+524608]
    Ordinal0 [0x00C05D28+1531176]
    GetHandleVerifier [0x00CA1D4A+527226]
    Ordinal0 [0x00B875F6+1013238]
    Ordinal0 [0x00B8746F+1012847]
    Ordinal0 [0x00B9365B+1062491]
    Ordinal0 [0x00B9379F+1062815]
    Ordinal0 [0x00B92745+1058629]
    BaseThreadInitThunk [0x75580419+25]
    RtlGetAppContainerNamedObjectPath [0x76EF662D+237]
    RtlGetAppContainerNamedObjectPath [0x76EF65FD+189]

    O que eu poderia fazer quanto a isso?
    Obrigado

    Curtir

  19. Cristiano Gaspar 20 de maio de 2019 / 16:35

    Gostaria de uma orientação, consigo logar mas não consigo clicar nos menus.
    Recebo o ERRO: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {“method”:”name”,”selector”:”login”}
    (Session info: chrome=74.0.3729.157)

    Já pesquisei atrás de um entendimento deste erro mas não descobri.
    Se alguém puder olhar agradeço.

    Segue o projeto neste endereço:
    https://drive.google.com/open?id=1sPskQ2-f0BVtBzPabMZZs56_KLMiaxPC

    Curtir

    • Cristiano 21 de maio de 2019 / 18:38

      Boa noite!

      Tudo bem?

      Bom, eu baixei teu projeto e depois de tentar rodar, fui olhar teu método “abrirBrowser” da classe TestRule, e nele vi a seguinte linha de comando:

      driver.navigate().to(“file:///C:/Users/cristiano.gaspar/Downloads/versaoUnit/versao/inicio.html”);

      Tu está tentando abrir o “inicio.html”. Aqui eu troquei por “index.html” e então fui capaz de efetuar o login perfeitamente.

      Após isso login foi feito e o menu foi exibido. A navegação de menu falhou, mas isso acho que é relacionado às dicas de “caminhamento de menu” que eu mostro aqui e que acredito que tu não tenha ainda passado por elas, então vou deixar pra ti investigar. Qualquer dificuldade me avise 😉

      Curtir

  20. Felipe Alves Lino Candido 4 de novembro de 2019 / 14:22

    Boa tarde!

    Será que ainda esta verificando o blog?

    O meu código está dando erro em 2 pontos!

    O primeiro ponto é que ele abre o Google Chrome, porém fica apresentando um balão de Erro na Extensão.

    Apresenta o seguinte erro que eu nao consegui identificiar. segue log:

    Failed scenarios:
    src/test/java/Cliente.feature:23 # Scenario: Title of your scenario

    1 Scenarios (1 failed)
    8 Steps (1 failed, 7 skipped)
    0m2,964s

    org.openqa.selenium.WebDriverException: Returned value cannot be converted to WebElement: {stacktrace=Backtrace:
    Ordinal0 [0x01459F93+1548179]
    Ordinal0 [0x013DDC51+1039441]
    Ordinal0 [0x0135E33E+516926]
    Ordinal0 [0x012F1179+70009]
    Ordinal0 [0x013096F7+169719]
    Ordinal0 [0x013080D0+164048]
    Ordinal0 [0x01307CAA+162986]
    Ordinal0 [0x012E221E+8734]
    Ordinal0 [0x012E2606+9734]
    Ordinal0 [0x012E2C80+11392]
    Ordinal0 [0x013F7047+1142855]
    GetHandleVerifier [0x014F2996+507766]
    GetHandleVerifier [0x014F26B4+507028]
    GetHandleVerifier [0x014F9D97+537463]
    GetHandleVerifier [0x014F3252+510002]
    Ordinal0 [0x013EF12C+1110316]
    Ordinal0 [0x012E204E+8270]
    Ordinal0 [0x012E1D99+7577]
    GetHandleVerifier [0x0178D8FC+3239644]
    BaseThreadInitThunk [0x75900419+25]
    RtlGetAppContainerNamedObjectPath [0x7760662D+237]
    RtlGetAppContainerNamedObjectPath [0x776065FD+189]
    , error=invalid session id, message=invalid session id}
    Build info: version: ‘3.0.1’, revision: ‘1969d75’, time: ‘2016-10-18 09:49:13 -0700’
    System info: host: ‘N1007’, ip: ‘192.168.56.1’, os.name: ‘Windows 10’, os.arch: ‘x86’, os.version: ‘10.0’, java.version: ‘1.8.0_231’
    Driver info: driver.version: RemoteWebDriver
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:375)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:417)
    at org.openqa.selenium.By$ById.findElement(By.java:218)
    at org.openqa.selenium.support.ByIdOrName.findElement(ByIdOrName.java:47)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:360)
    at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
    at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
    at com.sun.proxy.$Proxy17.sendKeys(Unknown Source)
    at foradacaixa.LoginPage.efetuarLogin(LoginPage.java:14)
    at foradacaixa.ClienteSteps.efetuarLogin(ClienteSteps.java:12)
    at ?.Given efetuei login no sistema(src/test/java/Cliente.feature:24)
    Caused by: java.lang.ClassCastException: com.google.common.collect.Maps$TransformedEntriesMap cannot be cast to org.openqa.selenium.WebElement
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:373)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:417)
    at org.openqa.selenium.By$ById.findElement(By.java:218)
    at org.openqa.selenium.support.ByIdOrName.findElement(ByIdOrName.java:47)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:360)
    at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
    at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
    at com.sun.proxy.$Proxy17.sendKeys(Unknown Source)
    at foradacaixa.LoginPage.efetuarLogin(LoginPage.java:14)
    at foradacaixa.ClienteSteps.efetuarLogin(ClienteSteps.java:12)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at cucumber.runtime.Utils$1.call(Utils.java:40)
    at cucumber.runtime.Timeout.timeout(Timeout.java:16)
    at cucumber.runtime.Utils.invoke(Utils.java:34)
    at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:38)
    at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:37)
    at cucumber.runtime.Runtime.runStep(Runtime.java:300)
    at cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44)
    at cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39)
    at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:44)
    at cucumber.runtime.junit.ExecutionUnitRunner.run(ExecutionUnitRunner.java:102)
    at cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:63)
    at cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:18)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at cucumber.runtime.junit.FeatureRunner.run(FeatureRunner.java:70)
    at cucumber.api.junit.Cucumber.runChild(Cucumber.java:95)
    at cucumber.api.junit.Cucumber.runChild(Cucumber.java:38)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at cucumber.api.junit.Cucumber.run(Cucumber.java:100)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

    Curtir

    • Cristiano 4 de novembro de 2019 / 20:18

      Boa noite!

      Sim, eu ainda acompanho o blog!

      Bom, é primeira vez que eu vejo esses erros. Ao menos até o momento ninguém tinha reportado algo parecido aqui no blog.

      Bom, sobre o balão de erro do Google Chrome, existe alguma mensagem de erro?

      Sobre a exceção, conseguiria colar o código da tua classe Page?

      Outras dúvidas minhas (vou perguntar só por desencargo de consciência):
      – a versão do chromedriver que tu tá utilizando é compatível com a versão do Chrome que tu tem?
      – chegou a reiniciar a máquina? (parece bobo, mas já vi casos de problemas que um restart funcionou)

      Pesquisando pela web, vi que outras pessoas tiveram esse erro teu. Chegou a ver a solução proposta aqui? (parece ser algo com o workspace do Eclipse)

      https://stackoverflow.com/questions/54309500/org-openqa-selenium-webdriverexception-returned-value-cannot-be-converted-to-we

      Mantenha-me informado! Qualquer dúvida, pergunte! Tentarei ajudar na medida do possível 🙂

      Curtir

      • Felipe Alves Lino Candido 6 de novembro de 2019 / 09:47

        Cristiano, bom dia!

        Aqueles erros sumiram! Agora esta dando erro no MenusPage.java na hora de clicar no botão Login!

        Segue parte do código!

        package foradacaixa;

        import java.awt.Robot;

        import org.openqa.selenium.WebElement;
        import org.openqa.selenium.interactions.Actions;
        import org.openqa.selenium.support.PageFactory;
        import org.openqa.selenium.JavascriptExecutor;

        public class MenusPage extends MenusElementMap {

        private void moverMouseSobreElemento(WebElement elemento) throws Exception {

        // Obtém a altura da página interna
        long intAlturaPagina = (Long) ((JavascriptExecutor) TestRules
        .getDriver())
        .executeScript(“return document.documentElement.clienteHeight”);

        // Obtém altura da janela (browser)
        int intAlturaJanela = TestRules.getDriver().manage().window().getSize().height;

        // Obtém a diferença de altura entre janela e página
        int intDiferencaAltura = intAlturaJanela – (int) intAlturaPagina;

        // Obtém as coordenadas relativas do objeto
        int intCoordXElemento = elemento.getLocation().getX();
        int intCoordYElemento = elemento.getLocation().getY();

        // Move para a posição esperada do objeto
        int intCoordXEsperada = intCoordXElemento;
        int intCoordYEsperada = intCoordYElemento + intDiferencaAltura;
        Robot robot = new Robot();
        robot.mouseMove(intCoordXEsperada, intCoordYEsperada);

        }

        public MenusPage() {
        PageFactory.initElements(TestRules.getDriver(), this);
        }

        public void acessarMenuClientesInserir() throws Exception {

        Actions actions = new Actions(TestRules.getDriver());
        actions.moveToElement(menuClientes);
        actions.moveToElement(submenuClientesInserir);
        actions.click().build().perform();
        }

        public void acesseiMenuClientesInserir() throws Exception {
        this.moverMouseSobreElemento(menuClientes);
        submenuClientesInserir.click();
        }
        }

        Curtir

      • Cristiano 7 de novembro de 2019 / 22:18

        Boa noite!

        Sumiram? É, o java/eclipse tem dessas coisas, hehe!

        Bom, essa parte dos menus é a mais chata desse projeto de automação. Lembro que quando eu montei esse material tive muita dor de cabeça com esses menus.

        Mas que erro ocorre no botão de login? Sistema não loga? Estoura exceção?

        Curtir

  21. Felipe Alves Lino Candido 8 de novembro de 2019 / 08:47

    Bom dia!

    Eles são de lua! kkkkkk

    O problema do Login eu consegui resolver, agora esta dando erro nessa linha:

    private void moverMouseSobreElemento(WebElement elemento)throws Exception {

    long intAlturaPagina = (Long)((JavascriptExecutor)TestRules.getDriver()).executeScript(“return document.documentElement.clienteHeight”);

    Segue o log do erro:

    java.lang.NullPointerException

    at foradacaixa.MenusPage.moverMouseSobreElemento(MenusPage.java:21)
    at foradacaixa.MenusPage.acessarMenuClientesInserir(MenusPage.java:42)
    at foradacaixa.ClienteSteps.acesseiMenuClientesInserir(ClienteSteps.java:18)
    at ?.And acessei o menu Clientes >> Inserir(src/test/java/Cliente.feature:25)

    Curtir

    • Cristiano 8 de novembro de 2019 / 21:40

      Boa noite!

      Acredito que o nullpointer que tu está tendo esteja aqui:

      document.documentElement.clienteHeight

      Tu está utilizando “clienteHeight” em vez de “clientHeight” (tem um ‘e’ sobrando no teu código)

      Fiquei curioso sobre o teu problema do Login. Tu consegue descrever a solução? Tem a pergunta do Rafael logo abaixo, que não está conseguindo logar também. Vai que tenha correlação 🙂

      Curtir

  22. Rafael Neves 8 de novembro de 2019 / 12:21

    Bom dia Cristiano!

    Consegue me ajudar?

    O sistema não está logando.

    apresenta erro no MenusPage.java

    package foradacaixa;

    import org.openqa.selenium.support.PageFactory;

    public class MenusPage extends MenusElementMap {
    public MenusPage() {
    PageFactory.initElements(TestRule.getDriver(), this);
    }

    public void acessarMenuClientesInserir() {
    menuClientes.click();
    submenuClientesInserir.click();
    }
    }

    e ClienteSteps.java

    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() {
    LoginPage loginPage = new LoginPage();
    loginPage.efetuarLogin();
    }

    @And(“acessei o menu Clientes >> Inserir”)
    public void acessarMenuClientesInserir() {
    MenusPage menusPage = new MenusPage();
    menusPage.acessarMenuClientesInserir();
    }

    @When(“na tela de Dados de Identificacao informo os dados de Pessoa Fisica”)
    public void informarDadosIdentificacaoPF() {
    ClientePage clientePage = new ClientePage();
    clientePage.InformarDadosIdentificacaoPF();
    }

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

    @And(“na tela Enderecos informo os enderecos”)
    public void informarEnderecos() {
    ClientePage clientePage = new ClientePage();
    clientePage.informarEnderecos();
    }

    @And(“na tela Enderecos clico em Salvar”)
    public void clicarSalvar() {
    ClientePage clientePage = new ClientePage();
    clientePage.clicarSalvar();
    }

    @Then(“na tela Enderedecos sera exibida mensagem de sucesso”)
    public void verificarMensagemSucesso() {
    ClientePage clientePage = new ClientePage();
    clientePage.verificarMensagemSucesso();
    }

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

    }
    }

    Segue Log do erro:

    Starting ChromeDriver 78.0.3904.70 (edb9c9f3de0247fd912a77b7f6cae7447f6d3ad5-refs/branch-heads/3904@{#800}) on port 42455
    Only local connections are allowed.
    Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
    nov 08, 2019 12:10:41 PM org.openqa.selenium.remote.ProtocolHandshake createSession
    INFORMAÇÕES: Attempting bi-dialect session, assuming Postel’s Law holds true on the remote end
    nov 08, 2019 12:10:45 PM org.openqa.selenium.remote.ProtocolHandshake createSession
    INFORMAÇÕES: Falling back to original OSS JSON Wire Protocol.
    nov 08, 2019 12:10:47 PM org.openqa.selenium.remote.ProtocolHandshake createSession
    INFORMAÇÕES: Detected dialect: OSS

    Failed scenarios:
    src/test/java/Cliente.feature:24 # Scenario: Login no Sistema

    1 Scenarios (1 failed)
    8 Steps (1 failed, 6 skipped, 1 passed)
    0m24,475s

    org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”//a[text()=’Clientes’]”}
    (Session info: chrome=78.0.3904.97)
    (Driver info: chromedriver=78.0.3904.70 (edb9c9f3de0247fd912a77b7f6cae7447f6d3ad5-refs/branch-heads/3904@{#800}),platform=Windows NT 10.0.17763 x86_64) (WARNING: The server did not provide any stacktrace information)
    Command duration or timeout: 10.13 seconds
    For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
    Build info: version: ‘3.0.1’, revision: ‘1969d75’, time: ‘2016-10-18 09:49:13 -0700’
    System info: host: ‘N946’, ip: ‘10.20.150.200’, os.name: ‘Windows 10’, os.arch: ‘amd64’, os.version: ‘10.0’, java.version: ‘1.8.0_231′
    Driver info: org.openqa.selenium.chrome.ChromeDriver
    Capabilities [{mobileEmulationEnabled=false, timeouts={implicit=0, pageLoad=300000, script=30000}, hasTouchScreen=false, platform=XP, acceptSslCerts=false, goog:chromeOptions={debuggerAddress=localhost:50954}, acceptInsecureCerts=false, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=ignore, applicationCacheEnabled=false, rotatable=false, networkConnectionEnabled=false, chrome={chromedriverVersion=78.0.3904.70 (edb9c9f3de0247fd912a77b7f6cae7447f6d3ad5-refs/branch-heads/3904@{#800}), userDataDir=C:\Users\rafael_neves\AppData\Local\Temp\scoped_dir3524_747141220}, takesHeapSnapshot=true, pageLoadStrategy=normal, strictFileInteractability=false, databaseEnabled=false, handlesAlerts=true, version=78.0.3904.97, browserConnectionEnabled=false, proxy={}, nativeEvents=true, locationContextEnabled=true, cssSelectorsEnabled=true}]
    Session ID: 7f2d7fe0cca4ca7a67927ff3714d75e1
    *** Element info: {Using=xpath, value=//a[text()=’Clientes’]}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:216)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:635)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:368)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:473)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:361)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:360)
    at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
    at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
    at com.sun.proxy.$Proxy17.click(Unknown Source)
    at foradacaixa.MenusPage.acessarMenuClientesInserir(MenusPage.java:12)
    at foradacaixa.ClienteSteps.acessarMenuClientesInserir(ClienteSteps.java:18)
    at ?.And acessei o menu Clientes >> Inserir(src/test/java/Cliente.feature:26)

    Curtir

    • Cristiano 8 de novembro de 2019 / 21:44

      Boa noite!

      Bom, sobre não conseguir logar, as únicas razões que me vem em mente é:
      1 – faltou executar o arquivo html que cria as tabelas no Google Chrome;
      2 – algum detalhe no trecho de código abaixo (por exemplo, o path não estar correto para o teu usuário)

      ChromeOptions options = new ChromeOptions();
      options.addArguments(“user-data-dir=C:/Users/Windows 8/AppData/Local/Google/Chrome/User Data”);
      // Inicia o driver do ChromeDriver e navega até a página inicial.
      driver = new ChromeDriver(options);

      Tu consegue revisar esses dois itens? Me mantenha informado se obteve sucesso ou não! 😉

      Curtir

  23. Adriana 5 de janeiro de 2021 / 14:11

    – O sistema não logou. Fiz as alterações, conforme solicitada, mas não funcionou:

    package foradacaixa;

    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;

    import cucumber.api.java.Before;

    public class TestRule {

    private static WebDriver driver;

    @Before
    public void beforeCenario() {

    System.setProperty(“webdriver.chrome.driver”,”src/test/resources/chromedriver/chromedriver.exe”);
    //Para que possa acessar a base de dados corretamente .
    ChromeOptions options = new ChromeOptions();
    options.addArguments(“user-data-dir=C:/Users/ABCARVALHO.LAPTOP-0O8H31TE/AppData/Local/Google/Chrome/User Data”);
    //Inicia o driver do ChromeDriver e navega até a página inicial .
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.navigate().to(“file:///C:/Users/ABCARVALHO.LAPTOP-0O8H31TE/Documents/CURSOS/ForaDaCaixa/versao2/Vers%C3%A3o%202/index.html”);

    }

    //Classe criada para utilizar o PageFactory
    /*Basicamente é um método estático que retorna o objeto WebDriver da classe “TestRule.java”.
    * É preciso criar esse método pois ele será utilizado nos métodos construtores
    *
    */
    public static WebDriver getDriver() {
    return driver;

    }

    }

    Outra classe :
    package foradacaixa;

    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.support.FindBy;
    //“ElementMap”: mapeia os objetos da tela
    public class MenusElementMap {

    //temos um “@FindBy(xpath = “//a[text()=’Clientes’]”)” sobre a declaração do elemento. O que é isso?
    //Basicamente ele diz que esse elemento deverá ser encontrado (“FindBy”) através do xpath informado (xpath = “//a[text()=’Clientes’]”). Esse xpath está dizendo basicamente o seguinte: “todos os links cujo texto seja igual a “Clientes””.
    @FindBy(xpath=”//a[text()=’Clientes’]”)
    protected WebElement menuCliente;

    @FindBy(css =”[href=’inserircliente_identificacao.html’]”)
    protected WebElement submenuClientesInserir;

    }

    Erro:

    org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”//a[text()=’Clientes’]”}
    (Session info: chrome=87.0.4280.88)
    (Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 10.0.19041 x86_64) (WARNING: The server did not provide any stacktrace information)
    Command duration or timeout: 0 milliseconds
    For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
    Build info: version: ‘3.141.59’, revision: ‘e82be7d358’, time: ‘2018-11-14T08:17:03’
    System info: host: ‘LAPTOP-0O8H31TE’, ip: ‘192.168.0.168’, os.name: ‘Windows 10’, os.arch: ‘amd64’, os.version: ‘10.0’, java.version: ‘15.0.1’
    Driver info: org.openqa.selenium.chrome.ChromeDriver
    Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.40.565498 (ea082db3280dd6…, userDataDir: C:\Users\ABCARV~1.LAP\AppDa…}, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 87.0.4280.88, webStorageEnabled: true}
    Session ID: ed8fc36e9d6c76dd16a24fdcb998a486
    *** Element info: {Using=xpath, value=//a[text()=’Clientes’]}
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
    at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
    at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
    at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
    at com.sun.proxy.$Proxy17.click(Unknown Source)
    at foradacaixa.MenusPage.acessarMenuClientesInserir(MenusPage.java:9)
    at foradacaixa.ClienteSteps.acessei_o_menu_Clientes_Inserir(ClienteSteps.java:22)
    at ?.E acessei o menu Clientes >> Inserir(src/test/java/Cliente.feature:12)

    Curtir

    • Cristiano 5 de janeiro de 2021 / 18:38

      Boa tarde! Desculpe a demora! Só consigo responder no final do dia. Bom, vamos partir do mais simples. Se eu entendi bem, ao rodar a automação o login não é efetuado. Desconfio de 3 causas:

      1 – Manualmente, tu está conseguindo logar? Por exemplo, ao abrir manualmente abrir a tela de login do sistema, informar usuário ‘john’ e senha ‘john’, tu conseguiu logar normalmente? Se nem manualmente está logando, pode estar faltando rodar aquela configuração que cria as tabelas no chrome;

      2 – Se manualmente está logando no sistema após informar login e senha, talvez algo não esteja OK na parte das options do ChromeOptions. Se for esse o caso, uma sugestão seria rodar a tua automação em modo debug, e colocar um breakpoint logo antes da automação informar login e senha. Uma vez que tu parou no breakpoint, vá na página de login que a tua automação abriu, e tente logar manualmente. Se não logar, é sinal que faltou carregar algo no teu chrome.

      3 – Antes de rodar a automação, tu fechou todas as tuas abas do chrome? Esse passo é necessário devido a “peculiaridade” desse sistema de treinamento, que guarda informações no chrome. Ele sempre se perde caso tu rode a automação com alguma página do chrome já aberta.

      Me mantenha informado sobre o andamento do problema! Acredito que seja só um detalhe que esteja quebrando tua automação!

      Curtir

      • Adriana 6 de janeiro de 2021 / 12:33

        Item 1- Estou conseguindo logar manualmente ;
        Item 2 – Mesmo rodando o debug, não consegui identificar o erro.
        Item 3 – Fechei todas as abas antes de rodar.

        Com esses impeditivos , não tem com seguir os restantes das aulas.
        Tem algum e-mail , que eu consiga falar com você?

        Desde já, agradeço sua atenção.

        Curtir

      • Cristiano 6 de janeiro de 2021 / 17:57

        Boa tarde! Te enviei email! 🙂

        Curtir

  24. Adriana 8 de janeiro de 2021 / 09:18

    Cristiano, conforme sua explicação: “Basicamente faltou utilizar na inicialização do driver as informações do objeto options que tu definiu. Bastou eu colocar ali e ele logou.
    O motivo é o seguinte: quando se inicializa o driver sem passar qualquer option, ele carrega um chrome “vazio”, sem as informações/histórico/dados do Chrome da máquina. Com a falta do option ali na inicialização, tuas tabelas não eram carregadas. E sem tabelas, o sistema não logava.”
    Foi efeito essa alteração , e consegui logar.

    Obrigada

    Curtir

  25. Adriana 8 de janeiro de 2021 / 12:24

    Cristiano. Crie o metódo moverMouseSobreElemento conforme orientações da documentação acima. Porém rodar mais está dando erro . Se puder me ajudar eu agradeço.
    ->MenuPages
    package foradacaixa;

    import java.awt.Robot;

    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.interactions.Actions;
    import org.openqa.selenium.support.PageFactory;

    public class MenusPage extends MenusElementMap{

    /* O objeto “login” estava nulo no momento da execução. Por que isso?
    * Porque não tínhamos inicializado os WebElements ainda. Aliás, em nenhuma das classes eles foram inicializados.
    * Para inicializá-los é preciso criar um construtor em cada uma das classes de sufixo “Page” e dentro deles chamar o método do Selenium chamado “PageFactory”
    *
    * Basicamente é um método estático que retorna o objeto WebDriver da classe “TestRule.java”. É preciso criar esse método pois ele será utilizado nos métodos construtores.
    * Feito isso, iremos criar métodos construtores nas classes de sufixo “Page”:
    *
    * Os construtores fazem uma chamada ao método “initElements” (inicializar os elementos) recebendo em um dos parâmetros o objeto driver da classe “TestRule.java”.
    */

    public MenusPage() {
    PageFactory.initElements(TestRule.getDriver(), this);
    }

    public void acessarMenuClientesInserir() throws Exception {

    this.moverMouseSobreElemento(menuCliente);
    submenuClientesInserir.click();

    }
    /*O que o método apresentado acima faz é simplesmente mover o ponteiro do mouse para alguma posição da tela.
    * No caso essa posição se dá através de algum WebElement recebido por parâmetro, ou seja, o elemento no qual desejamos posicionar o ponteiro do mouse.
    *
    */

    //==========================================

    private void moverMouseSobreElemento(WebElement elemento) throws Exception {
    // obtém a altura da página interna
    long intAlturaPagina = (Long) ((JavascriptExecutor) TestRule.getDriver()).executeScript(“return document.documentElement.clientHeight”);

    // obtém a altura da janela (browser)
    int intAlturaJanela = TestRule.getDriver().manage().window().getSize().height;

    // obtém a diferença de altura entre janela e página
    // int intDiferencaAltura = (int) intAlturaJanela – (int) intAlturaPagina;
    int intDiferencaAltura = (int) intAlturaJanela -(int) intAlturaPagina;
    // obtém as coordenadas relativas do objeto
    int intCoordXElemento = elemento.getLocation().getX();
    int intCoordYElemento = elemento.getLocation().getY();

    // move para a posição esperada do objeto
    int intCoordXEsperada = intCoordXElemento;
    int intCoordYEsperada = intCoordYElemento + intDiferencaAltura;
    Robot robot = new Robot();
    robot.mouseMove(intCoordXEsperada, intCoordYEsperada);

    }

    }

    Erro:
    1 Scenarios (1 failed)
    8 Steps (1 failed, 5 skipped, 2 passed)
    0m23,567s

    org.openqa.selenium.NoSuchElementException: Cannot locate element with text: Soteiro
    For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
    Build info: version: ‘3.141.59’, revision: ‘e82be7d358’, time: ‘2018-11-14T08:17:03’
    System info: host: ‘LAPTOP-0O8H31TE’, ip: ‘192.168.0.168’, os.name: ‘Windows 10’, os.arch: ‘amd64’, os.version: ‘10.0’, java.version: ‘15.0.1’
    Driver info: driver.version: unknown
    at org.openqa.selenium.support.ui.Select.selectByVisibleText(Select.java:147)
    at foradacaixa.ClientePage.informarDadosIdentificacaoPF(ClientePage.java:35)
    at foradacaixa.ClienteSteps.na_tela_Dados_de_Identificacao_informo_os_dados_de_Pessoa_Fisica(ClienteSteps.java:29)
    at ?.Quando na tela Dados de Identificacao informo os dados de Pessoa Fisica(src/test/java/Cliente.feature:13)

    ->Arquivo do Step

    package foradacaixa;

    import cucumber.api.java.pt.Dado;
    import cucumber.api.java.pt.Entao;
    import cucumber.api.java.pt.Quando;

    public class ClienteSteps {

    @Dado(“^efetuei login no sistema$”)
    public void efetuei_login_no_sistema() throws Throwable {

    LoginPage loginPage = new LoginPage();
    //Thread.sleep(5000);//5 segundos
    loginPage.efetuarLogin();

    }

    @Dado(“^acessei o menu Clientes >> Inserir$”)
    public void acessei_o_menu_Clientes_Inserir() throws Throwable {

    MenusPage menusPage = new MenusPage();
    menusPage.acessarMenuClientesInserir();
    }

    @Quando(“^na tela Dados de Identificacao informo os dados de Pessoa Fisica$”)
    public void na_tela_Dados_de_Identificacao_informo_os_dados_de_Pessoa_Fisica() throws Throwable {

    ClientePage clientePage = new ClientePage();//instanciado o objeto
    clientePage.informarDadosIdentificacaoPF(); // e chamado os métodos dessa classe (Cliente Page);

    }

    @Quando(“^na tela Identificacao clico em Avancar$”)
    public void na_tela_Identificacao_clico_em_Avancar() throws Throwable {
    ClientePage clientePage = new ClientePage();
    clientePage.clicarAvancar();

    }

    @Quando(“^na tela enderecos informo os enderecos$”)
    public void na_tela_enderecos_informo_os_enderecos() throws Throwable {
    ClientePage clientePage = new ClientePage();
    clientePage.informarEnderecos();

    }

    @Quando(“^na tela enderecos clico em Salvar$”)
    public void na_tela_enderecos_clico_em_Salvar() throws Throwable {

    ClientePage clientePage = new ClientePage();
    clientePage.clicarSalvar();

    }

    @Entao(“^na tela enderecos sera exibida mensagem de sucesso$”)
    public void na_tela_enderecos_sera_exibida_mensagem_de_sucesso() throws Throwable {

    ClientePage clientePage = new ClientePage();
    clientePage.verificarMensagemSucesso();

    }

    @Entao(“^efetuarei logout do sistema$”)
    public void efetuarei_logout_do_sistema() throws Throwable {
    ClientePage clientePage = new ClientePage();
    clientePage.efetuarLogout();

    }

    }

    Curtir

    • Cristiano 9 de janeiro de 2021 / 17:22

      Boa tarde!

      O seguinte trecho do teu log me chamou a atenção:

      Erro:
      1 Scenarios (1 failed)
      8 Steps (1 failed, 5 skipped, 2 passed)
      0m23,567s

      org.openqa.selenium.NoSuchElementException: Cannot locate element with text: Soteiro

      Ali onde diz que não consegue localizar o elemento com o texto ‘Sotero’, não seria ‘Solteiro’? Fiquei com a impressão que teu erro se dá na busca do estado civil. Seria isso?

      Curtir

      • Adriana 11 de janeiro de 2021 / 08:39

        Bom dia, Cristiano. Verifiquei a Page. Tinha escrito a palavra errada. Obrigada.

        Curtir

  26. Danieli Santos 19 de janeiro de 2021 / 10:34

    Bom dia Cristiano poderiam me tirar uma duvida, não estou conseguindo rodar o projeto com sucesso na classe TesteRule coloquei como essa nos prints porem ele abre o browse bem rapido mas gera o mesmo erro de quando não tinha a classe TesteRule

    segue os print com erro e codigo

    *Erro

    Failed scenarios:
    src/test/java/Cliente.feature:24 # Scenario: Inserir Cliente Pessoa fisica

    1 Scenarios (1 failed)
    8 Steps (1 failed, 7 skipped)
    0m4,511s

    java.lang.NullPointerException
    at foradacaixa.LoginPage.efetuarLogin(LoginPage.java:5)
    at foradacaixa.ClienteSteps.efetuarLogin(ClienteSteps.java:13)
    at ?.Given efetuei login no sistema(src/test/java/Cliente.feature:25)

    *TesteRoles.jav
    package foradacaixa;

    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;

    import cucumber.api.java.Before;

    public class TestRule {

    private static WebDriver driver;

    @Before
    public void beforeCenario() {

    System.setProperty(“webdriver.chrome.driver”, “src/test/resources/chromedriver/chromedriver.exe”);
    // Inicia o driver do ChromeDriver e navega até a pagina inicial.
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.navigate().to(“file:///C:/Users/danieli.santos/OneDrive%20-%20Accenture/Desktop/Vers%C3%A3o%202/index.html”);

    }
    }

    Curtir

    • Cristiano 20 de janeiro de 2021 / 20:21

      Boa noite! Eu te enviei email solicitando mais detalhes do erro!

      Curtir

Deixe um comentário