Module: ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Included In:
| |
Defined in: | actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb |
Overview
Screenshot helper for system testing.
Instance Attribute Summary
- #_screenshot_counter rw private
- #failed? ⇒ Boolean readonly private
- #html_from_env? ⇒ Boolean readonly private
- #supports_screenshot? ⇒ Boolean readonly private
Instance Method Summary
-
#take_failed_screenshot
Takes a screenshot of the current page in the browser if the test failed.
-
#take_screenshot(html: false, screenshot: nil)
Takes a screenshot of the current page in the browser.
- #absolute_html_path private
- #absolute_image_path private
- #absolute_path private
- #display_image(html:, screenshot_output:) private
- #html_path private
- #image_name private
- #image_path private
- #increment_unique private
- #inline_base64(path) private
- #output_type private
- #relative_image_path private
- #save_html private
- #save_image private
- #screenshots_dir private
- #show(img) private
- #unique private
Instance Attribute Details
#_screenshot_counter (rw, private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 61
attr_accessor :_screenshot_counter
#failed? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 154
def failed? !passed? && !skipped? end
#html_from_env? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 63
def html_from_env? ENV["RAILS_SYSTEM_TESTING_SCREENSHOT_HTML"] == "1" end
#supports_screenshot? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 158
def supports_screenshot? Capybara.current_driver != :rack_test end
Instance Method Details
#absolute_html_path (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 106
def absolute_html_path "#{absolute_path}.html" end
#absolute_image_path (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 98
def absolute_image_path "#{absolute_path}.png" end
#absolute_path (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 90
def absolute_path Rails.root.join(screenshots_dir, image_name) end
#display_image(html:, screenshot_output:) (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 134
def display_image(html:, screenshot_output:) = +"[Screenshot Image]: #{image_path}\n" << +"[Screenshot HTML]: #{html_path}\n" if html case screenshot_output || output_type when "artifact" << "\e]1338;url=artifact://#{absolute_image_path}\a\n" when "inline" name = inline_base64(File.basename(absolute_image_path)) image = inline_base64(File.read(absolute_image_path)) << "\e]1337;File=name=#{name};height=400px;inline=1:#{image}\a\n" end end
#html_path (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 86
def html_path absolute_html_path.to_s end
#image_name (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 76
def image_name sanitized_method_name = method_name.gsub(/[^\w]+/, "-") name = "#{unique}_#{sanitized_method_name}" name[0...225] end
#image_path (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 82
def image_path absolute_image_path.to_s end
#increment_unique (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 67
def increment_unique @_screenshot_counter ||= 0 @_screenshot_counter += 1 end
#inline_base64(path) (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 150
def inline_base64(path) Base64.strict_encode64(path) end
#output_type (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 120
def output_type # Environment variables have priority output_type = ENV["RAILS_SYSTEM_TESTING_SCREENSHOT"] || ENV["CAPYBARA_INLINE_SCREENSHOT"] # Default to outputting a path to the screenshot output_type ||= "simple" output_type end
#relative_image_path (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 102
def relative_image_path "#{absolute_path.relative_path_from(Rails.root)}.png" end
#save_html (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 111
def save_html page.save_page(absolute_html_path) end
#save_image (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 115
def save_image page.save_screenshot(absolute_image_path) end
#screenshots_dir (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 94
def screenshots_dir Capybara.save_path.presence || "tmp/screenshots" end
#show(img) (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 130
def show(img) puts img end
#take_failed_screenshot
Takes a screenshot of the current page in the browser if the test failed.
take_failed_screenshot
is called during system test teardown.
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 53
def take_failed_screenshot return unless failed? && supports_screenshot? && Capybara::Session.instance_created? take_screenshot [:failure_screenshot_path] = relative_image_path if Minitest::Runnable.method_defined?(: ) end
#take_screenshot(html: false, screenshot: nil)
Takes a screenshot of the current page in the browser.
take_screenshot
can be used at any point in your system tests to take a screenshot of the current state. This can be useful for debugging or automating visual testing. You can take multiple screenshots per test to investigate changes at different points during your test. These will be named with a sequential prefix (or ‘failed’ for failing tests)
The default screenshots directory is tmp/screenshots
but you can set a different one with Capybara.save_path
You can use the html
argument or set the RAILS_SYSTEM_TESTING_SCREENSHOT_HTML
environment variable to save the HTML from the page that is being screenshotted so you can investigate the elements on the page at the time of the screenshot
You can use the screenshot
argument or set the RAILS_SYSTEM_TESTING_SCREENSHOT
environment variable to control the output. Possible values are:
{simple} (default)
: Only displays the screenshot path. This is the default value.
{inline}
: Display the screenshot in the terminal using the iTerm image protocol
(https://iterm2.com/documentation-images.html).
{artifact}
: Display the screenshot in the terminal, using the terminal artifact
format (https://buildkite.github.io/terminal-to-html/inline-images/).
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 41
def take_screenshot(html: false, screenshot: nil) showing_html = html || html_from_env? increment_unique save_html if showing_html save_image show display_image(html: showing_html, screenshot_output: screenshot) end
#unique (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 72
def unique failed? ? "failures" : (_screenshot_counter || 0).to_s end