2011-11-17 7 views
6

Tôi đang sử dụng capybara để kiểm tra ứng dụng đường ray của tôi để thử nghiệm tích hợp. Trong ứng dụng của tôi có nhiều cuộc gọi Lightbox và Ajax và js.Làm thế nào để thêm điều kiện chờ đợi trong kịch bản capybara?

@javascript 
    Scenario: I agree functionatilty 
    Given I go to the create account page 
    When I click on button which is given as image "lnkTerms2" 
    And I follow "i_agree" 
    Then I go to the create account page 

Mã trên đây lnkTerms2 và id sẽ giúp gọi hàm js để mở hộp đèn. Và tôi đang nhận được một lỗi như

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotDisplayedError) 
     [remote server] resource://fxdriver/modules/atoms.js:9519:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:256:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:305:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:320:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:197:in `unknown' 
     (eval):2:in `send' 
     (eval):2:in `click_link' 
     ./features/step_definitions/web_steps.rb:300:in `/^I click on button which is given as image "([^"]*)"$/' 
     features/Sign_up_process.feature:61:in `When I click on button which is given as image "lnkTerms2"' 

Vấn đề là như chức năng này được gọi là trong webdriver, nó không nhận được thời gian để tải javascript và cuộc gọi ajax. Và hộp đèn không mở. Vì vậy, hãy đề xuất cho tôi bất kỳ giải pháp nào.

Ngoài ra nếu giả sử tôi viết dòng

When I click on button which is given as image "lnkTerms2" 

sau 4-5 tuyên bố sau đó nó đang làm việc tốt như nó được thời gian để tải js.

Trả lời

3

Đối với một tạm dừng sau khi bước để chờ ajax thử:

And I wait 5 seconds 

của bạn phải thêm vào web_steps.rb mã tiếp theo:

When /^I wait (\d+) seconds?$/ do |seconds| 
    sleep seconds.to_i 
end 
+4

đó không phải là một giải pháp tốt, nó thêm một sự chậm trễ buộc phải thực hiện kiểm tra của bạn, nếu tái sử dụng này có thể thêm rất nhiều thời gian. cách thích hợp để giải quyết vấn đề này đang chờ cho đến khi một phần tử hiển thị. – Benja

+4

bất kỳ hình thức nào của giấc ngủ cố định, ngay cả khi nó lấy giá trị từ kịch bản nói chung là một ý tưởng khủng khiếp, trừ khi kịch bản thực sự là về trải nghiệm người dùng liên quan đến việc chờ đợi khoảng thời gian cụ thể đó (như trái ngược chờ hiển thị cập nhật vv , ví dụ 'đồng bộ hóa') –

1

Chờ đợi đối với một số cố định của giây trong hy vọng rằng kịch bản của bạn sẽ đủ nhanh không phải là chiến lược tốt nhất, bởi vì nó có thể dẫn đến thất bại kiểm tra ngẫu nhiên. Tôi khuyên bạn nên đợi cho đến khi một số điều kiện được đáp ứng thay vì:

And I wait until '#meow' is visible 

#... 
When /^I wait until '([^']+)' is visible$/ do |selector| 
    wait_until do # you can also specify timeout here 
    find(selector).visible? 
    end 
end 
+7

wait_until không khả dụng ở Capybara 2 –

+0

Điểm chung về thời gian chờ cố định là xấu vẫn đúng. Xem thảo luận tại đây: https://groups.google.com/forum/?fromgroups=#!topic/ruby-capybara/qQYWpQb9FzY là lý do tại sao họ xóa wait_until .. –

+2

'find (selector)' là đủ thay vì 'wait_until này 'block if' Capybara.ignore_hidden_elements = true'. Nếu nó sai, 'tìm (selector, visible: true)' có thể được sử dụng –

12

Nói chung cố định ngủ/chờ đợi là một điều xấu .. Họ là một cách tiếp cận sức mạnh vũ phu mà một trong hai kết quả trong kịch bản giòn, kịch bản chậm, hoặc thường cả. Nếu bạn không đặt chúng đủ lâu sau đó đôi khi kiểm tra phá vỡ, nếu bạn đặt chúng quá dài, sau đó kiểm tra không bao giờ phá vỡ nhưng họ là SLOW vì tất cả các ngón tay cái cố định twiddling thời gian.

Hầu hết các công cụ tự động hoặc chăm sóc chờ đợi automagically, hoặc họ cung cấp cách duyên dáng hơn để đồng bộ hóa các kịch bản của bạn với ứng dụng của bạn

A recent blog posting by JNicklas explanes một số thay đổi gần đây Capybara trong vấn đề này, đưa ra một số ví dụ về một số cách để làm loại mã chờ đợi cụ thể cho một số trường hợp đặc biệt và nói chung khuyên bạn nên tìm hiểu thêm về công cụ và cách nó xử lý việc chờ đợi nội dung, hành động ajax và đồng bộ hóa.