Selenium RC: Ejecutar pruebas en múltiples navegadores automáticamente
-
03-07-2019 - |
Pregunta
Entonces, comencé a crear algunas pruebas unitarias de Ruby que usan Selenium RC para probar Mi aplicación web directamente en el navegador. Estoy usando Selenum-Client para ruby. He creado una clase base para todas mis otras pruebas de selenio para heredar.
Esto crea numerosas instancias de SeleniumDriver y todos los métodos que faltan se llaman en cada instancia. Esto esencialmente ejecuta las pruebas en paralelo.
¿Cómo han automatizado esto otras personas?
Esta es mi implementación:
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
Esto funciona, pero si falla un navegador, falla toda la prueba y no hay forma de saber en qué navegador falló.
Solución
¿Intentaste Grilla de Selenium ? Creo que crea un informe resumido bastante bueno que muestra los detalles que necesita. Puede que me equivoque, ya que no lo usé en mucho tiempo.
Otros consejos
Terminé modificando Selenium's protocol.rb para generar un AssertionFailedError
con el @browser_string
y el mensaje devuelto del Selenium RC si la respuesta no comenzó con " OK " ;. También modifiqué el método http_post
para devolver todo el cuerpo de la respuesta y method_missing
para devolver una matriz de valores de retorno para emitir comandos get_X al Selenium RC.
Agregue este código al código en la pregunta y debería poder ver qué afirmaciones fallan en qué exploradores.
# 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
Descargo de responsabilidad: No es un experto en selenio.
¿Solo quiere saber qué navegador falló, o quiere ejecutar la prueba en todos los navegadores y luego informar los errores totales cuando se realiza?
El primero es bastante simple si almacena los controladores por hash en su configuración. (Estoy seguro de que hay una manera elegante de hacer esto con Hash.inject, pero soy perezosa).
@seleniums = {}
%w(*firefox *iexplore).each do |browser|
puts 'creating browser ' + browser
@seleniums[browser] = Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000)
end
Luego, cambie su función principal para modificar las excepciones para incluir el nombre del controlador que se está utilizando, por ejemplo:
@seleniums.each do |name, driver|
begin
driver.send method_name, *args
rescue Exception => ex
raise ex.exception(ex.message + " (in #{name})")
end
end
Debería acercarte.
necesitas tratar cada prueba de forma independiente. Así que si una prueba falla, continuará probando otras pruebas. Consulte phpunit and selenium rc