2010-05-09 10 views
23

Ich habe einen Test mit Gurke, Capybara und Selen-Treiber. Dieser Test sollte zu einem Formular gehen und es einreichen. Der normale TextGurke, Capybara und Selen - Ein Formular ohne einen Knopf einreichen

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" 

Das Problem sein würde, ist, dass Ich habe nicht die OK-Taste in der Form ich einen Weg brauchen die „form.submit“ zu tun, ohne eine Schaltfläche oder einen Link zu klicken - Das gleiche passiert, wenn Sie in einem Formularfeld mit dem Browser die EINGABETASTE drücken.

Ich weiß nicht, wie Capybara ein Formular zu übermitteln. Wie kann ich es tun?

Antwort

31

können Sie die Methode Selen send_keys Zugriff auf eine Rückkehr Ereignis wie

find_field('field2').native.send_key(:enter) 
+0

Seien Sie sich bewusst, dass zumindest für mich mit Poltergeist als Treiber müssen Sie verwenden: Enter – PragTob

3

Einfach ausgedrückt: Sie können nicht.

In einigen Browsern können Sie kein Formular ohne Absenden-Schaltfläche senden (vor allem Internet Explorer < = 6). Diese Form ist also eine schlechte Idee. Fügen Sie eine Senden-Schaltfläche hinzu und positionieren Sie sie über den Bildschirm mit CSS.

+5

Anzeige: keiner denkt daran. Es ist da, aber es ist nicht! – Robus

+1

das Problem ist, dass ich die Schaltfläche nicht hinzufügen kann, da ich eine Website testen kann ich den Quellcode nicht ändern. –

+0

"display: none" funktionierte für mich. – samullen

1

Sie können wahrscheinlich Ihren eigenen Schritt (und ich überweise das Formular mit dem Link "Ok", zum Beispiel), und emulieren die Übermittlungsfunktionalität selbst.

Hier ist es die Javascript-Emulation in Rails 3 fallengelassen, um "unaufdringlich" (Hervorhebung der Zitate) Javascript zu unterstützen. Die Linie

Capybara::Driver::RackTest::Form.new(driver, js_form(self[:href], emulated_method)).submit(self) 

ist wahrscheinlich der Schlüssel, um Ihr Problem zu beantworten. Der vollständige Code ist here

+0

dies wird für Selenium-Treiber funktionieren? –

+0

Ich denke es tut. Ich benutze Formular-Übermittlung mit Bestätigungsdialogen ohne Probleme in einer Anwendung gerade, und sie funktionieren korrekt. – Chubas

19

Eine einfache Lösung:

When /^I submit the form$/ do 
    page.evaluate_script("document.forms[0].submit()") 
end 

für mich gearbeitet mit Capybara-envjs. Sollte auch mit Selen arbeiten.

+0

Funktioniert auch mit Poltergeist. –

+0

Es gibt eine andere ähnliche Lösung: [page.execute_script ("$ ('form # your-form'). Submit()")] (http://Stackoverflow.com/a/13712246/664833) - auch, überprüfen aus dem Hinweis zu [Capybara :: Session # execute_script] (http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session:execute_script) (es sagt * 'execute_script' sollte immer über 'evaluate_script' verwendet werden) möglich *) - das ist nur eine Information, die man beachten sollte. – user664833

1

Ich würde empfehlen, dass Sie eine Absenden-Schaltfläche hinzufügen und dann mit CSS ausblenden. Dann können Sie die Formularübergabe testen, erhalten aber trotzdem das von Ihnen gewünschte Benutzerverhalten.

5

Mit dem Capybara Selen-Treiber Sie so etwas tun kann:

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 
1

Mit webrat können Sie einfach:

When /^I submit the form$/ do 
    submit_form "form_id" 
end 

p. 307, The RSpec Buch

9

musste ich berufen gerade dieses Problem selbst lösen. In webrat hatte ich so etwas wie dieses:

Then /^I submit the "([^\"]*)" form$/ do |form_id| 
    submit_form form_id 
end 

konnte ich das gleiche mit diesen in Capybara erreichen:

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 
+2

tut der Trick .. sollte die erste Antwort –

+1

Dies ist _wesome_ weil es nicht einmal Javascript benötigt! Es sollte also nicht von der Implementierung des Treibers abhängen (wie alles andere auf der Welt ...). Insbesondere funktioniert es überhaupt nicht. – bchurchill

0

Das ist ein bisschen hackish, aber es füllte eine Notwendigkeit. Ich monkey-Patched Capybara, um eine #submit Methode auf Elementen zu unterstützen.

Es ist nicht robust, da sie ganz naiv die Parameter POST erzeugt von jedem Eingang der Elemente name und value Attribute. (In meinem Fall waren alle meine <input> Elemente vom Typ hidden, also funktioniert es gut).

1

Das Display: keine Lösung funktioniert nicht mit Capybara Selen-Treiber verwenden, weil Selen beschwert über die Interaktion mit unsichtbaren Elementen. Wenn Sie die obige Lösung versuchen Sie die folgende Fehlermeldung am Ende sehen kann:

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError) 
+0

sollte ein Kommentar sein –

1

können Sie versuchen, eine neue Zeile zu senden: Diese

find_field('field2').native.send_key("\n") 
0

Versuchen ..

find(:css, "input[name$='login']").native.send_keys :enter