Selenium RC: Executar testes em vários navegadores automaticamente
-
03-07-2019 - |
Pergunta
Então, eu comecei a criar alguns testes de unidade Ruby que usar Selenium RC para teste meu web aplicativo diretamente no navegador. Eu estou usando o Selenum-Client para ruby. Eu criei uma classe base para todos os meus outros testes de selênio para herdar.
Isso cria inúmeros casos SeleniumDriver e todos os métodos que estão faltando são chamados em cada instância. Isto essencialmente executa os testes em paralelo.
Como é que outras pessoas automatizado isso?
Esta é a minha aplicação:
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
Isso funciona, mas se um navegador falha, todo o teste falha e não há nenhuma maneira de saber qual navegador ele falhou em.
Solução
Você tentou selênio Grade ? Eu acho que cria uma boa relatório de síntese muito o que mostra detalhes que você precisa. Posso estar errado, como eu não usá-lo por um bom tempo.
Outras dicas
Acabei modificando protocol.rb do selênio para levantar um AssertionFailedError
tanto com o @browser_string
ea mensagem retornou do Selenium RC se a resposta não começar com "OK". Também o método modificado http_post
para retornar todo o corpo e a resposta method_missing
para retornar uma matriz de valores de retorno para emitir comandos get_X ao Selenium RC.
Adicione este código ao código em questão e você deve ser capaz de ver que as afirmações falhar em que browsers.
# 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:. Não é um especialista em selênio
Você só quer saber qual navegador falhou, ou você deseja executar o teste em todos os navegadores e, em seguida, relatar as falhas totais quando ele é feito?
O primeiro é bastante simples se você armazenar os drivers de hash em sua configuração. (Eu com certeza estou há uma maneira fantasia-calças de fazer isso com Hash.inject, mas eu sou preguiçoso.)
@seleniums = {}
%w(*firefox *iexplore).each do |browser|
puts 'creating browser ' + browser
@seleniums[browser] = Selenium::SeleniumDriver.new("localhost", 4444, browser, "http://localhost:3003", 10000)
end
Em seguida, mude a sua função central para modificar exceções para incluir o nome do driver que está sendo usado, algo como:
@seleniums.each do |name, driver|
begin
driver.send method_name, *args
rescue Exception => ex
raise ex.exception(ex.message + " (in #{name})")
end
end
Se chegar perto.
você precisa tratar todos os testes de forma independente. Então, se um teste falhar, ele vai continuar testando outros testes. Confira phpunit e Selenium RC