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?

Marc-André Lafortune
fonte

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"
DVG
fonte
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.

fqxp
fonte
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")
Jim Stewart
fonte
0

Fiquei pensando em como fazer algo um pouco diferente: queria testar se o campo tinha algum valor (enquanto utilizava a capacidade da Capivara de testar novamente o matcher até que ele corresponda ). Acontece que é possível usar um "bloco de filtro" para fazer isso:

expect(page).to have_field("field_name") { |field|
  field.value.present?
}
Jonleighton
fonte