rails rack_test feature ruby-on-rails ruby cucumber bdd capybara

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

?



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.