howitzer 0.0.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +8 -0
- data/.rspec +3 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +32 -0
- data/GETTING_STARTED.md +529 -0
- data/Gemfile +4 -2
- data/LICENSE +2 -2
- data/README.md +57 -13
- data/Rakefile +9 -2
- data/bin/howitzer +79 -31
- data/generators/base_generator.rb +87 -0
- data/generators/config/config_generator.rb +16 -20
- data/generators/config/templates/default.yml +26 -7
- data/generators/cucumber/cucumber_generator.rb +20 -26
- data/generators/{tasks → cucumber}/templates/cucumber.rake +0 -0
- data/generators/{config → cucumber}/templates/cucumber.yml +0 -0
- data/generators/emails/emails_generator.rb +11 -18
- data/generators/emails/templates/example_email.rb +1 -0
- data/generators/pages/pages_generator.rb +16 -18
- data/generators/pages/templates/example_menu.rb +1 -0
- data/generators/pages/templates/example_page.rb +1 -1
- data/generators/root/root_generator.rb +18 -20
- data/generators/root/templates/.gitignore +2 -1
- data/generators/root/templates/Gemfile +3 -2
- data/generators/root/templates/Rakefile +10 -0
- data/generators/root/templates/boot.rb +3 -9
- data/generators/rspec/rspec_generator.rb +23 -0
- data/generators/rspec/templates/example_spec.rb +7 -0
- data/generators/rspec/templates/rspec.rake +34 -0
- data/generators/rspec/templates/spec_helper.rb +56 -0
- data/generators/tasks/tasks_generator.rb +11 -17
- data/generators/tasks/templates/common.rake +15 -0
- data/howitzer.gemspec +13 -2
- data/lib/howitzer.rb +1 -0
- data/lib/howitzer/helpers.rb +87 -2
- data/lib/howitzer/init.rb +0 -1
- data/lib/howitzer/patches/rawler_patched.rb +86 -0
- data/lib/howitzer/settings.rb +27 -0
- data/lib/howitzer/utils.rb +3 -12
- data/lib/howitzer/utils/capybara_patched.rb +3 -2
- data/lib/howitzer/utils/capybara_settings.rb +158 -24
- data/lib/howitzer/utils/data_generator/data_storage.rb +35 -1
- data/lib/howitzer/utils/data_generator/gen.rb +45 -3
- data/lib/howitzer/utils/email/email.rb +44 -5
- data/lib/howitzer/utils/email/mail_client.rb +28 -22
- data/lib/howitzer/utils/email/mailgun_helper.rb +30 -4
- data/lib/howitzer/utils/locator_store.rb +111 -19
- data/lib/howitzer/utils/log.rb +137 -0
- data/lib/howitzer/utils/page_validator.rb +86 -0
- data/lib/howitzer/vendor/firebug-1.12.1-fx.xpi +0 -0
- data/lib/howitzer/vendor/firepath-0.9.7-fx.xpi +0 -0
- data/lib/howitzer/version.rb +2 -2
- data/lib/howitzer/web_page.rb +159 -19
- data/spec/active_resource.rb +0 -0
- data/spec/config/custom.yml +1 -0
- data/spec/config/default.yml +28 -0
- data/spec/spec_helper.rb +46 -1
- data/spec/support/boot_helper.rb +15 -0
- data/spec/support/generator_helper.rb +13 -0
- data/spec/support/logger_helper.rb +12 -0
- data/spec/unit/bin/howitzer_spec.rb +175 -0
- data/spec/unit/generators/generators_spec.rb +175 -0
- data/spec/unit/lib/capybara_settings_spec.rb +170 -0
- data/spec/unit/lib/helpers_spec.rb +619 -0
- data/spec/unit/lib/init_spec.rb +14 -0
- data/spec/unit/lib/settings_spec.rb +17 -0
- data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +62 -0
- data/spec/unit/lib/utils/data_generator/gen_spec.rb +151 -0
- data/spec/unit/lib/utils/email/email_spec.rb +75 -0
- data/spec/unit/lib/utils/email/mail_client_spec.rb +115 -0
- data/spec/unit/lib/utils/email/mailgun_helper_spec.rb +95 -0
- data/spec/unit/lib/utils/locator_store_spec.rb +122 -0
- data/spec/unit/lib/utils/log_spec.rb +107 -0
- data/spec/unit/lib/utils/page_validator_spec.rb +142 -0
- data/spec/unit/lib/web_page_spec.rb +250 -0
- data/spec/unit/version_spec.rb +8 -0
- metadata +215 -15
- data/Gemfile.lock +0 -103
- data/History.md +0 -20
- data/lib/howitzer/utils/logger.rb +0 -108
- data/spec/howitzer/version_spec.rb +0 -8
data/lib/howitzer.rb
CHANGED
data/lib/howitzer/helpers.rb
CHANGED
@@ -1,17 +1,38 @@
|
|
1
|
+
DriverNotSpecified = Class.new(StandardError)
|
2
|
+
SlBrowserNameNotSpecified = Class.new(StandardError)
|
3
|
+
TbBrowserNameNotSpecified = Class.new(StandardError)
|
4
|
+
SelBrowserNotSpecified = Class.new(StandardError)
|
5
|
+
CHECK_YOUR_SETTINGS_MSG = "Please check your settings"
|
6
|
+
DRIVER_NOT_SPECIFIED = DriverNotSpecified.new(CHECK_YOUR_SETTINGS_MSG)
|
7
|
+
SL_BROWSER_NAME_NOT_SPECIFIED = SlBrowserNameNotSpecified.new(CHECK_YOUR_SETTINGS_MSG)
|
8
|
+
TB_BROWSER_NAME_NOT_SPECIFIED = TbBrowserNameNotSpecified.new(CHECK_YOUR_SETTINGS_MSG)
|
9
|
+
SEL_BROWSER_NOT_SPECIFIED = SelBrowserNotSpecified.new(CHECK_YOUR_SETTINGS_MSG)
|
1
10
|
|
2
11
|
def sauce_driver?
|
12
|
+
raise DRIVER_NOT_SPECIFIED if settings.driver.nil?
|
3
13
|
settings.driver.to_sym == :sauce
|
4
14
|
end
|
5
15
|
|
16
|
+
def testingbot_driver?
|
17
|
+
raise DRIVER_NOT_SPECIFIED if settings.driver.nil?
|
18
|
+
settings.driver.to_sym == :testingbot
|
19
|
+
end
|
20
|
+
|
6
21
|
def selenium_driver?
|
22
|
+
raise DRIVER_NOT_SPECIFIED if settings.driver.nil?
|
7
23
|
settings.driver.to_sym == :selenium
|
8
24
|
end
|
9
25
|
|
10
26
|
def ie_browser?
|
11
27
|
ie_browsers = [:ie, :iexplore]
|
12
28
|
if sauce_driver?
|
29
|
+
raise SL_BROWSER_NAME_NOT_SPECIFIED if settings.sl_browser_name.nil?
|
13
30
|
ie_browsers.include?(settings.sl_browser_name.to_sym)
|
31
|
+
elsif testingbot_driver?
|
32
|
+
raise TB_BROWSER_NAME_NOT_SPECIFIED if settings.tb_browser_name.nil?
|
33
|
+
ie_browsers.include?(settings.tb_browser_name.to_sym)
|
14
34
|
elsif selenium_driver?
|
35
|
+
raise SEL_BROWSER_NOT_SPECIFIED if settings.sel_browser.nil?
|
15
36
|
ie_browsers.include?(settings.sel_browser.to_sym)
|
16
37
|
end
|
17
38
|
end
|
@@ -19,22 +40,58 @@ end
|
|
19
40
|
def ff_browser?
|
20
41
|
ff_browsers = [:ff, :firefox]
|
21
42
|
if sauce_driver?
|
43
|
+
raise SL_BROWSER_NAME_NOT_SPECIFIED if settings.sl_browser_name.nil?
|
22
44
|
ff_browsers.include?(settings.sl_browser_name.to_sym)
|
45
|
+
elsif testingbot_driver?
|
46
|
+
raise TB_BROWSER_NAME_NOT_SPECIFIED if settings.tb_browser_name.nil?
|
47
|
+
ff_browsers.include?(settings.tb_browser_name.to_sym)
|
23
48
|
elsif selenium_driver?
|
49
|
+
raise SEL_BROWSER_NOT_SPECIFIED if settings.sel_browser.nil?
|
24
50
|
ff_browsers.include?(settings.sel_browser.to_sym)
|
25
51
|
end
|
26
52
|
end
|
27
53
|
|
54
|
+
|
28
55
|
def chrome_browser?
|
29
56
|
chrome_browser = :chrome
|
30
57
|
if sauce_driver?
|
58
|
+
raise SL_BROWSER_NAME_NOT_SPECIFIED if settings.sl_browser_name.nil?
|
31
59
|
settings.sl_browser_name.to_sym == chrome_browser
|
32
|
-
elsif
|
60
|
+
elsif testingbot_driver?
|
61
|
+
raise TB_BROWSER_NAME_NOT_SPECIFIED if settings.tb_browser_name.nil?
|
62
|
+
settings.tb_browser_name.to_sym == chrome_browser
|
63
|
+
elsif selenium_driver?
|
64
|
+
raise SEL_BROWSER_NOT_SPECIFIED if settings.sel_browser.nil?
|
33
65
|
settings.sel_browser.to_sym == chrome_browser
|
34
66
|
end
|
35
67
|
end
|
36
68
|
|
37
69
|
|
70
|
+
##
|
71
|
+
#
|
72
|
+
# Returns application url including base authentication (if specified in settings)
|
73
|
+
#
|
74
|
+
|
75
|
+
def app_url
|
76
|
+
prefix = settings.app_base_auth_login.blank? ? '' : "#{settings.app_base_auth_login}:#{settings.app_base_auth_pass}@"
|
77
|
+
app_base_url prefix
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Returns application url without base authentication by default
|
82
|
+
#
|
83
|
+
# *Parameters:*
|
84
|
+
# * +prefix+ - Sets base authentication prefix (defaults to: nil)
|
85
|
+
#
|
86
|
+
|
87
|
+
def app_base_url(prefix=nil)
|
88
|
+
"#{settings.app_protocol || 'http'}://#{prefix}#{settings.app_host}"
|
89
|
+
end
|
90
|
+
|
91
|
+
# *Parameters:*
|
92
|
+
# * +time_in_numeric+ - Number of seconds
|
93
|
+
#
|
94
|
+
|
38
95
|
def duration(time_in_numeric)
|
39
96
|
secs = time_in_numeric.to_i
|
40
97
|
mins = secs / 60
|
@@ -48,20 +105,48 @@ def duration(time_in_numeric)
|
|
48
105
|
end
|
49
106
|
end
|
50
107
|
|
108
|
+
##
|
109
|
+
#
|
110
|
+
# Evaluates given value
|
111
|
+
#
|
112
|
+
# *Parameters:*
|
113
|
+
# * +value+ - Value to be evaluated
|
114
|
+
#
|
115
|
+
|
51
116
|
def ri(value)
|
52
117
|
raise value.inspect
|
53
118
|
end
|
54
119
|
|
55
120
|
class String
|
121
|
+
|
122
|
+
##
|
123
|
+
#
|
124
|
+
# Delegates WebPage.open method. Useful in cucumber step definitions
|
125
|
+
#
|
126
|
+
# *Parameters:*
|
127
|
+
# * +*args+ - Url to be opened
|
128
|
+
#
|
129
|
+
|
56
130
|
def open(*args)
|
57
131
|
as_page_class.open(*args)
|
58
132
|
end
|
59
133
|
|
134
|
+
##
|
135
|
+
#
|
136
|
+
# Returns page instance
|
137
|
+
#
|
138
|
+
|
139
|
+
|
60
140
|
def given
|
61
141
|
as_page_class.new
|
62
142
|
end
|
63
143
|
|
144
|
+
##
|
145
|
+
#
|
146
|
+
# Returns page class
|
147
|
+
#
|
148
|
+
|
64
149
|
def as_page_class
|
65
150
|
Object.const_get("#{self.capitalize}Page")
|
66
151
|
end
|
67
|
-
end
|
152
|
+
end
|
data/lib/howitzer/init.rb
CHANGED
@@ -0,0 +1,86 @@
|
|
1
|
+
module Rawler
|
2
|
+
class Base
|
3
|
+
def record_response(code, link, from_url, redirection=nil)
|
4
|
+
message = "#{code} - #{link}"
|
5
|
+
|
6
|
+
if code.to_i >= 300
|
7
|
+
message += " - Called from: #{from_url}"
|
8
|
+
end
|
9
|
+
|
10
|
+
message += " - Following redirection to: #{redirection}" if redirection
|
11
|
+
log_fields = {code: code, link: link, message: message}
|
12
|
+
|
13
|
+
code = code.to_i
|
14
|
+
case code / 100
|
15
|
+
when 1,2
|
16
|
+
Rawler.output.info(message)
|
17
|
+
add_xml_log_item(log_fields) if settings.add_rawler_xml_log
|
18
|
+
add_html_log_item(log_fields) if settings.add_rawler_html_log
|
19
|
+
when 3 then
|
20
|
+
Rawler.output.warn(message)
|
21
|
+
add_xml_log_item(log_fields) if settings.add_rawler_xml_log
|
22
|
+
add_html_log_item(log_fields) if settings.add_rawler_html_log
|
23
|
+
when 4,5 then
|
24
|
+
Rawler.output.error(message)
|
25
|
+
log_fields[:failed] = true
|
26
|
+
add_xml_log_item(log_fields) if settings.add_rawler_xml_log
|
27
|
+
add_html_log_item(log_fields) if settings.add_rawler_html_log
|
28
|
+
else
|
29
|
+
Rawler.output.error("Unknown code #{message}")
|
30
|
+
log_fields[:failed] = true
|
31
|
+
log_fields[:message] = "Unknown code #{message}"
|
32
|
+
add_xml_log_item(log_fields) if settings.add_rawler_xml_log
|
33
|
+
add_html_log_item(log_fields) if settings.add_rawler_html_log
|
34
|
+
end
|
35
|
+
@logfile.puts(message) if Rawler.log
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_xml_log_item(fields)
|
39
|
+
log_file_path = File.expand_path(settings.rawler_xml_log, "#{settings.log_dir}")
|
40
|
+
|
41
|
+
doc = File.exists?(log_file_path) ? Nokogiri::XML::Document.parse(File.read log_file_path) : Nokogiri::XML::Document.new
|
42
|
+
|
43
|
+
doc.encoding = 'UTF-8'
|
44
|
+
|
45
|
+
if doc.root
|
46
|
+
tests = doc.root > ("testcase")
|
47
|
+
failures = doc.root > ("testcase failure")
|
48
|
+
doc.root[:failures] = failures.to_a.size.to_s
|
49
|
+
doc.root[:tests] = tests.to_a.size.to_s
|
50
|
+
doc.root[:time] = "#{tests.to_a.size} sec."
|
51
|
+
else
|
52
|
+
root = doc.create_element('testsuite')
|
53
|
+
root[:errors] = "0"
|
54
|
+
root[:failures] = "0"
|
55
|
+
root[:name] = "Check links"
|
56
|
+
root[:skipped] = "0"
|
57
|
+
root[:tests] = "0"
|
58
|
+
root[:time] = "0 sec."
|
59
|
+
doc.root = root
|
60
|
+
end
|
61
|
+
|
62
|
+
testcase = doc.create_element('testcase')
|
63
|
+
testcase[:classname] = "Check links"
|
64
|
+
testcase[:name] = "Check: link '#{fields[:link]}'"
|
65
|
+
testcase[:time] = "1"
|
66
|
+
|
67
|
+
if fields[:failed]
|
68
|
+
failure = doc.create_element('failure', message: "Failed responce code: '#{fields[:code]}'", type:'failed')
|
69
|
+
failure << doc.create_cdata("#{fields[:message]}")
|
70
|
+
testcase << failure
|
71
|
+
end
|
72
|
+
|
73
|
+
testcase << doc.create_element('system-out')
|
74
|
+
testcase << doc.create_element('system-err')
|
75
|
+
doc.root << testcase
|
76
|
+
|
77
|
+
File.open(log_file_path, 'w+') do |f|
|
78
|
+
f.write(doc.serialize(:encoding => 'UTF-8', :save_with => Nokogiri::XML::Node::SaveOptions::FORMAT))
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def add_html_log_item(fields)
|
83
|
+
#Todo: should be implemented
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'sexy_settings'
|
2
|
+
|
3
|
+
SexySettings.configure do |config|
|
4
|
+
config.path_to_default_settings = File.expand_path("config/default.yml", Dir.pwd)
|
5
|
+
config.path_to_custom_settings = File.expand_path("config/custom.yml", Dir.pwd)
|
6
|
+
end
|
7
|
+
|
8
|
+
##
|
9
|
+
#
|
10
|
+
# Returns settings as singleton object
|
11
|
+
#
|
12
|
+
# *Example:*
|
13
|
+
#
|
14
|
+
# +settings.app_host+
|
15
|
+
|
16
|
+
def settings
|
17
|
+
SexySettings::Base.instance
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
#
|
22
|
+
# Returns logger as singleton object
|
23
|
+
#
|
24
|
+
|
25
|
+
def log
|
26
|
+
Howitzer::Log.instance
|
27
|
+
end
|
data/lib/howitzer/utils.rb
CHANGED
@@ -1,14 +1,5 @@
|
|
1
|
-
require 'sexy_settings'
|
2
1
|
require 'repeater'
|
2
|
+
require 'capybara'
|
3
|
+
require 'selenium-webdriver'
|
3
4
|
|
4
|
-
|
5
|
-
config.path_to_default_settings = File.expand_path("config/default.yml", Dir.pwd)
|
6
|
-
config.path_to_custom_settings = File.expand_path("config/custom.yml", Dir.pwd)
|
7
|
-
end
|
8
|
-
|
9
|
-
def settings
|
10
|
-
SexySettings::Base.instance()
|
11
|
-
end
|
12
|
-
|
13
|
-
|
14
|
-
Dir[File.join(File.dirname(__FILE__), "./utils/**/*.rb")].each {|f| require f}
|
5
|
+
Dir[File.join(File.dirname(__FILE__), "./utils/**/*.rb")].each {|f| require f}
|
@@ -12,11 +12,12 @@ module CapybaraPatched
|
|
12
12
|
class_eval <<-RUBY
|
13
13
|
def #{method}(*args, &block)
|
14
14
|
retryable(tries:3, logger: log, trace: true, on: RETRY_ON) do
|
15
|
-
|
15
|
+
@touched = true
|
16
|
+
current_scope.send(:#{method}, *args.flatten, &block)
|
16
17
|
end
|
17
18
|
end
|
18
19
|
RUBY
|
19
20
|
end
|
20
21
|
end
|
21
22
|
end
|
22
|
-
end
|
23
|
+
end
|
@@ -1,37 +1,81 @@
|
|
1
|
-
|
1
|
+
##
|
2
|
+
#
|
3
|
+
# Predefined Capybara settings and capybara drivers
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'howitzer/utils/log'
|
2
7
|
module CapybaraSettings
|
3
8
|
extend self
|
4
9
|
|
10
|
+
##
|
11
|
+
#
|
12
|
+
# Predefined settings of Firefox browser
|
13
|
+
#
|
14
|
+
# *Returns:*
|
15
|
+
# * +Hash+ - Settings that can be changed
|
16
|
+
#
|
17
|
+
|
18
|
+
|
5
19
|
def self.base_ff_profile_settings
|
6
20
|
profile = Selenium::WebDriver::Firefox::Profile.new
|
7
21
|
profile["network.http.phishy-userpass-length"] = 255
|
8
22
|
profile["browser.safebrowsing.malware.enabled"] = false
|
9
23
|
profile["network.automatic-ntlm-auth.allow-non-fqdn"] = true
|
10
24
|
profile["network.ntlm.send-lm-response"] = true
|
11
|
-
profile["network.automatic-ntlm-auth.trusted-uris"] = settings.
|
25
|
+
profile["network.automatic-ntlm-auth.trusted-uris"] = settings.app_host
|
12
26
|
profile
|
13
27
|
end
|
14
28
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
29
|
+
class << self
|
30
|
+
|
31
|
+
##
|
32
|
+
#
|
33
|
+
#Defines driver based on specified test environment settings
|
34
|
+
#
|
35
|
+
|
36
|
+
def define_driver
|
37
|
+
case settings.driver.to_sym
|
38
|
+
when :selenium
|
39
|
+
define_selenium_driver
|
40
|
+
when :selenium_dev
|
41
|
+
define_selenium_dev_driver
|
42
|
+
when :webkit
|
43
|
+
define_webkit_driver
|
44
|
+
when :poltergeist
|
45
|
+
define_poltergeist_driver
|
46
|
+
when :sauce
|
47
|
+
define_sauce_driver
|
48
|
+
when :testingbot
|
49
|
+
define_testingbot_driver
|
50
|
+
else
|
51
|
+
log.error "Unknown '#{settings.driver}' driver. Check your settings, it should be one of [selenium, selenium_dev, webkit, sauce, testingbot]"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def define_selenium_driver
|
21
58
|
Capybara.register_driver :selenium do |app|
|
22
59
|
params = {browser: settings.sel_browser.to_sym}
|
23
60
|
params[:profile] = base_ff_profile_settings if ff_browser?
|
24
61
|
Capybara::Selenium::Driver.new app, params
|
25
62
|
end
|
26
|
-
|
63
|
+
end
|
64
|
+
|
65
|
+
def define_selenium_dev_driver
|
27
66
|
Capybara.register_driver :selenium_dev do |app|
|
28
67
|
profile = base_ff_profile_settings
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
68
|
+
vendor_dir = settings.custom_vendor_dir || File.join(File.dirname(__FILE__), '..', 'vendor')
|
69
|
+
raise "Vendor directory was not found('#{vendor_dir}')." unless Dir.exist?(vendor_dir)
|
70
|
+
%w(firebug*.xpi firepath*.xpi).each do |file_name|
|
71
|
+
full_path_pattern = File.join(File.expand_path(vendor_dir), file_name)
|
72
|
+
if (full_path = Dir[full_path_pattern].first)
|
73
|
+
profile.add_extension full_path
|
74
|
+
else
|
75
|
+
raise "Extension was not found by '#{full_path_pattern}' pattern!"
|
76
|
+
end
|
33
77
|
end
|
34
|
-
profile['extensions.firebug.currentVersion'] =
|
78
|
+
profile['extensions.firebug.currentVersion'] = 'Last' # avoid 'first run' tab
|
35
79
|
profile["extensions.firebug.previousPlacement"] = 1
|
36
80
|
profile["extensions.firebug.onByDefault"] = true
|
37
81
|
profile["extensions.firebug.defaultPanelName"] = "firepath"
|
@@ -41,18 +85,30 @@ module CapybaraSettings
|
|
41
85
|
|
42
86
|
Capybara::Selenium::Driver.new app, browser: :firefox, profile: profile
|
43
87
|
end
|
44
|
-
|
88
|
+
end
|
89
|
+
|
90
|
+
def define_webkit_driver
|
45
91
|
require 'capybara-webkit'
|
46
|
-
|
92
|
+
end
|
93
|
+
|
94
|
+
def define_poltergeist_driver
|
47
95
|
require 'capybara/poltergeist'
|
48
96
|
Capybara.register_driver :poltergeist do |app|
|
49
|
-
Capybara::Poltergeist::Driver.new(
|
97
|
+
Capybara::Poltergeist::Driver.new(
|
98
|
+
app, {
|
99
|
+
js_errors: !settings.pjs_ignore_js_errors,
|
100
|
+
phantomjs_options: ["--ignore-ssl-errors=#{settings.pjs_ignore_ssl_errors ? 'yes' : 'no'}" ]
|
101
|
+
}
|
102
|
+
)
|
50
103
|
end
|
51
|
-
|
104
|
+
end
|
105
|
+
|
106
|
+
def define_sauce_driver
|
107
|
+
task_name = ENV['RAKE_TASK'].to_s.sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
|
52
108
|
caps_opts = {
|
53
109
|
platform: settings.sl_platform,
|
54
110
|
browser_name: settings.sl_browser_name,
|
55
|
-
name: '
|
111
|
+
name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.sl_browser_name.upcase}",
|
56
112
|
"max-duration" => settings.sl_max_duration,
|
57
113
|
'idle-timeout' => settings.sl_idle_timeout,
|
58
114
|
'selenium-version' => settings.sl_selenium_version,
|
@@ -72,15 +128,59 @@ module CapybaraSettings
|
|
72
128
|
}
|
73
129
|
|
74
130
|
Capybara.register_driver :sauce do |app|
|
75
|
-
Capybara::Selenium::Driver.new(app, options)
|
131
|
+
driver = Capybara::Selenium::Driver.new(app, options)
|
132
|
+
driver.browser.file_detector = lambda do |args|
|
133
|
+
str = args.first.to_s
|
134
|
+
str if File.exist?(str)
|
135
|
+
end
|
136
|
+
driver
|
76
137
|
end
|
138
|
+
end
|
77
139
|
|
78
|
-
|
79
|
-
|
140
|
+
def define_testingbot_driver
|
141
|
+
require 'testingbot'
|
142
|
+
task_name = ENV['RAKE_TASK'].to_s.sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
|
143
|
+
caps_opts = {
|
144
|
+
platform: settings.tb_platform,
|
145
|
+
browser_name: settings.tb_browser_name,
|
146
|
+
name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.tb_browser_name.upcase}",
|
147
|
+
maxduration: settings.tb_max_duration.to_i,
|
148
|
+
idletimeout: settings.tb_idle_timeout.to_i,
|
149
|
+
'selenium-version' => settings.tb_selenium_version,
|
150
|
+
screenshot: settings.tb_record_screenshot,
|
151
|
+
'avoid-proxy' => settings.tb_avoid_proxy
|
152
|
+
}
|
153
|
+
|
154
|
+
unless (settings.tb_browser_version.to_s || "").empty?
|
155
|
+
caps_opts['version'] = settings.tb_browser_version.to_s
|
156
|
+
end
|
157
|
+
options = {
|
158
|
+
url: settings.tb_url,
|
159
|
+
desired_capabilities: Selenium::WebDriver::Remote::Capabilities.new(caps_opts),
|
160
|
+
http_client: Selenium::WebDriver::Remote::Http::Default.new.tap{|c| c.timeout = settings.timeout_medium},
|
161
|
+
browser: :remote
|
162
|
+
}
|
163
|
+
Capybara.register_driver :testingbot do |app|
|
164
|
+
driver = Capybara::Selenium::Driver.new(app, options)
|
165
|
+
driver.browser.file_detector = lambda do |args|
|
166
|
+
str = args.first.to_s
|
167
|
+
str if File.exist?(str)
|
168
|
+
end
|
169
|
+
driver
|
170
|
+
end
|
171
|
+
end
|
80
172
|
end
|
81
173
|
|
82
|
-
|
83
|
-
|
174
|
+
##
|
175
|
+
#
|
176
|
+
# Returns url of current Sauce Labs job
|
177
|
+
#
|
178
|
+
# *Parameters:*
|
179
|
+
# * +name+ - Your account name
|
180
|
+
#
|
181
|
+
# *Returns:*
|
182
|
+
# * +string+ - URL address of last running Sauce Labs job
|
183
|
+
#
|
84
184
|
|
85
185
|
def sauce_resource_path(name)
|
86
186
|
host = "https://#{settings.sl_user}:#{settings.sl_api_key}@saucelabs.com"
|
@@ -88,6 +188,15 @@ module CapybaraSettings
|
|
88
188
|
"#{host}#{path}"
|
89
189
|
end
|
90
190
|
|
191
|
+
##
|
192
|
+
#
|
193
|
+
# Sends http request to change current Sauce Labs job status - pass/fail
|
194
|
+
#
|
195
|
+
# *Parameters:*
|
196
|
+
# * +json_data+ - test status as hash (for details see Saucelab documentation)
|
197
|
+
#
|
198
|
+
|
199
|
+
|
91
200
|
def update_sauce_job_status(json_data = {})
|
92
201
|
host = "http://#{settings.sl_user}:#{settings.sl_api_key}@saucelabs.com"
|
93
202
|
path = "/rest/v1/#{settings.sl_user}/jobs/#{session_id}"
|
@@ -95,6 +204,14 @@ module CapybaraSettings
|
|
95
204
|
RestClient.put url, json_data.to_json, content_type: :json, accept: :json
|
96
205
|
end
|
97
206
|
|
207
|
+
##
|
208
|
+
#
|
209
|
+
# Returns custom name for Sauce Labs job
|
210
|
+
#
|
211
|
+
# *Returns:*
|
212
|
+
# * +string+ - Return name of current Sauce Labs job
|
213
|
+
#
|
214
|
+
|
98
215
|
def suite_name
|
99
216
|
res = if ENV['RAKE_TASK']
|
100
217
|
res = ENV['RAKE_TASK'].sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
|
@@ -105,9 +222,26 @@ module CapybaraSettings
|
|
105
222
|
"#{res} #{settings.sl_browser_name.upcase}"
|
106
223
|
end
|
107
224
|
|
225
|
+
##
|
226
|
+
#
|
227
|
+
# Returns current session id
|
228
|
+
#
|
229
|
+
|
108
230
|
def session_id
|
109
231
|
Capybara.current_session.driver.browser.instance_variable_get(:@bridge).session_id
|
110
232
|
end
|
111
233
|
|
234
|
+
Capybara.run_server = false
|
235
|
+
Capybara.app_host = ''
|
236
|
+
Capybara.default_wait_time = settings.timeout_small
|
237
|
+
Capybara.ignore_hidden_elements = true
|
238
|
+
Capybara.visible_text_only = true
|
239
|
+
Capybara.match = :one
|
240
|
+
Capybara.exact_options = true
|
241
|
+
Capybara.default_driver = settings.driver.to_sym
|
242
|
+
Capybara.javascript_driver = settings.driver.to_sym
|
243
|
+
|
244
|
+
define_driver
|
245
|
+
|
112
246
|
end
|
113
247
|
|