2013-04-19 51 views
4

在rspec的功能的情況,我有:水豚-的WebKit不能模擬點擊(非鏈接/按鈕)元素

scenario 'shows things', js: true do 

    page.find('#my_div').trigger(:click) 

這似乎並不火jQuery的處理程序是此元素的click事件。在調試器中,這個調用返回一個空字符串「」。

capybara-webkit應該能夠通過jQuery處理程序來觸發ajax請求來更新dom來模擬鼠標事件嗎?如果是這樣,這個案件的任何建議? 我從selenium-webdriver切換,因爲不支持水豚#trigger方法。

,並試圖觸發jQuery的事件直接引發一個錯誤:

page.execute_script "$('#masthead .fclass').trigger('click')" 

Capybara::Webkit::InvalidResponseError: 
     Javascript failed to execute 

我的Gemfile有

group :test do 
    gem 'capybara' 
    gem "database_cleaner", "~> 0.9.1" 
    gem 'capybara-webkit', git: 'git://github.com/thoughtbot/capybara-webkit.git' 
    gem 'launchy' 
end 

我使用的是 '邊緣' capybara- webkit,因爲我遇到了xpath錯誤,否則(v2.04?)。

我一直沒能得到一個日誌的JavaScript錯誤的,雖然我嘗試添加在規格/ spec_helper.rb架例外:

ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'rspec/autorun' 
require 'capybara/rspec' 
require 'rack/utils' 
Capybara.app = Rack::ShowExceptions.new(MyApp::Application) 

# Requires supporting ruby files with custom matchers and macros, etc, 
# in spec/support/ and its subdirectories. 
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

RSpec.configure do |config| 
    #... 

    Capybara.javascript_driver = :webkit 

    config.before (scope = :suite) do 
    %x[bundle exec rake assets:precompile] 
    end 

    config.use_transactional_fixtures = false 

    config.before(:suite) do 
    DatabaseCleaner.strategy = :truncation 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.before(:each) do 
    DatabaseCleaner.clean 
    end 

    config.infer_base_class_for_anonymous_controllers = false 
end 

更新: 我代替水豚,用的WebKit

gem 'poltergeist' 

而且在規格/ spec_helper.rb:

require 'capybara/poltergeist' 
    ... 
    Capybara.register_driver :poltergeist do |app| 
     Capybara::Poltergeist::Driver.new(app, { debug: true }) 
    end 
    Capybara.javascript_driver = :poltergeist 
    Capybara.current_driver = :poltergeist 

我從頁(「#添加my_id」)的控制檯中看到這些錯誤信息的觸發(「點擊」):

... 
{"name"=>"click", "args"=>[3, 2]} 
poltergeist [1366370900594] state default -> mouse_event 
poltergeist [1366370900596] state mouse_event -> loading 
Not allowed to load local resource: file:///home/me/rails/my_app/public/assets_test/application.css 
... 
Not allowed to load local resource: file:///home/me/rails/my_app/public/assets_test/application.js 

我嘗試和chmod的吵鬧鬼寶石權限,但相同的結果。

,並試圖運行page.execute_script(%Q($( 「添加my_id」)觸發( '點擊'))) 給出了一個jQuery未定義的錯誤類型:

ReferenceError: Can't find variable: $ 
      at phantomjs://webpage.evaluate():1 
      at phantomjs://webpage.evaluate():1 
      at phantomjs://webpage.evaluate():1 
      at phantomjs://webpage.evaluate():1 
+0

選擇器內是否有空元素?這可能是這個bug: https://github.com/thoughtbot/capybara-webkit/issues/494 – RobinGower

+0

poltergeist是一個無頭瀏覽器,你有沒有試過在瀏覽器中打開這個頁面,以便你可以看到哪些元素是在頁面上?您可以簡單地在您的功能中調用「save_and_open_page」。 – Mattherick

回答

6

我遇到的問題和解決方案:

1)水豚觸發器()方法不支持selenium-webdriver或capybara-webkit。

  • 的解決方案:直接從JavaScript觸發jQuery的事件:page.execute_script(%Q($("#...雖然這不是有用,因爲它可能是對用戶不可見的元素觸發事件。

2)save_and_open_page不使用資產管道,因此如果您有隱藏的可點擊元素則相當無用。該騷靈驅動程序有save_screenshot,它的工作原理,但它不是有用,因爲具有與該資產真正的瀏覽器頁面加載

  • 的解決方案:預編譯的資產在測試中,雖然我不能讓jQuery來與任何負載驅動器($是未定義)和poltergiest/phantomjs不允許訪問本地編譯的文件(通過命令行選項給司機有沒有影響)

  • 更好的解決方案:使用未發佈的水豚2.1+ gem 'capybara', git: 'git://github.com/jnicklas/capybara.git',加Capybara.asset_host = "http://localhost:3000"到spec_helper .rb並使開發者服務器運行

3)水豚-webkit的Error undefined method find_xpath for #<Capybara::Webkit::Driver當使用Capybara.javascript_driver = :webkit

  • 溶液:使用主分支 gem 'capybara-webkit', git: 'git://github.com/thoughtbot/capybara-webkit.git'

我設置到底是鬼驅(支持觸發方法)+水豚的β與送達資產從開發服務器(不預編譯),所以save_and_open_page的作品。