Selenium RC: Führen Sie Tests in mehreren Browsern automatisch
-
03-07-2019 - |
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.
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