quattro_4 scribble

scribble 落書き (調べた事をただ落書きする)

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