2010-05-09 24 views
23

Tôi có thử nghiệm bằng cách sử dụng trình điều khiển Cucumber, capybara và selenium. Thử nghiệm này nên đi đến một biểu mẫu và gửi nó. Các văn bản bình thường sẽ làDưa chuột, capybara và selen - Gửi biểu mẫu không có nút

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" 

Vấn đề là Tôi không có nút OK theo hình thức Tôi cần một cách để làm "form.submit", mà không cần nhấp bất kỳ nút hoặc liên kết - giống như khi bạn nhấn ENTER khi bạn đang ở trong một trường biểu mẫu bằng cách sử dụng trình duyệt.

Tôi không biết cách yêu cầu capybara gửi biểu mẫu. Tôi làm nó như thế nào?

Trả lời

31

Bạn có thể truy cập vào các phương pháp selen send_keys để gọi một sự kiện trở lại như

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

Hãy lưu ý rằng ít nhất đối với tôi với poltergeist như một trình điều khiển, bạn phải sử dụng ': Enter' – PragTob

3

Chỉ cần đặt: bạn không thể.

Một số trình duyệt sẽ không cho phép bạn gửi biểu mẫu mà không có nút gửi nào cả (đáng chú ý nhất là Internet Explorer < = 6). Vì vậy, loại hình thức này là một ý tưởng tồi để bắt đầu. Thêm một nút gửi và định vị nó ra khỏi màn hình bằng CSS.

+5

hiển thị: không có trong tâm trí. Nó ở đó, nhưng nó không phải! – Robus

+1

vấn đề là tôi KHÔNG THỂ thêm nút, bởi vì tôi đang thử nghiệm một trang web tôi không thể thay đổi mã nguồn. –

+0

"display: none" làm việc cho tôi. – samullen

1

Bạn có thể cuộn bước của riêng bạn (Và tôi gửi biểu mẫu có liên kết "Ok", ví dụ) và tự mô phỏng chức năng gửi.

Đây là mô phỏng javascript đã giảm trong Rails 3 để hỗ trợ "không phô trương" (nhấn mạnh vào dấu ngoặc kép) Javascript. Dòng

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

có lẽ là đầu mối để giải đáp vấn đề của bạn. Mã đầy đủ là here

+0

tính năng này sẽ hoạt động với trình điều khiển Selenium? –

+0

Tôi nghĩ là vậy. Tôi đang sử dụng gửi biểu mẫu với hộp thoại xác nhận mà không gặp sự cố trong ứng dụng ngay bây giờ và chúng hoạt động chính xác. – Chubas

19

Một giải pháp đơn giản:

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

Làm việc cho tôi với Capybara-envjs. Nên làm việc với selen là tốt.

+0

Cũng hoạt động với Poltergeist. –

+0

Có một giải pháp tương tự khác: [page.execute_script ("$ ('form # your-form'). Submit()")] (http://stackoverflow.com/a/13712246/664833) - cũng có, kiểm tra ghi chú về [Capybara :: Session # execute_script] (http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session:execute_script) (nó nói * 'execute_script' nên được sử dụng trên' eval_script' bất cứ khi nào có thể *) - đây chỉ là một phần thông tin cần xem xét. – user664833

1

Tôi khuyên bạn nên thêm nút gửi, sau đó ẩn nó bằng CSS. Sau đó, bạn có thể kiểm tra việc gửi biểu mẫu, nhưng vẫn nhận được hành vi người dùng mà bạn muốn.

5

Với sự điều khiển Selenium Capybara bạn có thể làm một cái gì đó như thế này:

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

Với Webrat bạn có thể chỉ:

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

p. 307, The RSpec Sách

9

Tôi chỉ phải giải quyết vấn đề này bản thân mình. Trong webrat Tôi có một cái gì đó như thế này:

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

tôi đã có thể đạt được điều tương tự với này trong Capybara:

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

hiện các trick .. nên là câu trả lời đầu tiên –

+1

Đây là _awesome_ bởi vì nó thậm chí không yêu cầu javascript! Vì vậy, nó không nên phụ thuộc vào việc thực hiện của người lái xe (giống như tất cả mọi thứ khác trên thế giới ...) Đặc biệt, nó hoạt động với không có js cả. – bchurchill

0

Đây là một chút hackish, nhưng nó đầy một nhu cầu. Tôi khỉ Capybara vá để hỗ trợ một phương pháp #submit trên các yếu tố.

Nó không mạnh mẽ vì nó tạo ra các thông số POST một cách ngây thơ từ mọi thuộc tính namevalue của các yếu tố đầu vào. (Trong trường hợp của tôi, tất cả các thành phần <input> của tôi thuộc loại hidden, vì vậy nó hoạt động tốt).

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

Hiển thị: không có giải pháp nào không hoạt động với capybara sử dụng trình điều khiển selen vì selenium phàn nàn về tương tác với các phần tử vô hình. Nếu bạn cố gắng giải pháp trên bạn có thể sẽ nhìn thấy thông báo lỗi sau:

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

phải là nhận xét –

1

Bạn có thể thử gửi một dòng mới:

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

Hãy thử điều này ..

find(:css, "input[name$='login']").native.send_keys :enter 
Các vấn đề liên quan