Pregunta ¿Cómo obtener el nodo padre en Capibara?


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

?


74
2018-02-01 11:18


origen


Respuestas:


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,".//..") lo más probable es que resulte en una Ambiguous match error. En ese caso, use first(:xpath,".//..") en lugar.


101
2017-07-07 13:19



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

37
2018-02-01 14:06



Encontré lo siguiente que funciona:

find(:xpath, '..')

El carpincho se ha actualizado para apoyar esto.

https://github.com/jnicklas/capybara/pull/505


25
2017-08-16 01:11



Si te tropiezas con esto tratando de averiguar cómo encontrar a cualquier padre (como en antepasado) nodo (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"]')

8
2018-01-08 00:07



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.


4
2018-03-08 20:35



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.


3
2018-04-25 09:59



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.


2
2017-11-06 21:36



Aquí está

http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent

Hay un método principal presente;)


-5
2018-01-30 15:04