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

Log in to reply

Looks like your connection to Agile Testers was lost, please wait while we try to reconnect.