2011-11-02 10 views
5

Tôi đang cố gắng kiểm tra việc chọn một tùy chọn từ thẻ chọn (các tùy chọn này được tìm nạp từ máy chủ cơ sở dữ liệu từ xa). Trong quá trình giao tiếp thông thường với trang web, không mất quá một phần nhỏ số giây để điền vào danh sách thả xuống này. Tuy nhiên, khi tôi chạy thử nghiệm sau,Capybara không chờ yêu cầu ajax hoàn thành

 


    When /^(?:|I)select "([^"]*)" from "([^"]*)" in search form$/ do |value, field| 
     within "#select_container" do 
     save_and_open_page 
     page.should have_css("#criteria_div_code > option:nth-child(10)") 
     select(value, :from => field) 
     end 
    end 

 

tôi nhận được lỗi sau,

expected css "#criteria_div_code > option:nth-child(10)" to return something (RSpec::Expectations::ExpectationNotMetError)

Các thả xuống là dân cư với ít nhất 20 tùy chọn và vì vậy tôi chỉ kiểm tra sự hiện diện của Tùy chọn thứ 10 (hiện tại).

save_and_open_page cho thấy chỉ có một tùy chọn (tùy chọn mặc định) tồn tại thay vì ít nhất 10 và do đó "ExpectionNotMetError" xuất hiện.

Capybara.default_wait_time = 30 - Thời gian dồi dào cho danh sách được điền.

Không phải là capybara đang chờ cuộc gọi ajax kết thúc?

Tôi có thiếu gì đó ở đây không?

+0

Bạn đã gắn thẻ kịch bản là '@ javascript' chưa? – Chowlett

Trả lời

0

Tôi đoán bạn cần phải điều khiển người dùng js để thử nghiệm ajax,

describe 'some stuff which requires js', :js => true do 
    it 'will use the default js driver' 
    it 'will switch to one specific driver', :driver => :celerity 
end 

Cũng lưu ý các dòng sau - Capybara có thể chặn và chờ đợi cho các yêu cầu Ajax để kết thúc sau khi bạn đã tương tác với trang. Để kích hoạt hành vi này, hãy đặt tùy chọn: resynchronize driver thành true.

2

Bạn có thể muốn kiểm tra phản hồi của tôi để đặt thời gian chờ cho đồng bộ hóa lại ajax Using Capybara for AJAX integration tests. Thời gian chờ đồng bộ hóa mặc định là 10 giây và nếu phản hồi của bạn không quay trở lại trước thời điểm đó, bạn sẽ không nhận được bất kỳ phản hồi nào đặc biệt nếu bạn đã đặt: đồng bộ hóa thành sai trong cấu hình của bạn. bên dưới là một đoạn mã để đặt thời gian chờ đó

Capybara.register_driver :selenium do |app| 
    Capybara::Selenium::Driver.new(app, :browser => :firefox, :resynchronization_timeout => 1000) 
end 

LƯU Ý: nếu trước đó bạn đặt: đồng bộ hóa thành false, bạn cần đặt điều này thành đúng.

+2

Với phiên bản 'Capybara' 2.0.3, lỗi này:' tùy chọn không xác định: {: resynchronization_timeout => 1000} (ArgumentError) ' – etagwerker

+0

@etagwerker bạn nói đúng. Các tùy chọn đồng bộ hóa đã bị xóa khỏi trình điều khiển Selenium và vì vậy có thể không hoạt động đối với phiên bản trình điều khiển Selenium mới hơn. Giải pháp trên là dành cho phiên bản Capybara nhỏ hơn 2.0.3 kèm theo phiên bản cũ hơn của trình điều khiển Selenium. –