2010-05-09 7 views
23

У меня есть тест с использованием огурца, капибары и селена. Этот тест должен перейти к форме и представить ее. Нормальный текст будетОгурцы, капибара и селен - Отправка формы без кнопки

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" 

Проблема заключается в том, что у меня нет кнопки OK в виде мне нужен способ, чтобы сделать «form.submit», без нажатия на любую кнопку или ссылку - то же самое происходит, когда вы нажимаете ENTER, когда находитесь в поле формы, используя браузер.

Я не знаю, как сообщить capybara, чтобы отправить форму. Как мне это сделать?

ответ

31

Вы можете получить доступ к методу селен send_keys, чтобы вызвать событие возврата как

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

Помните, что по крайней мере для меня с полтергейстом в качестве драйвера вы должны использовать ': Enter' – PragTob

3

Проще говоря: вы не можете.

Некоторые браузеры не позволят вам отправить форму без кнопки отправки вообще (в первую очередь Internet Explorer < = 6). Так что эта форма - плохая идея для начала. Добавьте кнопку отправки и поместите ее с экрана с помощью CSS.

+5

дисплей: никто не приходит в голову. Он есть, но это не так! – Robus

+1

проблема в том, что я НЕ МОЖЕТ добавить кнопку, потому что я тестирую веб-сайт, я не могу изменить исходный код. –

+0

«Дисплей: нет» работал для меня. – samullen

1

Возможно, вы можете перевернуть свой собственный шаг (и я отправлю форму со ссылкой «ОК», например), и эмулировать функцию отправки самостоятельно.

Вот это эмуляция javascript, упавшая в Rails 3 для поддержки «ненавязчивого» (акцент на цитаты) Javascript. Линия

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

, вероятно, ключ к решению вашей проблемы. Полный код here

+0

это будет работать для Selenium driver? –

+0

думаю есть. Я использую форму отправки с диалоговыми окнами подтверждения без проблем в приложении прямо сейчас, и они работают правильно. – Chubas

19

Простое решение:

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

работал для меня с Капибара-envjs. Должен работать и с селеном.

+0

Также работает с Poltergeist. –

+0

Существует еще одно подобное решение: [page.execute_script ("$ ('form # your-form'). Submit()")] (http://stackoverflow.com/a/13712246/664833) - также проверьте из записки о [Capybara :: Session # execute_script] (http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session:execute_script) (она говорит, что '' execute_script' следует использовать над 'оценкой_скриптом' всякий раз возможно *) - это всего лишь часть информации для рассмотрения. – user664833

1

Я бы рекомендовал вам добавить кнопку отправки, а затем скрыть ее с помощью CSS. Затем вы можете проверить отправку формы, но все равно получите нужное поведение пользователя.

5

С помощью драйвера Selenium водосвинки вы можете сделать что-то вроде этого:

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

С Webrat вы можете просто:

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

р. 307, The Book RSpec

9

Я просто должен был решить эту проблему самостоятельно. В Webrat у меня был что-то вроде этого:

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

я смог достичь того же с этим в Капибаре:

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

трюк .. должен быть первым ответом –

+1

Это _awesome_, потому что он даже не требует javascript! Поэтому он не должен зависеть от реализации драйвера (как и все остальное в мире ...) В частности, он работает без js вообще. – bchurchill

0

Это немного хака, но наполнил потребность. Я обезглавил Capybara для поддержки метода #submit на элементах.

Он не является надежным, потому что он наивно создает параметры POST из атрибутов всех атрибутов входных элементов name и value. (В моем случае все мои элементы <input> были типа hidden, поэтому он отлично работает).

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 
1

Дисплей: нет решения не работает с водосвинкой использования драйвера селена, так как селен жалуется, взаимодействуя с невидимыми элементами. Если вы попытаетесь выше решение, которое вы можете в конечном итоге увидеть следующее сообщение об ошибке:

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

должен быть комментарий –

1

Вы можете попробовать отправить перевод строки:

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

Попробуйте это ..

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