Selenium RC: запускать тесты в нескольких браузерах автоматически - PullRequest
8 голосов
/ 17 октября 2008

Итак, я начал создавать несколько юнит-тестов Ruby, которые используют Selenium RC для тестирования моего веб-приложения прямо в браузере. Я использую Selenum-Client для рубина. Я создал базовый класс для всех моих других тестов селена, чтобы унаследовать их.

Это создает множество экземпляров 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

Это работает, но если один браузер дает сбой, весь тест не пройден, и нет способа узнать, в каком браузере он вышел из строя.

Ответы [ 4 ]

4 голосов
/ 20 октября 2008

Вы пробовали Селеновая сетка ? Я думаю, что это создает довольно хороший сводный отчет, который показывает детали, которые вам нужны. Возможно, я ошибаюсь, потому что долгое время не использовал его.

1 голос
/ 21 октября 2008

Я закончил тем, что изменил протокол Selenium protocol.rb, чтобы поднять 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 голосов
/ 17 ноября 2009

Вы должны рассматривать каждый тест самостоятельно. Поэтому, если один тест не пройден, он продолжит тестирование других тестов. Проверьте Phpunit и селен RC

0 голосов
/ 19 октября 2008

Отказ от ответственности: не эксперт по селену.

Вы просто хотите узнать, в каком браузере произошел сбой, или вы хотите запустить тест во всех браузерах, а затем сообщить об общих сбоях после его завершения?

Первый вариант довольно прост, если вы храните драйверы по хешу в вашей настройке. (Я уверен, что есть способ сделать это с помощью 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

Должен приблизить тебя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...