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ó.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top