ruby-on-rails - español - selenium library java
Selenium RC: ejecutar pruebas en múltiples navegadores automáticamente (4)
Por lo tanto, comencé a crear algunas pruebas de unidades de Ruby que usan Selenium RC para probar mi aplicación web directamente en el navegador. Estoy usando Selenum-Client para ruby. Creé una clase base para todas mis otras pruebas de selenio para heredar.
Esto crea numerosas instancias de SeleniumDriver y se invocan todos los métodos que faltan 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 un navegador falla, la prueba falla y no hay manera de saber en qué navegador falló.
¿Has probado Selenium Grid ? Creo que crea un informe de resumen bastante bueno que muestra los detalles que necesita. Puedo estar equivocado, ya que no lo usé por bastante tiempo.
Descargo de responsabilidad: No es un experto en selenio.
¿Desea saber qué navegador falló o desea ejecutar la prueba en todos los navegadores y luego informar el total de fallas cuando termina?
El primero es bastante simple si almacena los controladores mediante hash en su configuración. (Estoy seguro de que hay una manera elegante de hacer esto con Hash.inject, pero soy flojo.)
@seleniums = {}
%w(*firefox *iexplore).each do |browser|
puts ''creating browser '' + browser
@seleniums[browser] = Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000)
end
A continuación, cambie su función principal para modificar excepciones e incluir el nombre del controlador que se está usando, algo así como:
@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.
Terminé modificando protocol.rb de Selenium para generar un AssertionFailedError
con @browser_string
y el mensaje devuelto por el 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 el method_missing
para devolver una matriz de valores devueltos para emitir comandos get_X al Selenium RC.
Agregue este código al código en la pregunta y podrá ver qué afirmaciones fallan en qué navegadores.
# 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
debes tratar cada prueba de forma independiente. Entonces, si una prueba falla, continuará probando otras pruebas. Echa un vistazo a phpunit y selenio rc