Selenium RC: запускать тесты в нескольких браузерах автоматически
-
03-07-2019 - |
Вопрос
Итак, я начал создавать некоторые модульные тесты 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
Это работает, но если один из браузеров дает сбой, весь тест не пройден, и нет способа узнать, в каком браузере произошел сбой.
Решение
Вы пробовали Selenium Grid ? Я думаю, что это создает довольно хороший сводный отчет, который показывает детали, которые вам нужны. Возможно, я ошибаюсь, так как не использовал его в течение долгого времени.
Другие советы
Я закончил тем, что изменил протокол Selenium protocol.rb, чтобы вызвать AssertionFailedError
и @browser_string
, и сообщение, возвращаемое из Selenium RC, если ответ не начинался с "ОК". Я также изменил метод 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
Отказ от ответственности: не эксперт по селену.
Вы просто хотите узнать, в каком браузере произошел сбой, или вы хотите запустить тест во всех браузерах, а затем сообщить об общих сбоях после его завершения?
Первый вариант довольно прост, если вы храните драйверы по хешу в вашей настройке. (Я уверен, что есть способ сделать это с помощью 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
Должен приблизить тебя.
Вы должны рассматривать каждый тест самостоятельно. Поэтому, если один тест не пройден, он продолжит тестирование других тестов. Ознакомьтесь с phpunit и селеном rc