2013-11-01 20 views
8

Rõ ràng, sleep hoặc wait_until không hợp lệ khi sử dụng các phiên bản gần đây của Capybara, theo số webpageupdates.Capybara có cần ngủ để làm việc không?

Tuy nhiên, tôi có một tập hợp các thử nghiệm chỉ hoạt động trên các máy nhanh nếu tôi thêm một cuộc gọi sleep(1) vào thử nghiệm. Nghĩa là, một bài kiểm tra đó trông giống như:

describe "dosimeters page" do 
    before do 
    click_link("Dosimeter Read History", :match=>:first) 
    end 
... 

trở thành

describe "dosimeters page" do 
    before do 
    unix_wait 
    click_link("Dosimeter Read History", :match=>:first) 
    end 
... 

nơi tôi đã xác định unix_wait như:

def unix_wait 
    case RbConfig::CONFIG['host_os'] 
    when /darwin/ 
    when /linux-gnu/ 
    sleep(1) 
    end 
end 

Có điều là, tôi có một tuổi Ubuntu 12.04 quadcore máy tính xách tay chạy các thử nghiệm này trên Jenkins, và mọi thứ hoạt động tốt trên nó mà không có các cuộc gọi unix_wait. Các bài kiểm tra thất bại ngẫu nhiên trên một máy tính để bàn hexacore chạy Ubuntu 13,10 và trên một máy tính xách tay macbook pro, nhưng nếu tôi thêm vào các cuộc gọi unix_wait, sau đó các bài kiểm tra vượt qua.

Bản thân các lỗi thử nghiệm là dấu hiệu của lỗi tải (ví dụ, các phần tử css thiếu trên một số lần chạy, nhưng không phải trên các số khác) và những thứ đang được thử nghiệm thực sự hoạt động khi trang web được tải theo cách thủ công.

Vậy hành động thích hợp ở đây là gì? Rõ ràng, sleep không được phép trong khi thử nghiệm, cũng không phải là wait_until. Tuy nhiên, giấc ngủ đang hoạt động, nhưng nó có vẻ rất thô lỗ với tôi. Tôi có nên xem #synchronized không? Từ những gì tôi thu thập từ các bài đăng trên blog đó, điều đó đã được gọi khi tôi gọi click_link và các thử nghiệm vẫn không thành công.

Giao thức được chấp nhận ở đây là gì?

Tôi nên thêm, bởi vì tôi nghĩ điều đó quan trọng: Đây là tất cả các bài kiểm tra javascript. Tôi đang sử dụng capybara-webkit được xây dựng trên qt4 (không phải qt5). Tôi đang xem xét chuyển sang poltergeist hoặc một số trình điều khiển javascript khác như là một bước gỡ lỗi.

+0

Bạn có thể thử sử dụng trình gỡ lỗi web để gỡ lỗi nhưng tôi có các vấn đề tương tự trong đó. –

+0

Tôi gặp vấn đề tương tự với capybara-webkit khi tôi sử dụng ajax. Tôi không biết liệu poltergeist có thể giải quyết vấn đề này hay không, nhưng nó đáng để thử. – basgys

+0

Bạn có thể giải thích thêm về những thất bại bạn đang thấy không? Tôi không rõ những gì "yếu tố css thiếu" thực sự đòi hỏi. – Shepmaster

Trả lời

4

Trong trường hợp bạn không làm điều này, trong xác nhận thử nghiệm của bạn nếu bạn kiểm tra nội dung trên trang, nó sẽ chờ một khoảng thời gian cho đến khi nội dung đó có sẵn.

Vì vậy, thay vì thêm một giấc ngủ bạn có thể thêm một cái gì đó giống như

expect(page).to have_content 'Success' 

Capybara chứa Ajax và tải các yếu tố vv để nó sẽ đợi ngầm khi kiểm tra nội dung.

Bạn có thể thay đổi thời gian chờ đợi mặc định nếu bạn cần phải cho phép tải các yếu tố mà bạn biết có thể mất nhiều thời gian tức là thứ 3 truy vấn tiệc tùng/đăng nhập

Capybara.default_wait_time = 5 
+1

Capybara _should_ có khả năng chứa Ajax, nhưng tôi không hoàn toàn chắc chắn rằng nó là, vì đây là những thất bại khi sử dụng ': js => true' trong quá trình thử nghiệm. Thay đổi 'default_wait_time' không thực sự hữu ích, nhưng đôi khi' save_and_open_page' sửa vấn đề (mặc dù gây ra một cửa sổ để làm gián đoạn công việc). – mmr

+0

Asta đúng, vấn đề là bạn không kích hoạt cơ chế chờ đợi của Capybara, bởi vì bạn không kiểm tra nội dung. Asta đề cập đến việc kiểm tra 'has_content', và bạn không làm gì cả. – kross

+0

Điều này cũng được trả lời ở đây: http://stackoverflow.com/a/20003280/2363935 – kross

0

Một lựa chọn tốt của wait_untilsleepusing_wait_time, một ví dụ trong số đó được hiển thị bên dưới.

using_wait_time 5 do 
    page.should have_content '<content>' 
end 

Bạn cũng có thể tải lại trang, sau đó bạn có thể kiểm tra bất kỳ điều kiện nào bạn có. Điều này làm việc cho tôi ở lần.

visit current_url 
Các vấn đề liên quan