¿Cómo puedo comprobar que un campo de formulario se rellena correctamente con carpincho?

145

Tengo un campo con una etiqueta adecuada que puedo rellenar con carpincho sin ningún problema:

fill_in 'Your name', with: 'John'

Me gustaría verificar el valor que tiene antes de completarlo y no puedo entenderlo.

Si agrego después de fill_inla siguiente línea:

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

Esa prueba falla, aunque el relleno justo antes funcionó como he verificado al guardar la página.

¿Qué me estoy perdiendo?

Marc-André Lafortune
fuente

Respuestas:

179

Puede usar una consulta xpath para verificar si hay un inputelemento con un valor particular (por ejemplo, 'John'):

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

Consulte http://www.w3schools.com/xpath/xpath_syntax.asp para obtener más información.

Quizás por una forma más bonita:

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

EDITAR: hoy en día probablemente usaría have_selector

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

Si está utilizando el patrón de objeto de página (¡debería estarlo!)

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
fuente
Ah, me faltaba un .valuepoco. ¡Gracias!
Marc-André Lafortune
Estaba teniendo el mismo problema, pero con un campo div en lugar de un formulario. Para cualquier otra persona que tenga el mismo problema, use find_by_id (). Text en lugar de find_field (). Value. Me tomó las edades de detectar que el valor sólo se trabajó en los campos de formulario ...
John Y
8
El problema con esta última forma es que no utiliza el ciclo de sondeo de Capybara y, por lo tanto, fallará instantáneamente si el campo se establece mediante un código JS de ejecución más larga. La primera forma es preferible a menos que esté intentando esto en un formulario generado estáticamente.
fqxp
1
Creo que @fqxp tiene una mejor respuesta que utiliza RSpec Matchers y la nueva sintaxis de expectativa. Por lo que veo en la documentación, find_fieldy otros Node::Findersse utilizan para encontrar nodos y realizar acciones en ellos en lugar de las expectativas. Por supuesto, esto no es una regla, pero para algo simple como esto, ir con la solución incorporada es una mejor idea. ¡Solo digo!
Agent47DarkSoul
Es cierto que esperar sería la forma preferida ahora, sin embargo, esa sintaxis se lanzó aproximadamente un mes después de esta pregunta.
DVG
309

Otra bonita solución sería:

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

o

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

respectivamente.

Ver también la referencia .

Nota : para las entradas deshabilitadas, deberá agregar la opción disabled: true.

fqxp
fuente
23
¡Mucho mejor que la respuesta seleccionada!
Agent47DarkSoul
3
Todavía preferiría la respuesta seleccionada porque el mensaje de error muestra las cadenas esperadas y reales. Esto le da al inútil "campo esperado" mi campo "para devolver algo" error. Pero este definitivamente se lee mejor y sigue mejor la API de comparación de páginas. ¡Votaciones a su alrededor!
mraaroncruz
1
Por lo que puedo decir, esto en realidad no confirma el valor del campo, solo la presencia del campo, independientemente del valor. Supongo que es un error ya que los documentos dicen que debería filtrarse en función del valor.
Nick
1
Pasar withdefinitivamente solo devuelve verdadero si el valor coincide, para mí, que es el resultado esperado.
Ben Saufley
44
Tal vez el mensaje de error ha mejorado desde que se escribió la respuesta por primera vez, pero ahora llego expected […] but there were no matches. Also found "", which matched the selector but not all filters..a un campo vacío que se acerca mucho a un mensaje de error muy agradable.
Patru
2

Si desea probar específicamente un marcador de posición, use:

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

o:

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

Si desea probar el valor introducido por el usuario:

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