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