2008-10-17 3 views
8

Итак, я начал создавать некоторые модульные тесты Ruby, которые используют Selenium RC для проверки моего веб-приложения непосредственно в браузере. Я использую 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

ответ

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

Хорошая идея, хотя и не удалось Я не думаю, что тесты не обязательно бросают исключения. –

+0

На самом деле, они всегда должны бросать какое-то AssertionFailedException; но эта вещь Grid ниже выглядит мега-скользкой. –

1

Я в конечном итоге изменения protocol.rb Selenium, чтобы поднять AssertionFailedError как с и сообщением @browser_string вернулся из Selenium RC, если ответ не начинаются с «OK». Я также изменил метод http_post, чтобы вернуть весь тело ответа и method_missing, чтобы вернуть массив возвращаемых значений для выдачи команд get_X в Selenium RC.

Добавить этот код коду в вопрос, и вы должны быть в состоянии видеть, какие утверждения терпят неудачу в каких браузерах.

# 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 
0

Вам необходимо обработать каждый тест самостоятельно. Поэтому, если один тест не пройдет, он продолжит тестирование других тестов. Выезд phpunit and selenium rc

Смежные вопросы