Agile Testers TechTalks | Test War Stories - Andreia Gaita @ Tech Lead do GitHub. Saiba mais aqui

Capybara + Cucumber + Site Prism



  • Estou fazendo um script de testes de uma loja virtual, mas deparei com um erro que não descobrir por que ocorreu. Fiz algumas pesquisas mas não conseguir ir para frente. Criei a Page Objects e todos passos executam. Ocorreu erro neste:

    class Cadastro < SitePrism::Page
      element :informacao_adicional, "input[id='other']" 
    end
    

    Step definitions:

    Quando(/^eu preencher os campos obrigatórios$/) do
    	#cadastro.wait_informacao_adicional_visible
      cadastro.informacao_adicional.set(Faker::Lorem.sentence)
    end
    

    Erro:

     Quando eu preencher os campos obrigatórios             # features/step_definitions/cadastrarUsuario.rb:28
          Unable to find visible css "input[id='other']" (Capybara::ElementNotFound)
    
    <p class="textarea form-group">
    	<label for="other">Additional information</label>
    	<textarea class="form-control" name="other" id="other" cols="26" rows="3"></textarea>
    </p>
    


  • @davidson-jacob Tenta mapear o elemento assim:

    class Cadastro < SitePrism::Page
      element :informacao_adicional, "textarea[id='other']" 
    end
    

    Da forma que esta fazendo, você esta mapeando o elemento informacao_adicional como um input onde o ID é “other”, mas na verdade ele é um textarea com tal ID.



  • @vhsantos Valeu… Funcionou.



  • Como encontro o elemento link? Usei do Addresses do title e também o My addresses ambas não conseguiram localizar o elemento.

    <li>
    <a href="http://automationpractice.com/index.php?controller=addresses" title="Addresses"><i class="icon-building"></i><span>My addresses</span>
    </a>
    </li>
    
    class Alterar < SitePrism::Page
      element :botao_endereco, "a[name='My addresses']" 
    end
    
    Quando(/^clicar no My Addresses$/) do
    	@altera.botao_endereco.click
    end
    
    Unable to find visible css "href[name='My addresses']" (Capybara::ElementNotFound)
    
    


  • @davidson-jacob said in Capybara + Cucumber + Site Prism:

    My addresses

    Opa, uma forma que podes fazer é assim

    class Alterar < SitePrism::Page
      element :botao_endereco, "a[title='Addresses']"
    end
    

    O que você fez foi tentar pegar um atributo name com o valor My addresses, mas esse atributo sequer existe no elemento que esta mapeando. A informação My addresses é o conteúdo do elemento Span.

    Dica 1: uma coisa que vem me ajudando a aprender sobre mapeamento de elementos é sempre tentar analisar o elemento primeiramente de forma isolada. No caso

    <a href="http://automationpractice.com/index.php?controller=addresses" title="Addresses">
    

    Teriamos o elemento a própriamente dito, com os atributlos href e title. Eu achei melhor ir pelo title, mas se quisesse poderia ser pelo href, onde contenha a informação “address”, seria assim:

      element :botao_endereco, "a[href*='address']"
    

    Só que para sua situação, o segundo caso, com o href, vai lhe trazer 2 resultados de elementos, visto que no rodapé da página contém um elemento link para a mesma URL. Então, o ideal seria o mapeamento através do atributo title.

    Dica 2 (dica de ouro hehe): antes de sair mapeando os elementos direto no código de teste, mapei o mesmo via console do browser, um exemplo seria assim.

    0_1506351074068_mapeando objeto.png

    Espero ter ajudado! ^^



  • Reiterando e complementando o que o @vhsantos falou, inspecione o HTML e teste os seletores sempre, antes de colocá-los no código de teste… e pra testar XPath no Console do Chrome, basta usar $x("//algum/xpath")



  • Muito obrigado, valeu pelas dicas.



  • Eu consigo mapear um elemento span? O html da página:

    <p class="submit">
     <button type="submit" class="btn btn-default button button-medium"><span>Retrieve Password<i class="icon-chevron-right right"></i></span></button>
    </p>
    

    O class já tem outros trechos do código.

    class ForgotPasswordPage < SitePrism::Page
      element :retrieve_button, "span[class='Retrieve Password']" 	
    end
    

    Achei os seguintes exemplos do mapeamento na net:

    element :error, "span[class='help-block']"
    element :blurb, "span.result-decription"
    

    Ou neste caso seria melhor usar o xpath? Não sei se xpath é melhor solução por isso estou tentando de evitar.



  • @davidson-jacob Opa, tudo certo guri?

    Pode tentar da seguinte forma

    class ForgotPasswordPage < SitePrism::Page
       element :retrieve_button, "p.submit > button > span" 	
    end
    

    No caso, você está mapeando um elemento p com classe submit, onde dentro deste tem um elemento button, e dentro deste tem o span.



  • @davidson-jacob o ideal seria mapear com

    element :retrieve_btn, :field, 'Retrieve Password'
    

    Vê se funciona dessa forma.



  • @stefanteixeira Não deu certo. Mostrou este erro:

     Unable to find visible field "Retrieve Password" that is not disabled (Capybara::ElementNotFound)
    
    


  • @davidson-jacob estranho… esse botão tá habilitado mesmo?

    Se não der jeito é melhor nem mapear pelo site_prism, faz um find direto, mas dentro do page object correspondente. Melhor do que ficar usando seletores toscos ou usar xpath sem necessidade, além de ser muito mais legível. Por exemplo:

    class BlablaPage < SitePrism::Page
    
    element :outro_elemento, '.bla'
    
    def submit_form
      # preenche campos
     find('span', text: 'Retrieve Password').click
    end
    
    end
    


  • @stefanteixeira fiz alteração e parece que funcionou corretamente. Como mantenho o navegador aberto depois da conclusão dos testes?

    class RememberPassword < SitePrism::Page
    	element :retrieve_button, '.submit'
    	def submit_form
    		find('span', text: 'Retrieve Password').click
    	end
    end
    


  • @vhsantos Desta forma não encontrou o elemento. Usei a sugestão @stefanteixeira.



  • @davidson-jacob boa! Quer manter o navegador aberto pra que? Se quiser ver a tela em um determinado momento, vc pode tirar um screenshot ou debugar colocando binding.pry na linha de código exata onde vc queira debugar.

    Documentação de debugging do Capybara: https://github.com/teamcapybara/capybara#debugging
    Pra aprender a usar o pry: https://www.jackkinsella.ie/articles/debugging-rails-with-pry-debugger