Como posso verificar se um campo de formulário está preenchido corretamente usando a capivara?


145

Eu tenho um campo com uma etiqueta adequada que posso preencher com capivara sem problemas:

fill_in 'Your name', with: 'John'

Gostaria de verificar o valor que ele tem antes de preenchê-lo e não consigo descobrir.

Se eu adicionar após fill_ina seguinte linha:

find_field('Your name').should have_content('John')

Esse teste falha, embora o preenchimento pouco antes tenha funcionado como eu verifiquei ao salvar a página.

o que estou perdendo?

Respostas:


179

Você pode usar uma consulta xpath para verificar se há um inputelemento com um valor específico (por exemplo, 'John'):

expect(page).to have_xpath("//input[@value='John']")

Consulte http://www.w3schools.com/xpath/xpath_syntax.asp para obter mais informações.

Talvez de uma maneira mais bonita:

expect(find_field('Your name').value).to eq 'John'

EDIT: Hoje em dia eu provavelmente usaria have_selector

expect(page).to have_selector("input[value='John']")

Se você estiver usando o padrão de objeto da página (você deveria estar!)

class MyPage < SitePrism::Page
  element :my_field, "input#my_id"

  def has_secret_value?(value)
    my_field.value == value
  end
end

my_page = MyPage.new

expect(my_page).to have_secret_value "foo"

Ah, eu estava sentindo falta disso .value. Obrigado!
Marc-André Lafortune

Eu estava tendo o mesmo problema, mas com um div em vez de um campo de formulário. Para qualquer outra pessoa que tenha o mesmo problema, use find_by_id (). Text em vez de find_field (). Value. Levou-me idades de detectar esse valor só trabalhou em campos do formulário ...
John Y

8
O problema da última maneira é que ele não usa o ciclo de pesquisa da Capivara e, portanto, falhará instantaneamente se o campo for definido pelo código JS de execução mais longa. A primeira maneira é ter preferência, a menos que você esteja tentando isso em um formulário gerado estaticamente.
Fqxp

1
Acho que o @fqxp tem uma resposta melhor que usa o RSpec Matchers e a nova sintaxe de expectativa. Pelo que vejo na documentação, find_fielde outros Node::Finderssão usados ​​para encontrar nós e executar ações neles, em vez de expectativa. É claro que isso não é uma regra, mas para algo simples, como é o caso da solução incorporada, é uma idéia melhor. Apenas dizendo!
Agent47DarkSoul

É verdade que esperar seria a maneira preferida agora, no entanto, a sintaxe foi lançada cerca de um mês após essa pergunta.
DVG

309

Outra solução bonita seria:

page.should have_field('Your name', with: 'John')

ou

expect(page).to have_field('Your name', with: 'John')

respectivamente.

Veja também a referência .

Nota : para entradas desativadas, você precisará adicionar a opção disabled: true.


23
Muito melhor que a resposta selecionada!
Agent47DarkSoul

3
Eu ainda preferiria a resposta selecionada porque a mensagem de erro mostra as seqüências esperadas e reais. Isso fornece o "inútil campo esperado" meu campo "para retornar algo" erro. Mas este definitivamente lê melhor e segue melhor a API do comparador de páginas. Upvotes todo !!!
precisa saber é o seguinte

1
Pelo que sei, isso não confirma o valor do campo, apenas a presença do campo, independentemente do valor. Acho que é um bug, já que os documentos dizem que ele deve filtrar com base no valor.
Nick

1
withDefinitivamente, a passagem retornou true se o valor corresponder, para mim, qual é o resultado esperado.
Ben Saufley 21/07

4
Talvez a mensagem de erro tenha sido aprimorada desde que a resposta foi escrita pela primeira vez, mas agora encontro expected […] but there were no matches. Also found "", which matched the selector but not all filters..um campo vazio que se aproxima muito de uma mensagem de erro muito agradável.
Patru

2

Se você deseja testar especificamente um espaço reservado, use:

page.should have_field("some_field_name", placeholder: "Some Placeholder")

ou:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder")

Se você deseja testar o valor inserido pelo usuário:

page.should have_field("some_field_name", with: "Some Entered Value")

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.