Selenium RC: автоматически запускать тесты в нескольких браузерах
Итак, я начал создавать некоторые модульные тесты Ruby, которые используют селен RC чтобы проверить мое веб-приложение непосредственно в браузере. Я использую Selenum-Клиент Рубина. Я создал базовый класс для всех моих других тестов Selenium для наследования.
это создает многочисленные экземпляры 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 ответов
ты Селен Сетки? Я думаю, что он создает довольно хороший сводный отчет, который показывает детали, которые вам нужны. Я могу ошибаться, так как я не использовал его довольно долго.
Я закончил тем, что изменил протокол Селена.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
отказ от ответственности: не эксперт селен.
вы просто хотите знать, какой браузер не удался, или вы хотите запустить тест во всех браузерах, а затем сообщить об общих сбоях, когда это будет сделано?
первый довольно прост, если вы храните драйверы по хэшу в своей настройке. (Я уверен,что есть способ сделать это с гашишем.укол, но я ленив.)
@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