isuke
8/12/2016 - 5:46 AM

screenshot_taker.rb

module ScreenshotTaker
  SCREENSHOT_ROOT_DIR = Rails.root.join('tmp', 'rspec_screenshots')
  @screenshot_dir = ''

  def self.setting!
    @screenshot_dir = SCREENSHOT_ROOT_DIR.join(Time.zone.now.strftime('%Y%m%d-%H%M%S'))
    FileUtils.mkdir_p(@screenshot_dir)
    puts "\e[32mtake screenshot to `#{@screenshot_dir}`\e[0m"
  end

  def self.take_screenshot(page, meta)
    filename        = File.basename(meta[:file_path], '.*')
    line_number     = meta[:line_number]
    screenshot_png_name = "#{filename}-line_#{line_number}.png"
    screenshot_png_path = File.join(@screenshot_dir, screenshot_png_name)
    screenshot_html_name = "#{filename}-line_#{line_number}.html"
    screenshot_html_path = File.join(@screenshot_dir, screenshot_html_name)

    page.save_screenshot(screenshot_png_path, full: true)
    page.save_page(screenshot_html_path)

    puts "\e[32mtaked screenshot to `#{screenshot_png_path}`\e[0m"
    puts "\e[32mtaked screenshot to `#{screenshot_html_path}`\e[0m"
  end
end

RSpec.configure do |config|
  config.before(:suite) do
    ScreenshotTaker.setting! if ENV['SCREENSHOT'].present?
  end

  config.after do |example|
    meta = example.metadata
    if ENV['SCREENSHOT'].present? && meta[:js] && example.exception
      ScreenshotTaker.take_screenshot(page, meta)
    end
  end
end