capybara-screenshot
From CHANGELOG
07 Jan 2013
Support for Terminus
rspec
$ rspec Run options: include {:focus=>true} Finished in 0.02319 seconds 21 examples, 0 failures
メソッドのテスト クラスメソッドの場合も
::Capybara.should respond_to(:screenshot_and_save_page)
self.should respond_to(:screenshot_and_save_page)
register_driver
register_driver(:default) do |driver, path|
サポートドライバー
:selenium, :poltergeist, :webkit, :webkit_debug, :terminus
:rack_testは未サポート
class attributes
module Capybara
module Screenshot
class << self
attr_accessor :autosave_on_failure
attr_accessor :registered_drivers
attr_accessor :filename_prefix_formatters
attr_accessor :append_screenshot_path
end
self.autosave_on_failure = true
self.registered_drivers = {}
self.filename_prefix_formatters = {}
self.append_screenshot_path = true
Capybara DSL 拡張
lib/capybara-screenshot/capybara.rb
module Capybara
module DSL
lib/capybara-screenshot.rb
最後の箇所
require 'capybara-screenshot/capybara'
多分renameしたメソッド
class << self
alias screen_shot_and_save_page screenshot_and_save_page
alias screen_shot_and_open_image screenshot_and_open_image
end
複数のdriverごと処理を分ける
この部分はすごい肝。参考になる
attr_accessor :registered_drivers
self.registered_drivers = {}
def self.register_driver(driver, &block)
self.registered_drivers[driver] = block
end
register_driver(:selenium) do |driver, path|
driver.browser.save_screenshot(path)
end
register_driver(:webkit) do |driver, path|
if driver.respond_to?(:save_screenshot)
driver.save_screenshot(path)
else
driver.render(path)
end
end
lib/capybara-screenshot/saver.rb
def save_screenshot
Capybara::Screenshot.registered_drivers.fetch(capybara.current_driver) { |driver_name|
warn "capybara-screenshot could not detect a screenshot driver for '#{capybara.current_driver}'. Saving with default with unknown results."
Capybara::Screenshot.registered_drivers[:default]
}.call(page.driver, screenshot_path)
end
クラス変数のハッシュにdriverをkeyとして格納
[driver] = block
Capybara::Screenshot.registered_drivers[:default]
を返して
}.call(page.driver, screenshot_path)
という流れ
rspec拡張 (auto save on failure)
lib/capybara-screenshot/rspec.rb
RSpec.configure do |config|
# use the before hook to add an after hook that runs last
config.after do
if Capybara.page.respond_to?(:save_page) # Capybara DSL method has been included for a feature we can snapshot
if Capybara::Screenshot.autosave_on_failure && example.exception
filename_prefix = Capybara::Screenshot.filename_prefix_for(:rspec, example)
saver = Capybara::Screenshot::Saver.new(Capybara, Capybara.page, true, filename_prefix)
saver.save
if Capybara::Screenshot.append_screenshot_path
example.metadata[:full_description] += "\n Screenshot: #{saver.screenshot_path}"
end
end
end
end
end
config.afterの中で exampleを使っている、というか使えるんだ
example.metadata[:full_description] というのが何らかの出力をしている
良いgemだ
サンプルプロジェクト
サンプルプロジェクトが用意しているあたりすごい丁寧な作者だ
QT + capybara-webkitのインストールをクリアすれば、うまく動いた
https://github.com/mattheworiordan/capybara-screenshot-test-rails-3.1
30m