watir-rspec 记者的自定义屏幕截图

Custom screeshot for watir-rspec reporter

我正在从使用 rspec 的 watir-webdriver 迁移到 watir-rspec(变化不大)。不过现在我想利用记者link的截图我用截图gem。我正在努力解决这个问题,我不想使用标准屏幕截图,因为我有另一个辅助函数可以对图像进行一些处理,屏幕截图 gem 允许我获取特定元素的屏幕截图。

在 watir-rspec 文档中它声称我们只需添加这三行,但我不确定在哪里以及如何更改它以适应我的自定义图像生成。

uploaded_file_path = Watir::RSpec.file_path("uploaded.txt")
File.open(uploaded_file_path, "w") {|file| file.write "Generated File Input"}
file_field(:name => "upload-file").set uploaded_file_path

将文件 link 添加到报告中是使用 Watir::RSpec.file_path 方法完成的。基本上你:

  1. 调用 file_path 方法,它告诉报表添加 link 和 returns 预期文件的路径。
  2. 创建文件,在本例中为屏幕截图,使用 file_path 返回的路径。

在以下示例中,After 挂钩显示了如何使用 file_path 方法添加 link:

require_relative "spec_helper"

describe "Google" do
  before { goto "http://google.com" }

  it "allows to search" do
    text_field(:name => "q").set "watir"
    button(:id => "gbqfb").click # This will fail to locate the element
    results = div(:id => "ires")
    results.should be_present.within(2)
    results.lis(:class => "g").map(&:text).should be_any { |text| text =~ /watir/ }
    results.should be_present.during(1)
  end

  after do
    # Call Watir::RSpec.file_path to:
    #  1. Tell the report to add a link
    #  2. Determine the file path/name the report will link to
    screenshot_file_path = Watir::RSpec.file_path("custom_screenshot.jpg")
    #=> "C:/Scripts/Misc/Programming/watir-rspec/spec/tmp/spec-results/custom_screenshot_104027_1_1.jpg"

    # Create the screenshot to the path specified in screenshot_file_path
    # This would be dependent on your screenshot gem
  end
end

有几个限制:

  1. linked 图像应该在结果文件夹中。
  2. linked 图像应具有特定的生成名称。
  3. 虽然您始终可以创建屏幕截图,但只有在测试失败时才会link编辑到报告中。
  4. 默认屏幕截图 link 也将存在。

感谢@JustinKo 的提示,我设法通过覆盖 HtmlFormatter class 中的 extra_failure_content(exception) 方法来修复它。我用自定义调用替换了 save_screenshot 调用以获取我自己的屏幕截图,效果很好。我将它们保存在同一目录中以使其更容易。

这里是 HtmlFormatter 的原代码 link。 https://github.com/watir/watir-rspec/blob/master/lib/watir/rspec/html_formatter.rb

class MyHtmlFormatter < Watir::RSpec::HtmlFormatter
 def my_custom_function(description)
  file_name = file_path("your_file.png", description)
  old = File.absolute_path("your_file.png") 
  File.rename(old, file_name)
  file_name
 end

 def extra_failure_content(exception)
    browser = example_group.before_all_ivars[:@browser] || $browser
    return super unless browser && browser.exists?
    my_custom_function args
    save_html browser
    (...)
 end