Frage

Also, ich habe damit begonnen, einige Ruby-Unit-Tests zu erstellen, verwenden Selenium RC zu testen mein Web-App direkt im Browser. Ich bin mit dem Selenum-Client- für Rubin. Ich habe für alle meine anderen Selen Tests eine Basisklasse erstellt von erben.

Dies schafft zahlreiche SeleniumDriver Instanzen und alle Methoden, die auf jeder Instanz genannt fehlen. Dies resultiert im Wesentlichen führt die Tests parallel.

Wie haben andere Menschen automatisiert das?

Dies ist meine Implementierung:

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

Dies funktioniert, aber wenn ein Browser ausfällt, schaltet die gesamte Prüfung, und es gibt keine Möglichkeit zu wissen, welchen Browser es versäumte auf.

War es hilfreich?

Lösung

Haben Sie versucht Selenium Grid ? Ich denke, es ist ziemlich gut zusammenfassender Bericht erstellt, die Details zeigt, die Sie benötigen. Ich kann mich irren, wie ich es nicht für eine ganze Weile verwendet haben.

Andere Tipps

beenden ich Selen ist protocol.rb Modifizierung bis ein AssertionFailedError mit den @browser_string beide und der zurückgegebene Nachricht erhöhen aus dem Selenium RC wenn die Antwort nicht mit „OK“ gestartet wird. I modifiziert auch die http_post Verfahren die gesamte Antwort Körper und die method_missing zurückzukehren ein Array von Rückgabewerte zurückzukehren für die Ausgabe an die get_X Selenium RC-Befehle.

Fügen Sie diesen Code, um den Code in der Frage und Sie sollten auf sehen, welche Behauptungen der Lage sein, nicht welchen Browser.

# 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   

Disclaimer:. Kein Selen Experte

Wollen Sie nur wissen, welchen Browser fehlgeschlagen ist, oder haben Sie den Test in allen Browsern ausgeführt werden soll, und dann die Totalausfälle berichten, wenn es fertig ist?

Das erstere ist ziemlich einfach, wenn Sie die Treiber von Hash in Ihrem Setup speichern. (Ich bin sicher, dass es eine Phantasie-Hosen Art und Weise dies mit Hash.inject zu tun, aber ich bin faul.)

@seleniums = {}
%w(*firefox *iexplore).each do |browser|
  puts 'creating browser ' + browser
  @seleniums[browser] = Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000)
end

Dann ist Ihre Kernfunktion ändern Ausnahmen zu ändern, den Namen des Fahrers aufzunehmen verwendet wird, so etwas wie:

@seleniums.each do |name, driver|
  begin
    driver.send method_name, *args
  rescue Exception => ex
    raise ex.exception(ex.message + " (in #{name})")
  end
end

Sollte erhalten Sie schließen.

Sie müssen jeden Test unabhängig zu behandeln. Also, wenn ein Test nicht bestanden wird es für den Test weitere Tests durchführen. Schauen Sie sich phpunit und Selen rc

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top