2013-04-19 39 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的作品。