what rails and capybara attachment

rails - rspec and capybara



¿Es posible interactuar con elementos ocultos con capibara? (7)

Tengo un campo de archivo que tiene opacity: 0 y está superponiendo un botón falso. Es una técnica de css común para simular una especie de "botón de carga" que se muestra de manera consistente en diferentes navegadores.

Capybara no me permite llamar a attach_file en esa entrada. El error es Selenium::WebDriver::Error::ElementNotVisibleError: Element is not currently visible and so may not be interacted with .

¿Alguien sabe alguna forma de forzar a los capibaras a interactuar con elementos invisibles?

La respuesta sigue sin respuesta, pero he encontrado una solución. Nada inteligente, solo haz visible el elemento con un simple script.

page.execute_script %Q{ $(''#photos'').css({opacity: 1, transform: ''none''}); }

Lo publico para el registro.


En general, la interacción con elementos no visibles no debería ser posible cuando se usa Capybara (puede encontrarlos usando la opción visible: false/hidden en la mayoría de los buscadores, pero en realidad no hacerles nada). Sin embargo, la entrada del archivo es un caso especial debido a lo común que es ocultar el elemento y, debido a las restricciones de seguridad, no hay otra forma de agregar un archivo interactuando con los elementos visibles de las páginas. Debido a esto, attach_file tiene una opción make_visible que se puede usar para que Capybara haga visible el elemento, adjunte el archivo y luego restablezca el CSS a la configuración original.

attach_file(''photos'', file_path, make_visible: true)


Lo he hecho de esta manera con elementos que tienen la display:none; estilo CSS display:none; conjunto:

page.execute_script("$(''.all-hidden-elements'').show();"); all(''.all-hidden-elements'').first.click


Miquel, gracias por trabajar.

Tengo un problema similar para interactuar con la entrada de archivos ocultos en el enlace de C # para Selenium Webdriver 2.35 y Firefox 24. Para que la selección de archivos funcionara, hice un truco similar:

((IJavaScriptExecutor)webdriver).ExecuteScript("$(''#fileUploadInput'').css({opacity: 1, transform: ''none''});"); IWebElement e = webdriver.FindElement(By.CssSelector("input#fileUploadInput"))); e.SendKeys("c://temp//inputfile.txt");


Puedes interactuar con elementos ocultos usando la propiedad visible: false en Capybara.

Si desea hacer clic en el uso de elementos ocultos:

find("#photos", visible: false).click

No use click_button(''#photo'') directamente


Si el elemento oculto está anidado en un elemento primario visible (por ejemplo, una entrada oculta dentro de una etiqueta visible), puede hacer clic en el elemento primario en su lugar. Si aún desea encontrar la entrada por ID, puede dirigirse al padre de esta manera:

find(''#hidden_input'').find(:xpath, ''..'').click


Terminé resolviéndolo por una ruta diferente.

execute_script() me estaba dando un tiempo difícil (congelaría la ejecución de la prueba en FireFox), así que esto fue lo que hice:

Ya tenía un archivo javascript apropiado. Agregué lo siguiente

<% if ENV["RAILS_ENV"] == "test" %> $(''#photos'').show() <% end %>

También tuve que agregar .erb a mi archivo javascript para el manejo adecuado de los activos de Rails.

Y en mi archivo de prueba, ya estaba configurando ENV["RAILS_ENV"] = "test"

De esta manera, podría simplemente silenciar la interfaz de usuario para la prueba y, sin embargo, mantener la apariencia de la producción.