2008-10-17 151 views
8

因此,我開始創建一些使用Selenium RC直接在瀏覽器中測試我的Web應用程序的Ruby單元測試。我正在使用Selenum-Client進行紅寶石。我爲所有其他硒測試創建了一個基類來繼承。Selenium RC:在多個瀏覽器中自動運行測試

這將創建大量的SeleniumDriver實例,並在每個實例上調用缺少的所有方法。這本質上並行地運行測試。

其他人是如何實現這個功能的?

這是我實現:

class SeleniumTest < Test::Unit::TestCase 
    def setup 
    @seleniums = %w(*firefox *iexplore).map do |browser| 
     puts 'creating browser ' + browser 
     Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000) 
    end 

    start 
    open start_address 
    end 

    def teardown 
     stop 
    end 

    #sub-classes should override this if they want to change it 
    def start_address 
    "http://localhost:3003/" 
    end 

    # Overrides standard "open" method 
    def open(addr) 
    method_missing 'open', addr 
    end 

    # Overrides standard "type" method 
    def type(inputLocator, value) 
    method_missing 'type', inputLocator, value 
    end 

    # Overrides standard "select" method 
    def select(inputLocator, optionLocator) 
    method_missing 'select', inputLocator, optionLocator 
    end 

    def method_missing(method_name, *args) 
    @seleniums.each do |selenium_driver| 
     if args.empty? 
     selenium_driver.send method_name 
     else 
     selenium_driver.send method_name, *args 
     end 

    end 
    end 
end 

這工作,但如果一個瀏覽器失敗,整個測試失敗,也沒有辦法知道它沒有哪個瀏覽器。

+1

嗨丹尼爾,我有一個類似的問題。我想知道你能否幫忙。 [Selenium RC:如何使用多瀏覽器啓動交互式測試](http://stackoverflow.com/questions/2836313/selenium-rchow-to-launch-interactive-testing-with-multiple-browsers) – onesith 2010-05-14 17:54:13

回答

4

你試過Selenium Grid?我認爲它會創建一個非常好的總結報告,顯示您需要的詳細信息我可能是錯的,因爲我沒有使用它一段時間。

0

聲明:不是硒專家。

你只想知道哪個瀏覽器失敗了,還是想在所有瀏覽器上運行測試,然後在完成時報告總失敗?

如果通過哈希在您的設置中存儲驅動程序,前者非常簡單。 (我敢肯定有一個奇特的褲子方式與Hash.inject做到這一點,但我懶惰。)

@seleniums = {} 
%w(*firefox *iexplore).each do |browser| 
    puts 'creating browser ' + browser 
    @seleniums[browser] = Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000) 
end 

然後改變你的核心功能來修改例外包括驅動程序的名稱中使用,像這樣:

@seleniums.each do |name, driver| 
    begin 
    driver.send method_name, *args 
    rescue Exception => ex 
    raise ex.exception(ex.message + " (in #{name})") 
    end 
end 

應該讓你關閉。

+0

好主意,雖然失敗測試不一定會拋出我認爲的例外。 – 2008-10-20 00:48:02

1

我最後修改Selenium的protocol.rb提高的AssertionFailedError同時與@browser_string和消息從硒RC返回如果響應沒有用「OK」開始。我還修改了http_post方法以返回整個響應主體,並且method_missing返回一組用於向Selenium RC發出get_X命令的返回值數組。

將此代碼添加到問題中的代碼中,您應該能夠看到哪些瀏覽器上的哪些斷言失敗。

# Overrides a few Driver methods to make assertions return the 
# browser string if they fail 
module Selenium 
    module Client 
    class Driver 
     def remote_control_command(verb, args=[]) 
     timeout(default_timeout_in_seconds) do 
      status, response = http_post(http_request_for(verb, args)) 
      raise Test::Unit::AssertionFailedError.new("Browser:#{@browser_string} result:#{response}") if status != 'OK' 
      return response[3..-1] 
     end 
     end 

     def http_post(data) 
     http = Net::HTTP.new(@server_host, @server_port) 
     response = http.post('/selenium-server/driver/', data, HTTP_HEADERS) 
     #return the first 2 characters and the entire response body 
     [ response.body[0..1], response.body ] 
     end 
    end 
    end 
end 

#Modify your method_missing to use seleniums.map to return the 
#results of all the function calls as an array 
class SeleniumTest < Test::Unit::TestCase 
    def method_missing(method_name, *args) 
    self.class.seleniums.map do |selenium_driver| 
     selenium_driver.send(method_name, *args) 
    end 
    end 
end 
相關問題