para hacer funcionalidad formulario enviar darle correo contacto como botones boton ruby selenium cucumber capybara

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.