123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- ENV["RAILS_ENV"] = "test"
- require File.expand_path('../../config/environment', __FILE__)
- require 'rails/test_help'
- require 'selenium-webdriver'
- class TestCase < Test::Unit::TestCase
- def browser_url
- ENV['BROWSER_URL'] || 'http://localhost:3000'
- end
- def browser_instance
- if !@browsers
- @browsers = []
- end
- if !ENV['REMOTE_URL']
- if !ENV['BROWSER']
- ENV['BROWSER'] = 'firefox'
- end
- browser = Selenium::WebDriver.for( ENV['BROWSER'].to_sym )
- @browsers.push browser
- return browser
- end
- caps = Selenium::WebDriver::Remote::Capabilities.send( ENV['BROWSER'] )
- caps.platform = ENV['BROWSER_OS'] || 'Windows 2008'
- caps.version = ENV['BROWSER_VERSION'] || '8'
- browser = Selenium::WebDriver.for(
- :remote,
- :url => ENV['REMOTE_URL'],
- :desired_capabilities => caps,
- )
- @browsers.push browser
- return browser
- end
- def teardown
- return if !@browsers
- # only shut down browser type once
- # otherwise this error will happen "Errno::ECONNREFUSED: Connection refused - connect(2)"
- shutdown = {}
- @browsers.each{ |browser|
- next if shutdown[ browser.browser ]
- shutdown[ browser.browser ] = true
- browser.quit
- }
- end
- # Add more helper methods to be used by all tests here...
- def browser_login(data)
- all_tests = [
- {
- :name => 'login',
- :instance => data[:instance] || browser_instance,
- :url => data[:url] || browser_url,
- :action => [
- {
- :execute => 'wait',
- :value => 2,
- },
- {
- :execute => 'check',
- :css => '#login',
- :result => true,
- },
- {
- :execute => 'set',
- :css => 'input[name="username"]',
- :value => data[:username] || 'nicole.braun@zammad.org',
- },
- {
- :execute => 'set',
- :css => 'input[name="password"]',
- :value => data[:password] || 'test'
- },
- {
- :execute => 'click',
- :css => '#login button',
- },
- {
- :execute => 'wait',
- :value => 2,
- },
- {
- :execute => 'check',
- :css => '#login',
- :result => false,
- },
- ],
- },
- ];
- return all_tests
- end
- def browser_signle_test_with_login(tests, login = {})
- all_tests = browser_login( login )
- all_tests = all_tests.concat( tests )
- browser_single_test(all_tests)
- end
- def browser_double_test(tests)
- instance1 = browser_single_test( browser_login({
- :instance => tests[0][:instance1],
- :username => tests[0][:instance1_username],
- :password => tests[0][:instance1_password],
- :url => tests[0][:url],
- }), true )
- instance2 = browser_single_test( browser_login({
- :instance => tests[0][:instance2],
- :username => tests[0][:instance2_username],
- :password => tests[0][:instance2_password],
- :url => tests[0][:url],
- }), true )
- tests.each { |test|
- if test[:action]
- test[:action].each { |action|
- if action[:execute] == 'wait'
- sleep action[:value]
- next
- end
- next if !action[:where]
- if action[:where] == :instance1
- instance = instance1
- else
- instance = instance2
- end
- browser_element_action(test, action, instance)
- }
- end
- }
- instance1.close
- instance2.close
- end
- def browser_single_test(tests, keep_connection = false)
- instance = nil
- @stack = nil
- tests.each { |test|
- if test[:instance]
- instance = test[:instance]
- end
- if test[:url]
- instance.get( test[:url] )
- end
- if test[:action]
- test[:action].each { |action|
- if action[:execute] == 'wait'
- sleep action[:value]
- next
- end
- browser_element_action(test, action, instance)
- }
- end
- }
- if keep_connection
- return instance
- end
- instance.close
- end
- def browser_element_action(test, action, instance)
- #puts "NOTICE: " + action.inspect
- if action[:css]
- begin
- if action[:range] == 'all'
- element = instance.find_elements( { :css => action[:css] } )
- else
- element = instance.find_element( { :css => action[:css] } )
- end
- rescue
- element = nil
- end
- if action[:result] == false
- assert( !element, "(#{test[:name]}) Element with css '#{action[:css]}' exists" )
- else
- assert( element, "(#{test[:name]}) Element with css '#{action[:css]}' doesn't exist" )
- end
- elsif action[:element] == :url
- if instance.current_url =~ /#{Regexp.quote(action[:result])}/
- assert( true, "(#{test[:name]}) url #{instance.current_url} is matching #{action[:result]}" )
- else
- assert( false, "(#{test[:name]}) url #{instance.current_url} is not matching #{action[:result]}" )
- end
- elsif action[:element] == :alert
- element = instance.switch_to.alert
- elsif action[:execute] == 'close_all_tasks'
- while true
- begin
- element = instance.find_element( { :css => '.taskbar [data-type="close"]' } )
- if element
- element.click
- sleep 0.8
- else
- break
- end
- rescue
- break
- end
- end
- elsif action[:execute] == 'navigate'
- instance.navigate.to( action[:to] )
- else
- assert( false, "(#{test[:name]}) unknow selector for '#{action[:element]}'" )
- end
- if action[:execute] == 'set'
- element.clear
- if action[:value] == '###stack###'
- element.send_keys( @stack )
- else
- element.send_keys( action[:value] )
- end
- elsif action[:execute] == 'sendkey'
- element.send_keys( action[:value] )
- elsif action[:execute] == 'select'
- dropdown = Selenium::WebDriver::Support::Select.new(element)
- dropdown.select_by(:text, action[:value])
- elsif action[:execute] == 'click'
- if element.class == Array
- element.each {|item|
- item.click
- }
- else
- element.click
- end
- elsif action[:execute] == 'accept'
- element.accept
- elsif action[:execute] == 'dismiss'
- element.dismiss
- elsif action[:execute] == 'send_key'
- element.send_keys action[:value]
- elsif action[:execute] == 'match'
- if action[:css] =~ /select/
- dropdown = Selenium::WebDriver::Support::Select.new(element)
- success = false
- if dropdown.selected_options
- dropdown.selected_options.each {|option|
- if option.text == action[:value]
- success = true
- end
- }
- end
- if action[:match_result]
- if success
- assert( true, "(#{test[:name]}) matching '#{action[:value]}' in select list" )
- else
- assert( false, "(#{test[:name]}) not matching '#{action[:value]}' in select list" )
- end
- else
- if success
- assert( false, "(#{test[:name]}) not matching '#{action[:value]}' in select list" )
- else
- assert( true, "(#{test[:name]}) matching '#{action[:value]}' in select list" )
- end
- end
- else
- if action[:css] =~ /(input|textarea)/i
- text = element.attribute('value')
- else
- text = element.text
- end
- if action[:value] == '###stack###'
- action[:value] = @stack
- end
- match = false
- if action[:no_quote]
- if text =~ /#{action[:value]}/
- if $1
- @stack = $1
- end
- match = $1 || true
- end
- else
- if text =~ /#{Regexp.quote(action[:value])}/
- match = true
- end
- end
- if match
- if action[:match_result]
- assert( true, "(#{test[:name]}) matching '#{action[:value]}' in content '#{text}'" )
- else
- assert( false, "(#{test[:name]}) matching '#{action[:value]}' in content '#{text}' but should not!" )
- end
- else
- if !action[:match_result]
- assert( true, "(#{test[:name]}) not matching '#{action[:value]}' in content '#{text}'" )
- else
- assert( false, "(#{test[:name]}) not matching '#{action[:value]}' in content '#{text}' but should not!" )
- end
- end
- end
- elsif action[:execute] == 'check'
- elsif action[:execute] == 'close_all_tasks'
- elsif action[:execute] == 'navigate'
- else
- assert( false, "(#{test[:name]}) unknow action '#{action[:execute]}'" )
- end
- end
- end
|