library español descargar bindings ruby-on-rails ruby unit-testing selenium automated-tests

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