2012-06-29 27 views
20

Tôi đang sử dụng ruby ​​trên đường ray 3.2.3 và capybara để giúp tạo thông số yêu cầu. Mục tiêu của tôi là tạo một yêu cầu spec để kiểm tra đăng xuất. Các trang web:Cách sử dụng capybara trong rspec để nhấp vào tùy chọn thả xuống

<li class="dropdown"> 
    <a class="dropdown-toggle" data-toggle="dropdown"> 
    Welcome <%= current_user.first_name + " "+ current_user.last_name%> 
    <b class="caret"></b> 
    </a> 
    <ul class="dropdown-menu"> 
    <a href="#"> 
     <%= link_to "Sign out", destroy_user_session_path, :method => :delete%> 
    </a> 
    </ul> 
</li> 

Đối với kiểm tra, tôi có

describe "sign out" do 
    it "should let user to sign out" do 
    login_as user, :scope => :user 
    # click_on "Welcome #{user.first_name} #{user.last_name}" 
    # Now click on Sign out 
    end 
end 

Tôi không biết làm thế nào để click vào Đăng xuất sử dụng Capybara vì nó là trong một trình đơn thả xuống, do đó không thể nhìn thấy tại trang. Có ai biết không ?

Có cách nào khác để nhấp vào một phần tử trong trình đơn thả xuống không?

+0

Tôi đã giải quyết vấn đề tương tự (trên menu thả xuống nút Khởi động Twitter) bằng cách chọn thẻ liên kết cụ thể: 'find ('a',: text => option_title) .click' –

Trả lời

5

Xin chào tôi đã tìm ra nó cuối cùng. Tôi đã phải sử dụng xpath để tìm liên kết. Dựa trên html ở trên, đây là những gì tôi đã làm:

Trong rspec, tôi đã viết:

page.find(:xpath, "//a[@href='/users/sign_out']").click 

Lý do tôi sử dụng "// a [@href = '/ người dùng/sign_out']" là vì link_to "Sign out", destroy_user_session_path, :method => :delete được biên dịch thành <a href="https://stackoverflow.com/users/sign_out" ... trên trang web.

Và nó hoạt động :-)

Oh bằng cách này, tôi tìm thấy liên kết này hữu ích: http://www.suffix.be/blog/click_image_in_link_capybara

+0

Tôi đã có thể thử nghiệm một trình đơn thả xuống rất giống nhau chỉ bằng cách thực hiện hai lần nhấp, một để mở menu thả xuống và một để nhấp vào liên kết. – DVG

+1

Đó cũng là những gì tôi nghĩ. Bạn có thể đăng một số mã không ? Nó sẽ là tuyệt vời nếu điều đó có thể được áp dụng cho html ở trên. Cảm ơn. – qusr

+0

Tôi tin rằng phần còn thiếu ở đây là cho phép Javascript cho các yêu cầu spec; thường là capybara-webkit (https://github.com/thoughtbot/capybara-webkit). Khi tính năng này được bật, khi đó, các nhấp chuột sẽ hoạt động khi trình duyệt của bạn hoạt động. –

7

tôi đã thử nghiệm một thả xuống ngay bằng cách nhấn vào liên kết cả hai

click_link "Welcome #{current_user.first_name} #{current_user.last_name}" 
click_link 'sub link' 
+0

Làm thế nào để bạn click_link "liên kết thả xuống". – qusr

+0

Đã thêm một số mã – DVG

+5

không hoạt động. – qusr

4

Một nhiều giải pháp dễ dàng hơn chỉ đơn giản là:

chọn ("tùy chọn bạn muốn chọn từ menu",: từ => "tên nhãn")

LƯU Ý: "Tên nhãn" là văn bản thực tế của <label>. Tuy nhiên, bạn cũng có thể sử dụng thuộc tính "id" hoặc "name" của số <select> ở đây, điều mà tôi nghĩ là tốt hơn vì bạn có thể thay đổi văn bản nhãn tại một số điểm và nếu bạn làm như vậy, các thử nghiệm của bạn sẽ vẫn vượt qua.

+2

" chọn "không hoạt động đối với hộp chọn không phải html các yếu tố. Câu hỏi là về "nút thả xuống trình đơn" (như twitter bootsrap một) mà không phải là html chọn hộp. –

+2

Câu trả lời này thực sự giải quyết tiêu đề của câu hỏi. Tôi đoán đó là lý do tại sao nó có nhiều phiếu bầu nhất. –

+1

Mã không phải là một lựa chọn, đó là mã đăng xuất của bootstrap. Vì vậy, chọn sẽ không hoạt động – Dean

1

Ví dụ của tôi cho điều này

find("ol.nya-bs-select.btn-default.form-control[ng-model='scope.values.countries']") 
    .find_button("Nothing selected").click 
1

Tôi đã có một vấn đề tương tự, nhưng thả xuống của tôi không có bất kỳ văn bản, chỉ có biểu tượng:

%li#user-menu.dropdown 
    %a.dropdown-toggle{ href: "#", data: { toggle: "dropdown" }, role: "button", aria: { haspopup: "true", expanded: "false" } } 
    %i.fa.fa-user 
    %span.caret 
    %ul.dropdown-menu 
    %li.logout-text= link_to "Log Out", destroy_user_session_path, :method => :delete 

Trong spec của tôi tôi đã sử dụng:

def when_I_sign_out 
    find('#user-menu').click 
    click_on 'Log Out' 
end 
Các vấn đề liên quan