在rspec功能方案中,我有:
scenario 'shows things', js: true do
page.find('#my_div').trigger(:click)
这似乎没有触发关于此元素的click事件的jQuery处理程序。在调试器中,此调用返回一个空字符串""。
capybara-webkit是否能够使用jQuery处理程序模拟鼠标事件来触发更新dom的ajax请求?如果是这样,对此案件的任何建议? 我从selenium-webdriver切换,因为不支持capybara #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
我正在使用' edge' capybara-webkit因为我遇到了一个带有xpath错误的错误(v2.04?)。
虽然我尝试在spec / spec_helper.rb中添加机架异常,但我还没有能够记录javascript错误:
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
更新 我用
替换了capybara-webkitgem 'poltergeist'
在spec / 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 the poltergeist gem权限但结果相同。
尝试运行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 :(得分:7)
我遇到的问题和解决方案:
1)selenium-webdriver或capybara-webkit不支持Capybara trigger()方法。
page.execute_script(%Q($("#...
触发jquery事件,尽管这不如在用户看不到的元素上触发事件那样有用。 2)save_and_open_page
不使用资产管道,因此如果您有隐藏的可点击元素,则相当无用。 poltergeist驱动程序有save_screenshot,它可以工作,但它不像有一个真正的浏览器页面加载资产那么有用
解决方案:在测试中预编译资产,虽然我无法使用任何驱动程序加载jQuery($未定义)并且poltergiest / phantomjs不允许访问本地编译文件(将命令行选项传递给<驱动程序无效)
更好的解决方案:使用未发布的Capybara 2.1 + gem 'capybara', git: 'git://github.com/jnicklas/capybara.git'
,将Capybara.asset_host = "http://localhost:3000"
添加到spec_helper.rb并让dev服务器继续运行
3)capybara-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'
我最终设置的是Poltergeist(支持触发方法)+ Capybara beta,其中包含从dev服务器(未预编译)提供的资源,因此save_and_open_page可以正常工作。