看起来对于 Rails5/RSpec 系统测试,默认是使用
selenium-webdriver
gem 在规范失败时截取屏幕截图。有没有办法为所拍摄的屏幕截图配置文件名的格式?我已经看到使用 capybara-screenshot
gem 可以做到这一点,但我不确定如何使用 selenium-webdriver
做到这一点。
基本上,默认命名无法保存屏幕截图,因为生成的默认文件名太长,因为它们使用规范描述来创建文件。这是我看到的错误:
Errno::ENAMETOOLONG: File name too long @ rb_sysopen
在您的测试中,使用
save_screenshot("tmp/screenshots/name-of-file.png")
这将以该文件名保存它并保存在默认屏幕截图位置。
下面的答案实际上不适用于 Rails 5,但如果有人在 Rails 7 中寻找解决方案,它可能会有用。
Rails 内部创建的屏幕截图的文件名实际上是由
AcionDispatch::SystemTesting::TestHelpers::ScreenshotHelper
配置的。如果工具文件名较长,处理问题的一种方法是覆盖 image_name
方法并返回较短的名称。
首先在 lib/core_ext/action_dispatch/system_testing/test_helpers/screenshot_helper_short_image_name.rb 中使用新方法创建模块:
module CoreExt::ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelperShortImageName
private
def image_name
super[0...120]
end
end
(插入适合您的文件系统的字符串长度,120只是示例)。
然后在 config/initializers/system_test_case.rb 中添加创建的模块:
ActiveSupport.on_load :action_dispatch_system_test_case do
prepend CoreExt::ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelperShortImageName
end
除非您使用的是 Rails >= 7.1,否则请确保 config/application.rb 包含:
config.autoload_lib(ignore: %w(assets tasks))
从 lib/ 目录自动加载文件。
类似的方法可用于更改测试失败时创建的屏幕截图文件的默认文件名。例如,可以覆盖方法
ScreenshotHelper#unique
以包含失败的日期/时间或测试运行的种子 (Minitest.seed
)。
根据文档,如果您使用
page.save_screenshot
,您可以传入您自己的文件名: