ruby - hacer - formulario de contacto html
Pepino, capibara y selenio: enviar un formulario sin un botón (12)
Con Webrat puedes simplemente:
When /^I submit the form$/ do
submit_form "form_id"
end
pag. 307, El libro de RSpec
Tengo una prueba con Cucumber, capibara y selenio. Esta prueba debe ir a un formulario y enviarlo. El texto normal sería
Scenario: Fill form
Given I am on the Form page
When I fill in "field1" with "value1"
And I fill in "field2" with "value2"
And I press "OK"
Then I should see "Form submited"
El problema es que no tengo el botón Aceptar en el formulario Necesito una forma de hacer el "formulario.enviar", sin hacer clic en ningún botón o vínculo, al igual que cuando presiona ENTRAR cuando se encuentra en un campo de formulario usando el navegador.
No sé cómo decirle a capibara que envíe un formulario. ¿Cómo puedo hacerlo?
Con el driver de selenio de capibara puedes hacer algo como esto:
within(:xpath, "//form[@id=''the_form'']") do
locate(:xpath, "//input[@name=''the_input'']").set(value)
locate(:xpath, "//input[@name=''the_input'']").node.send_keys(:return)
end
En pocas palabras: no puedes.
Algunos navegadores no le permitirán enviar un formulario sin un botón de envío (más notablemente, Internet Explorer <= 6). Entonces, este tipo de forma es una mala idea para empezar. Agregue un botón de enviar y colóquelo fuera de la pantalla con CSS.
Esto es un poco hackish, pero llenó una necesidad. He parchado el carpincho para apoyar un método #submit
en los elementos.
No es robusto porque ingenuamente crea los parámetros de POST a partir de los atributos de name
y value
de cada elemento de entrada. (En mi caso, todos mis elementos <input>
eran de tipo hidden
, por lo que funciona bien).
class Capybara::Node::Element
# If self is a form element, submit the form by building a
# parameters from all ''input'' tags within this form.
def submit
raise "Can only submit form, not #{tag_name}" unless tag_name =~ /form/i
method = self[''method''].to_sym
url = self[''action'']
params = all(:css, ''input'').reduce({}) do |acc, input|
acc.store(input[''name''], input[''value''])
acc
end
session.driver.submit(method, url, params)
end
end
...
form = find(''#my_form_with_no_submit_button'')
form.submit
La pantalla: ninguna solución no funciona con el carpincho que usa el controlador de selenio porque el selenio se queja de la interacción con elementos invisibles. Si prueba la solución anterior, puede terminar viendo el siguiente mensaje de error:
Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)
Probablemente deba dar su propio paso (y envíe el formulario con el enlace "Ok", por ejemplo), y emule la funcionalidad de envío usted mismo.
Aquí está la emulación de javascript eliminada en Rails 3 para admitir Javascript "discreto" (énfasis en las comillas). La línea
Capybara::Driver::RackTest::Form.new(driver, js_form(self[:href], emulated_method)).submit(self)
es probablemente la clave para responder a su problema. El código completo está here
Prueba esto..
find(:css, "input[name$=''login'']").native.send_keys :enter
Puede acceder al método selenium send_keys para invocar un evento de devolución como
find_field(''field2'').native.send_key(:enter)
Puedes intentar enviar una nueva línea:
find_field(''field2'').native.send_key("/n")
Solo tuve que resolver este problema yo mismo. En webrat tuve algo como esto:
Then /^I submit the "([^/"]*)" form$/ do |form_id|
submit_form form_id
end
Pude lograr lo mismo con esto en Capibara:
Then /^I submit the "([^/"]*)" form$/ do |form_id|
element = find_by_id(form_id)
Capybara::RackTest::Form.new(page.driver, element.native).submit :name => nil
end
Te recomiendo que agregues un botón de enviar y luego lo ocultes con CSS. Luego puede probar el envío del formulario, pero aun así obtener el comportamiento del usuario que desea.
Una solución simple:
When /^I submit the form$/ do
page.evaluate_script("document.forms[0].submit()")
end
Trabajó para mí con capybara-envjs. Debería trabajar con selenio también.