Selenium截图使用rspec

3

我正在尝试使用selenium-client和rspec在测试失败时捕获屏幕截图。 我运行以下命令:

$ spec my_spec.rb \
--require 'rubygems,selenium/rspec/reporting/selenium_test_report_formatter' \
--format=Selenium::RSpec::SeleniumTestReportFormatter:./report.html 

当所有测试通过时,它可以正确生成报告,因为不需要截图。但是,当测试失败时,我会收到这个消息,报告中会有空白的截图:

WARNING: Could not capture HTML snapshot: execution expired
WARNING: Could not capture page screenshot: execution expired
WARNING: Could not capture system screenshot: execution expired
Problem while capturing system stateexecution expired

什么导致了“执行超时”错误?我的规范中是否缺少重要内容?以下是我的_spec.rb代码:

这个错误的原因是什么?我在规范中有没有漏掉重要的东西?这是我的_spec.rb代码:

require 'rubygems'
gem "rspec", "=1.2.8"
gem "selenium-client"
require "selenium/client"
require "selenium/rspec/spec_helper"

describe "Databases" do
    attr_reader :selenium_driver
    alias :page :selenium_driver

  before(:all) do
      @selenium_driver = Selenium::Client::Driver.new \
          :host => "192.168.0.10",
          :port => 4444,
          :browser => "*firefox",
          :url => "http://192.168.0.11/",
          :timeout_in_seconds => 10
  end

  before(:each) do
    @selenium_driver.start_new_browser_session
  end

  # The system capture need to happen BEFORE closing the Selenium session
  append_after(:each) do
    @selenium_driver.close_current_browser_session
  end

  it "backed up" do
    page.open "/SQLDBDetails.aspx"
    page.click "btnBackup", :wait_for => :page
    page.text?("Pending Backup").should be_true
  end
end

在更多地尝试后,我发现如果从 append_after(:each) 中删除 '@selenium_driver.close_current_browser_session',截屏功能就可以正常工作。然而,这会导致许多浏览器窗口打开,因为没有释放任何会话。我尝试在 before(:each) 中释放它们,而不是在 after(:each) 中释放它们,但是当会话在 before(:each) 中被释放时,截屏仍然无法正常工作。 - Thomas Albright
5个回答

1
我遇到了这个问题,并通过为驱动程序设置超时来解决它。 这可能会导致驱动程序在运行到:after_each之前结束浏览器会话。 你正在使用10秒,我使用:timeout_in_seconds => 2000可以正常运行。

更改timeout_in_seconds并不能解决我的问题。实际上,timeout_in_seconds通常是首先捕获失败测试的原因。在这个例子中,如果页面在一定时间内没有加载“待备份”文本,则测试失败。此时,测试失败,因此SeleniumTestReportFormatter应该抓取屏幕截图。如果我将timeout_in_seconds命令增加到2000秒,那么测试就需要2000秒才能失败,在这一点上,我会收到有关无法抓取屏幕截图的相同错误。 - Thomas Albright

0

看起来少了一个"

it "backed up" do
    page.open "/SQLDBDetails.aspx

1
我不确定我理解你的回答。也许你可以编辑一下,让它更清晰明了? - Taryn East

0
为了使错误情况下的截图工作,我必须对代码进行一些修改。
我将以下代码从spec_helper中移出(我在C:\Ruby\lib\ruby\gems\selenium-client-1.2.18\lib\selenium\rspec\spec_helper.rb找到该文件):
    if actual_failure?
         Selenium::RSpec::SeleniumTestReportFormatter.capture_system_state(selenium_driver, self)
    end

并将其放置在测试的设置/拆卸(@selenium_driver.close_current_browser_session之前)的append_after(:each) do部分。

希望这可以帮助到您!


0
为什么不在 after 函数中截屏,而是在关闭浏览器之前?

根据文档,SeleniumTestReportFormatter 被认为是会在测试失败时处理截图的。并且它确实做到了这一点(几乎)。每当一个测试失败时,它都会尝试进行截图。问题在于它在浏览器会话释放之后才进行截图。手动在 after 函数中进行截图可以作为一个可接受的解决方法,但我无法找到有关如何使用 selenium-client 和 rspec 进行截图的任何文档。你知道该怎么做吗? - Thomas Albright
抱歉,我不熟悉SeleniumTestReportFormatter。我是一个Java程序员 :P 不过,应该有一个“拍摄屏幕截图”的命令。在Java客户端中肯定有这个命令。它会返回一个base64编码的字符串形式的屏幕截图,你需要将其解码并写入文件。 - Patrick Lightbody

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接