Estoy trabajando con muchos complementos de jQuery, que a menudo crean elementos DOM sin id u otras propiedades de identificación, y la única forma de obtenerlos en Capybara (por ejemplo, para hacer clic) es obtener primero a su vecino (otro hijo de su antepasado) . Pero no encontré en ninguna parte, ¿Capybara admite tales cosas, por ejemplo:
find('#some_button').parent.fill_in "Name:", :with => name
?
Respuestas:
Realmente encontré útil la respuesta de Jamuraa, pero ir a xpath completo me dio una pesadilla de cadena en mi caso, así que felizmente hice uso de la capacidad de concatenar find's en Capybara, 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 produzca unAmbiguous match
error. En ese caso, utilicefirst(:xpath,".//..")
en su lugar.fuente
.//..
encontrar al padre, solo es..
suficiente, y eso tampoco es ambiguo.No hay forma 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 principal y es compatible con Capybara:
find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
fuente
find(:xpath, '//*[@id="some_button"]/..')
Encontré lo siguiente que funciona:
find(:xpath, '..')
Capybara se ha actualizado para admitir esto.
https://github.com/jnicklas/capybara/pull/505
fuente
Si se encontró con esto tratando de averiguar cómo encontrar cualquier nodo principal (como en el ancestro ) (como se indica en el comentario de @ vrish88 sobre la respuesta de @Pascal Lindelauf):
find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')
fuente
Esta respuesta se refiere a cómo manipular un elemento hermano, que es a lo que creo que alude la pregunta original
La hipótesis de tu pregunta funciona con un pequeño ajuste. Si el campo generado dinámicamente se ve así y no tiene una identificación:
<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 viene adjunta con un elemento de identificación (tenga cuidado con estos, aunque como en angular, 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.
fuente
Estoy usando un enfoque diferente al encontrar el elemento principal primero usando el texto dentro de este elemento principal:
find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name
Quizás esto sea útil en una situación similar.
fuente
Necesitaba encontrar un ancestro con una clase css, aunque era indeterminado si el ancestro objetivo tenía una o más clases css presentes, por lo que no vi una forma de hacer una consulta xpath determinista. 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 antepasado esté a solo unos saltos de distancia.
fuente
break if ancestor[:class].split(" ").include?(css_class)
.ancestor(selector)
método incorporado. Ver github.com/teamcapybara/capybara/commit/…Aquí está
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent
Hay un método padre presente;)
fuente