Selenium RC:複数のブラウザーでテストを自動的に実行する
-
03-07-2019 - |
質問
だから、 Selenium RC を使用してテストするRuby単体テストの作成を開始しましたブラウザで直接私のウェブアプリ。ルビーに Selenum-Client を使用しています。継承する他のすべてのセレンテストの基本クラスを作成しました。
これにより、多数のSeleniumDriverインスタンスが作成され、欠落しているすべてのメソッドが各インスタンスで呼び出されます。これは本質的にテストを並行して実行します。
他の人がこれをどのように自動化しましたか?
これは私の実装です:
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
これは機能しますが、1つのブラウザーが失敗すると、テスト全体が失敗し、どのブラウザーで失敗したかを知る方法はありません。
解決
Selenium Grid を試しましたか?必要な詳細を示すかなり良い要約レポートを作成すると思います。しばらく使用していなかったため、間違っている可能性があります。
他のヒント
Seleniumのprotocol.rbを変更して、 AssertionFailedError
を @browser_string
とSelenium RCから返されたメッセージの両方で発生させました。応答は「OK」で始まりませんでした。また、 http_post
メソッドを変更して、応答本文全体を返し、 method_missing
を変更して、Selenium RCにget_Xコマンドを発行するための戻り値の配列を返しました。
このコードを質問のコードに追加すると、どのブラウザーでどのアサーションが失敗するかを確認できるはずです。
# 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
免責事項:セレンの専門家ではありません。
どのブラウザが失敗したかを知りたいだけですか、それともすべてのブラウザでテストを実行し、完了したら失敗の合計を報告しますか?
前者は、セットアップでドライバーをハッシュで保存する場合、非常に簡単です。 (Hash.injectでこれを行うには派手な方法があるはずですが、私は怠け者です。)
@seleniums = {}
%w(*firefox *iexplore).each do |browser|
puts 'creating browser ' + browser
@seleniums[browser] = Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000)
end
次に、コア関数を変更して、使用されているドライバーの名前を含めるように例外を変更します。
@seleniums.each do |name, driver|
begin
driver.send method_name, *args
rescue Exception => ex
raise ex.exception(ex.message + " (in #{name})")
end
end
近づいてください。
すべてのテストを個別に処理する必要があります。そのため、1つのテストが失敗すると、他のテストのテストが続行されます。 phpunitおよびselenium rc
をご覧ください。