1

我使用Capybara和Minitest來測試我的rails 4應用程序。我正在嘗試通過AJAX加載Google Map和colorbox。設置Javascript驅動程序後水豚::驅動::基本#evaluate_script錯誤

我們需要確保AJAX正在檢查某個元素之前加載,並試圖遵循本教程: https://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara

大多數教程都使用Rspec的,所以我將代碼放在test_helper.rb

class ActionDispatch::IntegrationTest 
    # Make the Capybara DSL available in all integration tests 
    include Capybara::DSL 
    include Warden::Test::Helpers 
    Warden.test_mode! 

    Capybara.default_max_wait_time = 5 
    Capybara.javascript_driver = :webkit 

    def wait_for_ajax 
    page.evaluate_script("jQuery.active") == 0 
    yield 
    end 
end 

通過其他人得到錯誤,看起來他們沒有安裝capybara-webkit gem。但是,我們這樣做:

運行bundle install

... 
Using capybara 2.5.0 
Using capybara-webkit 1.7.1 

這是我失敗的測試:

test "colorbox should appear on pageload" do 
    visit trips_new_path 
    wait_for_ajax do 
     assert_selector "#colorbox", "colorbox not created on trips/new" 
    end 
end 

而我收到的錯誤:

Capybara::NotSupportedByDriverError:   Capybara::NotSupportedByDriverError: Capybara::Driver::Base#evaluate_script 
      test/test_helper.rb:35:in `wait_for_ajax' 
      test/integration/trip_creation_test.rb:17:in `block in <class:TripCreationTest>' 

我已經嘗試在幾個不同的地方設置JavaScript,但它似乎仍然不工作。

更新:嘗試更多的語法和得到同樣的錯誤:

def wait_for_ajax 
    Capybara.javascript_driver = :webkit 
    Timeout.timeout(Capybara.default_wait_time) do 
     loop until finished_all_ajax_requests? 
    end 
    end 

    def finished_all_ajax_requests? 
    page.evaluate_script('jQuery.active').zero? 
    end 

預先感謝您的幫助!

+0

我覺得'page.evaluate_script(「jQuery.active」)== 0'語法有錯誤 – fabersky

+0

謝謝你的回覆。我從教程中嘗試了一個額外的語法,但我仍然收到相同的錯誤。用新代碼更新我的問題。 – CHawk

+0

嘗試改變你的測試從'測試'colorbox應該出現在頁面加載「做」到'描述「colorbox應該出現在頁面加載」,:js => true do' – fabersky

回答

2

事實上,您得到一個NotSupportedByDriver錯誤意味着您的測試實際上並未使用capybara-webkit驅動程序,並且可能仍在使用默認的racktest驅動程序。您需要指定特定的測試應該使用支持JavaScript的驅動程序。如果您使用的是類似https://github.com/wojtekmach/minitest-capybara的東西,您可以查看gems自述文件以查看如何手動指定它的示例,或者設置以便您可以使用元數據標記測試。一旦使用正確的驅動程序進行了測試,您可能會發現實際上並不需要wait_for_ajax方法,因爲Capybaras查找程序會自動等待內容出現。

相關問題