ruby on rails - rack_test - ¿Cómo obtener el nodo padre en Capibara?
ruby on rails selenium (8)
Aquí está
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent
Hay un método principal presente;)
Estoy trabajando con muchos plugins jQuery, que a menudo crean elementos DOM sin identificación u otras propiedades de identificación, y la única forma de obtenerlos en Capybara (por ejemplo, hacer clic) es primero obtener su vecino (otro hijo de su ancestro) . Pero no encontré nada, ¿Capibara apoya tales cosas, por ejemplo?
find(''#some_button'').parent.fill_in "Name:", :with => name
?
Encontré lo siguiente que funciona:
find(:xpath, ''..'')
El carpincho se ha actualizado para apoyar esto.
Estoy usando un enfoque diferente al encontrar primero el elemento padre usando el texto dentro de este elemento padre:
find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name
Tal vez esto sea útil en una situación similar.
Necesitaba encontrar un ancestro con una clase CSS, aunque era indeterminado si el antecesor objetivo tenía una o más clases CSS presentes, así que no vi una forma de hacer una consulta determinista xpath. Trabajé esto en su lugar:
def find_ancestor_with_class(field, cssClass)
ancestor = field
loop do
ancestor = ancestor.find(:xpath, ''..'')
break if ancestor.nil?
break if ancestor.has_css? cssClass
end
ancestor
end
Advertencia: use esto con moderación, podría costarle mucho tiempo en las pruebas, así que asegúrese de que el ancestro esté a solo unos pasos de distancia.
No hay una manera de hacer esto con capibara y CSS. Sin embargo, he usado XPath en el pasado para lograr este objetivo, que tiene una forma de obtener el elemento padre y es compatible con Capybara:
find(:xpath, ''//*[@id="some_button"]/..'').fill_in "Name:", :with => name
Realmente encontré la respuesta de Jamuraa útil, pero ir por xpath completo me dio una pesadilla de una cuerda en mi caso, así que felizmente hice uso de la capacidad de concatenar hallazgos en Capibara, lo que me permitió mezclar la selección de css y xpath. Su ejemplo se vería así:
find(''#some_button'').find(:xpath,".//..").fill_in "Name:", :with => name
Actualización de Capybara 2.0 : find(:xpath,".//..")
muy probablemente resultará en un error de Ambiguous match
. En ese caso, use first(:xpath,".//..")
lugar.
Si te tropezaste con esto tratando de descubrir cómo encontrar cualquier nodo padre (como en ancestro ) (como se insinuó en el comentario de @ vrish88 en la respuesta de @Pascal Lindelauf):
find(''#some_button'').find(:xpath, ''ancestor::div[@id="some_div_id"]'')
Esta respuesta se refiere a cómo manipular un elemento hermano, que es lo que creo que la pregunta original alude a
Su hipótesis de pregunta funciona con un pequeño ajuste. Si el campo generado dinámicamente se ve así y no tiene un id:
<div>
<input></input>
<button>Test</button>
</div>
Su consulta sería entonces:
find(''button'', text: ''Test'').find(:xpath, "..").find(''input'').set(''whatever'')
Si la entrada generada dinámicamente se adjunta con un elemento id (tenga cuidado con estos aunque como en angular, que suelen cambiar en función de agregar y eliminar elementos) sería algo como esto:
find(''button'', text: ''Test'').find(:xpath, "..").fill_in(''#input_1'', with: ''whatever'')
Espero que ayude.