2009-11-30 100 views
3

我試圖捕捉使用selenium-client和rspec的測試失敗截圖。我運行這個命令:使用rspec的Selenium屏幕截圖

$ 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 

是什麼原因造成「執行過期」的錯誤?我是否錯過了我的規格中的重要內容?這裏是my_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 
+0

這種更爲玩弄後,我發現截圖的工作,如果我刪除「@ selenium_driver.close_current_browser_session」來自append_after(:each)。但是,這讓我有一堆瀏覽器窗口被打開,因爲沒有會話被釋放。我嘗試在之前(:each)之前釋放它們,而不是之後(:each),但當會話在之前(:each)釋放時,屏幕截圖仍然不起作用。 –

回答

0

爲了得到工作,我不得不國防部事情上的錯誤截圖一點點。

我提出下列代碼出spec_helper(我發現在C:\紅寶石\ lib中\紅寶石\寶石\硒 - 客戶1.2.18 \ lib中\硒\ rspec的\ spec_helper.rb):的

if actual_failure? 
     Selenium::RSpec::SeleniumTestReportFormatter.capture_system_state(selenium_driver, self) 
    end 

並將其放入我測試的setup/teardown(在行@ selenium_driver.close_current_browser_session之前)的append_after(:each)部分。

希望這會有所幫助!

0

爲什麼不把截圖放在after函數中,但在關閉瀏覽器之前?

+0

根據文檔,SeleniumTestReportFormatter應該處理失敗時的屏幕截圖。它(幾乎)。每當測試失敗時,它都會嘗試截圖。問題是瀏覽器會話發佈後需要截圖。 在after函數中手動截取屏幕截圖將是一個可接受的解決方法,但我找不到有關如何使用selenium-client和rspec執行此操作的任何文檔。你知道該怎麼做嗎? –

+0

對不起,我對SeleniumTestReportFormatter不熟悉。我是一個Java人:P但是,應該有一個「帶截圖」命令。 Java客戶端當然有。它將屏幕截圖作爲base64編碼的字符串返回,您必須將其解碼並寫入文件。 –

1

我遇到了這個問題,並能夠通過設置驅動程序超時來解決它。 這可能會導致驅動程序運行到之前結束瀏覽器會話:after_each 您正在使用10秒,我運行罰款:timeout_in_seconds => 2000

+0

我的問題沒有通過更改timeout_in_seconds來解決。事實上,timeout_in_seconds是第一個經常遇到失敗測試的東西。在此示例中,如果頁面在特定時間內未加載「Pending Backup」文本,則測試將失敗。此時,測試失敗,因此SeleniumTestReportFormatter應該抓取截圖。 如果我將timeout_in_seconds命令增加到2000秒,這隻會讓測試在失敗之前花費2000秒,此時我會得到相同的錯誤,無法獲取屏幕截圖。 –

0

它看起來像在那裏丟失"

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

我不確定我是否理解你的答案。也許你可以編輯它使其更清晰? –