howitzer 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -1
- data/.travis.yml +3 -2
- data/CHANGELOG.md +25 -5
- data/GETTING_STARTED.md +158 -13
- data/README.md +49 -32
- data/Rakefile +10 -1
- data/bin/howitzer +49 -78
- data/features/cli_help.feature +30 -0
- data/features/cli_new.feature +263 -0
- data/features/cli_unknown.feature +17 -0
- data/features/cli_version.feature +14 -0
- data/features/step_definitions/common_steps.rb +1 -0
- data/features/support/env.rb +1 -0
- data/features/support/transformers.rb +3 -0
- data/generators/base_generator.rb +2 -0
- data/generators/config/config_generator.rb +1 -1
- data/generators/config/templates/default.yml +4 -14
- data/generators/cucumber/cucumber_generator.rb +1 -1
- data/generators/cucumber/templates/cucumber.yml +1 -2
- data/generators/cucumber/templates/env.rb +8 -7
- data/generators/emails/emails_generator.rb +1 -1
- data/generators/pages/pages_generator.rb +1 -1
- data/generators/pages/templates/example_page.rb +2 -2
- data/generators/root/root_generator.rb +1 -1
- data/generators/root/templates/Gemfile +1 -1
- data/generators/rspec/rspec_generator.rb +1 -1
- data/generators/rspec/templates/example_spec.rb +2 -2
- data/generators/rspec/templates/rspec.rake +1 -1
- data/generators/rspec/templates/spec_helper.rb +6 -5
- data/generators/tasks/tasks_generator.rb +1 -1
- data/generators/tasks/templates/common.rake +1 -0
- data/howitzer.gemspec +8 -8
- data/lib/howitzer.rb +4 -1
- data/lib/howitzer/blank_page.rb +6 -0
- data/lib/howitzer/capybara/dsl_ex.rb +15 -0
- data/lib/howitzer/capybara/settings.rb +267 -0
- data/lib/howitzer/email.rb +134 -0
- data/lib/howitzer/exceptions.rb +18 -0
- data/lib/howitzer/helpers.rb +34 -23
- data/lib/howitzer/init.rb +1 -4
- data/lib/howitzer/mailgun/client.rb +48 -0
- data/lib/howitzer/mailgun/connector.rb +34 -0
- data/lib/howitzer/mailgun/response.rb +28 -0
- data/lib/howitzer/utils.rb +2 -2
- data/lib/howitzer/utils/data_generator/data_storage.rb +15 -2
- data/lib/howitzer/utils/data_generator/gen.rb +14 -10
- data/lib/howitzer/utils/locator_store.rb +14 -7
- data/lib/howitzer/utils/log.rb +2 -0
- data/lib/howitzer/utils/page_validator.rb +74 -27
- data/lib/howitzer/version.rb +1 -1
- data/lib/howitzer/web_page.rb +83 -32
- data/spec/config/default.yml +10 -12
- data/spec/spec_helper.rb +12 -0
- data/spec/support/mailgun_unit_client.rb +60 -0
- data/spec/unit/generators/generators_spec.rb +7 -7
- data/spec/unit/lib/capybara/dsl_ex_spec.rb +60 -0
- data/spec/unit/lib/{capybara_settings_spec.rb → capybara/settings_spec.rb} +16 -10
- data/spec/unit/lib/email_spec.rb +129 -0
- data/spec/unit/lib/helpers_spec.rb +160 -34
- data/spec/unit/lib/init_spec.rb +1 -12
- data/spec/unit/lib/mailgun/client_spec.rb +36 -0
- data/spec/unit/lib/mailgun/connector_spec.rb +70 -0
- data/spec/unit/lib/mailgun/response_spec.rb +29 -0
- data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +23 -5
- data/spec/unit/lib/utils/data_generator/gen_spec.rb +2 -63
- data/spec/unit/lib/utils/locator_store_spec.rb +41 -6
- data/spec/unit/lib/utils/log_spec.rb +1 -1
- data/spec/unit/lib/utils/page_validator_spec.rb +149 -25
- data/spec/unit/lib/web_page_spec.rb +127 -53
- metadata +102 -142
- data/lib/howitzer/utils/capybara_patched.rb +0 -23
- data/lib/howitzer/utils/capybara_settings.rb +0 -247
- data/lib/howitzer/utils/email/email.rb +0 -85
- data/lib/howitzer/utils/email/mail_client.rb +0 -132
- data/lib/howitzer/utils/email/mailgun.rb +0 -175
- data/lib/howitzer/utils/email/mailgun_helper.rb +0 -61
- data/spec/unit/bin/howitzer_spec.rb +0 -175
- data/spec/unit/lib/utils/email/email_spec.rb +0 -75
- data/spec/unit/lib/utils/email/mail_client_spec.rb +0 -115
- data/spec/unit/lib/utils/email/mailgun_helper_spec.rb +0 -95
@@ -0,0 +1,14 @@
|
|
1
|
+
Feature: Howitzer CLI Version
|
2
|
+
|
3
|
+
Scenario Outline: Run with version global option
|
4
|
+
When I run `howitzer <option>`
|
5
|
+
Then the output should contain exactly:
|
6
|
+
"""
|
7
|
+
howitzer version <HOWITZER_VERSION>
|
8
|
+
|
9
|
+
"""
|
10
|
+
And the exit status should be 0
|
11
|
+
Examples:
|
12
|
+
| option |
|
13
|
+
| --version |
|
14
|
+
| -v |
|
@@ -0,0 +1 @@
|
|
1
|
+
# For custom stem definitions
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'aruba/cucumber'
|
@@ -19,7 +19,7 @@
|
|
19
19
|
# TEST ENVIRONMENTS SETTINGS #
|
20
20
|
###########################################################
|
21
21
|
|
22
|
-
# Specify one of the following drivers: selenium, selenium_dev, webkit, poltergeist, sauce, testingbot
|
22
|
+
# Specify one of the following drivers: selenium, selenium_dev, webkit, poltergeist, phantomjs, sauce, testingbot
|
23
23
|
driver: poltergeist
|
24
24
|
|
25
25
|
# -Selenium-
|
@@ -74,20 +74,10 @@
|
|
74
74
|
rawler_html_log: rawler_log.html # not implemented yet
|
75
75
|
|
76
76
|
###########################################################
|
77
|
-
#
|
77
|
+
# MAILGUN SETTINGS #
|
78
78
|
###########################################################
|
79
|
-
|
80
|
-
|
81
|
-
mail_smtp_domain: demo.com
|
82
|
-
mail_smtp_user_name: test_user
|
83
|
-
mail_smtp_user_pass: mypass
|
84
|
-
|
85
|
-
mail_pop3_server: pop.demo.com
|
86
|
-
mail_pop3_port: 995
|
87
|
-
mail_pop3_timeout: 120
|
88
|
-
mail_pop3_domain: ${mail_smtp_domain}
|
89
|
-
mail_pop3_user_name: test_user
|
90
|
-
mail_pop3_user_pass: mypass
|
79
|
+
mailgun_key: mailgun_account_private_key
|
80
|
+
mailgun_domain: mailgun_domain_with_stored_method
|
91
81
|
|
92
82
|
############################################################
|
93
83
|
# TIMEOUTS #
|
@@ -1,11 +1,10 @@
|
|
1
1
|
<%
|
2
2
|
rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
|
3
3
|
rerun_opts = rerun.to_s.strip.empty? ? "--format progress features" : "--format pretty #{rerun}"
|
4
|
-
std_opts = "--verbose --expand --format html --out=./log/log.html --format junit --out=./log features --tags ~@wip --tags ~@bug"
|
4
|
+
std_opts = "--verbose --expand --format html --out=./log/log.html --format junit --out=./log --format pretty features --tags ~@wip --tags ~@bug"
|
5
5
|
%>
|
6
6
|
default: -r features <%= std_opts %> --tags ~@demo features
|
7
7
|
wip: -r features --tags @wip --wip features
|
8
8
|
demo: -r features <%= std_opts %> --tags @demo features
|
9
9
|
bug: -r features --tags @bug --wip features
|
10
|
-
none: --format pretty
|
11
10
|
rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
|
@@ -2,7 +2,7 @@ require 'cucumber'
|
|
2
2
|
require 'capybara/cucumber'
|
3
3
|
require_relative '../../boot'
|
4
4
|
|
5
|
-
World(
|
5
|
+
World(Capybara::Settings)
|
6
6
|
World(DataGenerator)
|
7
7
|
|
8
8
|
log.settings_as_formatted_text
|
@@ -10,7 +10,7 @@ DataStorage.store('sauce', :start_time, Time.now.utc)
|
|
10
10
|
DataStorage.store('sauce', :status, true)
|
11
11
|
|
12
12
|
if sauce_driver?
|
13
|
-
Capybara.drivers[:sauce][].options[:desired_capabilities][:name] =
|
13
|
+
Capybara.drivers[:sauce][].options[:desired_capabilities][:name] = Capybara::Settings.suite_name
|
14
14
|
end
|
15
15
|
|
16
16
|
Before do |scenario|
|
@@ -20,19 +20,20 @@ Before do |scenario|
|
|
20
20
|
end
|
21
21
|
|
22
22
|
After do |scenario|
|
23
|
-
Gen.delete_all_mailboxes
|
24
23
|
if sauce_driver?
|
25
24
|
DataStorage.store('sauce', :status, false) if scenario.failed?
|
26
25
|
session_end = duration(Time.now.utc - DataStorage.extract('sauce', :start_time))
|
27
26
|
log.info "SAUCE VIDEO #@session_start - #{session_end} URL: #{sauce_resource_path('video.flv')}"
|
27
|
+
elsif ie_browser?
|
28
|
+
log.info 'IE reset session'
|
29
|
+
page.execute_script("void(document.execCommand('ClearAuthenticationCache', false));")
|
28
30
|
end
|
29
|
-
DataStorage.
|
31
|
+
DataStorage.clear_all_ns
|
30
32
|
end
|
31
33
|
|
32
34
|
at_exit do
|
33
35
|
if sauce_driver?
|
34
|
-
log.info "SAUCE SERVER LOG URL: #{
|
35
|
-
|
36
|
+
log.info "SAUCE SERVER LOG URL: #{Capybara::Settings.sauce_resource_path('selenium-server.log')}"
|
37
|
+
Capybara::Settings.update_sauce_job_status(passed: DataStorage.extract('sauce', :status))
|
36
38
|
end
|
37
|
-
Gen.delete_all_mailboxes
|
38
39
|
end
|
@@ -2,7 +2,7 @@ require_relative 'example_menu'
|
|
2
2
|
|
3
3
|
class ExamplePage < WebPage
|
4
4
|
URL = '/'
|
5
|
-
validates :url, pattern:
|
5
|
+
validates :url, pattern: /\A(?:.*?:\/\/)?[^\/]*\/?\z/
|
6
6
|
|
7
7
|
add_field_locator :search_input, 'lst-ib'
|
8
8
|
add_button_locator :search_btn, 'btnK'
|
@@ -12,4 +12,4 @@ class ExamplePage < WebPage
|
|
12
12
|
def fill_keyword(data)
|
13
13
|
fill_in field_locator(:search_input), data
|
14
14
|
end
|
15
|
-
end
|
15
|
+
end
|
@@ -9,7 +9,7 @@ TEST_TYPES = [:all, :health, :bvt, :p1]
|
|
9
9
|
TEST_AREAS = []
|
10
10
|
|
11
11
|
namespace :rspec do
|
12
|
-
std_opts = "--format html --out=./#{settings.log_dir}/#{settings.html_log}"
|
12
|
+
std_opts = "--format html --out=./#{settings.log_dir}/#{settings.html_log} --format documentation --color"
|
13
13
|
TEST_TYPES.each do |type|
|
14
14
|
RakeTask.new(type) do |s|
|
15
15
|
s.send :desc, "Run all #{"'#{s.name}' " unless type == :all}tests"
|
@@ -8,7 +8,7 @@ RSpec.configure do |config|
|
|
8
8
|
DataStorage.store('sauce', :start_time, Time.now.utc)
|
9
9
|
DataStorage.store('sauce', :status, true)
|
10
10
|
|
11
|
-
config.include
|
11
|
+
config.include Capybara::Settings
|
12
12
|
config.include Capybara::RSpecMatchers
|
13
13
|
config.include DataGenerator
|
14
14
|
|
@@ -31,18 +31,20 @@ RSpec.configure do |config|
|
|
31
31
|
end
|
32
32
|
|
33
33
|
config.after(:each) do
|
34
|
-
|
35
|
-
DataStorage.clear_ns("user")
|
34
|
+
DataStorage.clear_all_ns
|
36
35
|
if sauce_driver?
|
37
36
|
session_end = duration(Time.now.utc - DataStorage.extract('sauce', :start_time))
|
38
37
|
log.info "SAUCE VIDEO #@session_start - #{session_end} URL: #{sauce_resource_path('video.flv')}"
|
38
|
+
elsif ie_browser?
|
39
|
+
log.info 'IE reset session'
|
40
|
+
page.execute_script("void(document.execCommand('ClearAuthenticationCache', false));")
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
42
44
|
config.after(:suite) do
|
43
45
|
if sauce_driver?
|
44
46
|
report_failures_count = config.reporter.instance_variable_get(:@failure_count)
|
45
|
-
DataStorage.store('sauce', :status, report_failures_count.zero?)
|
47
|
+
DataStorage.store('sauce', :status, report_failures_count.zero?)
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
@@ -51,6 +53,5 @@ RSpec.configure do |config|
|
|
51
53
|
log.info "SAUCE SERVER LOG URL: #{CapybaraSettings.sauce_resource_path('selenium-server.log')}"
|
52
54
|
CapybaraSettings.update_sauce_job_status(passed: DataStorage.extract('sauce', :status))
|
53
55
|
end
|
54
|
-
Gen.delete_all_mailboxes
|
55
56
|
end
|
56
57
|
end
|
data/howitzer.gemspec
CHANGED
@@ -4,9 +4,9 @@ require File.expand_path('../lib/howitzer/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Roman Parashchenko, Konstantin Lynda, Nikolay Zozulyak"]
|
6
6
|
gem.email = ["strongqa@gmail.com"]
|
7
|
-
gem.description = %q{
|
8
|
-
gem.summary = %q{
|
9
|
-
gem.homepage = "https://github.com/
|
7
|
+
gem.description = %q{Howitzer allows to generate a test project in 5 minutes. It uses the best practices and design patterns. It has out-of-the-box configurations for parallel cross-browser testing in the Cloud.}
|
8
|
+
gem.summary = %q{Ruby based framework for acceptance testing}
|
9
|
+
gem.homepage = "https://github.com/strongqa/howitzer"
|
10
10
|
|
11
11
|
gem.bindir = 'bin'
|
12
12
|
gem.files = `git ls-files`.split($\)
|
@@ -17,7 +17,9 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.version = Howitzer::VERSION
|
18
18
|
gem.required_ruby_version = '>= 1.9.3'
|
19
19
|
|
20
|
+
gem.add_runtime_dependency 'nokogiri', '~> 1.6.2.rc2' if gem.platform.to_s =~ /mswin|mingw/
|
20
21
|
gem.add_runtime_dependency 'rake'
|
22
|
+
gem.add_runtime_dependency 'gli'
|
21
23
|
gem.add_runtime_dependency 'i18n'
|
22
24
|
gem.add_runtime_dependency 'syntax'
|
23
25
|
gem.add_runtime_dependency 'cucumber'
|
@@ -25,19 +27,17 @@ Gem::Specification.new do |gem|
|
|
25
27
|
gem.add_runtime_dependency 'sexy_settings'
|
26
28
|
gem.add_runtime_dependency 'repeater'
|
27
29
|
gem.add_runtime_dependency 'launchy'
|
28
|
-
gem.add_runtime_dependency 'log4r'
|
29
|
-
gem.add_runtime_dependency 'mail'
|
30
|
+
gem.add_runtime_dependency 'log4r', '1.1.10'
|
30
31
|
gem.add_runtime_dependency 'rest-client'
|
31
32
|
gem.add_runtime_dependency 'poltergeist'
|
32
33
|
gem.add_runtime_dependency 'rawler'
|
33
34
|
gem.add_runtime_dependency 'capybara'
|
34
35
|
gem.add_runtime_dependency 'selenium-webdriver'
|
35
|
-
gem.add_runtime_dependency '
|
36
|
+
gem.add_runtime_dependency 'activesupport', '~>4.0'
|
36
37
|
gem.add_runtime_dependency 'testingbot'
|
37
38
|
|
38
|
-
gem.add_development_dependency(
|
39
|
+
gem.add_development_dependency('aruba')
|
39
40
|
gem.add_development_dependency("fuubar", [">= 0.0.1"])
|
40
|
-
gem.add_development_dependency("rake")
|
41
41
|
gem.add_development_dependency("ffaker")
|
42
42
|
|
43
43
|
end
|
data/lib/howitzer.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require "howitzer/version"
|
2
2
|
require "howitzer/settings"
|
3
|
+
require 'howitzer/capybara/settings'
|
3
4
|
require 'howitzer/utils'
|
4
5
|
require 'howitzer/init'
|
5
6
|
require 'howitzer/helpers'
|
6
|
-
require 'howitzer/
|
7
|
+
require 'howitzer/email'
|
8
|
+
require 'howitzer/web_page'
|
9
|
+
require 'howitzer/blank_page'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'capybara'
|
2
|
+
module Howitzer
|
3
|
+
module Capybara
|
4
|
+
module DslEx
|
5
|
+
include ::Capybara::DSL
|
6
|
+
|
7
|
+
# It flattens arguments of all DSL methods to support locator store DSL
|
8
|
+
::Capybara::Session::DSL_METHODS.each do |method|
|
9
|
+
define_method method do |*args, &block|
|
10
|
+
super(*args.map{|el| args.first == el && el.respond_to?(:flatten) ? el.flatten : el}.flatten, &block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,267 @@
|
|
1
|
+
##
|
2
|
+
#
|
3
|
+
# Predefined Capybara settings and capybara drivers
|
4
|
+
#
|
5
|
+
require 'selenium-webdriver'
|
6
|
+
require 'capybara'
|
7
|
+
require 'howitzer/utils/log'
|
8
|
+
module Capybara
|
9
|
+
module Settings
|
10
|
+
extend self
|
11
|
+
|
12
|
+
##
|
13
|
+
#
|
14
|
+
# Predefined settings of Firefox browser
|
15
|
+
#
|
16
|
+
# *Returns:*
|
17
|
+
# * +Hash+ - Settings that can be changed
|
18
|
+
#
|
19
|
+
|
20
|
+
|
21
|
+
def self.base_ff_profile_settings
|
22
|
+
profile = ::Selenium::WebDriver::Firefox::Profile.new
|
23
|
+
profile["network.http.phishy-userpass-length"] = 255
|
24
|
+
profile["browser.safebrowsing.malware.enabled"] = false
|
25
|
+
profile["network.automatic-ntlm-auth.allow-non-fqdn"] = true
|
26
|
+
profile["network.ntlm.send-lm-response"] = true
|
27
|
+
profile["network.automatic-ntlm-auth.trusted-uris"] = settings.app_host
|
28
|
+
profile
|
29
|
+
end
|
30
|
+
|
31
|
+
class << self
|
32
|
+
|
33
|
+
##
|
34
|
+
#
|
35
|
+
#Defines driver based on specified test environment settings
|
36
|
+
#
|
37
|
+
|
38
|
+
def define_driver
|
39
|
+
case settings.driver.to_sym
|
40
|
+
when :selenium
|
41
|
+
define_selenium_driver
|
42
|
+
when :selenium_dev
|
43
|
+
define_selenium_dev_driver
|
44
|
+
when :webkit
|
45
|
+
define_webkit_driver
|
46
|
+
when :poltergeist
|
47
|
+
define_poltergeist_driver
|
48
|
+
when :phantomjs
|
49
|
+
define_phantomjs_driver
|
50
|
+
when :sauce
|
51
|
+
define_sauce_driver
|
52
|
+
when :testingbot
|
53
|
+
define_testingbot_driver
|
54
|
+
else
|
55
|
+
log.error "Unknown '#{settings.driver}' driver. Check your settings, it should be one of [selenium, selenium_dev, webkit, poltergeist, phantomjs, sauce, testingbot]"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def define_selenium_driver
|
62
|
+
Capybara.register_driver :selenium do |app|
|
63
|
+
params = {browser: settings.sel_browser.to_sym}
|
64
|
+
params[:profile] = base_ff_profile_settings if ff_browser?
|
65
|
+
Capybara::Selenium::Driver.new app, params
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def define_selenium_dev_driver
|
70
|
+
Capybara.register_driver :selenium_dev do |app|
|
71
|
+
profile = base_ff_profile_settings
|
72
|
+
vendor_dir = settings.custom_vendor_dir || File.join(File.dirname(__FILE__), '..', 'vendor')
|
73
|
+
log.error "Vendor directory was not found('#{vendor_dir}')." unless Dir.exist?(vendor_dir)
|
74
|
+
%w(firebug*.xpi firepath*.xpi).each do |file_name|
|
75
|
+
full_path_pattern = File.join(File.expand_path(vendor_dir), file_name)
|
76
|
+
if (full_path = Dir[full_path_pattern].first)
|
77
|
+
profile.add_extension full_path
|
78
|
+
else
|
79
|
+
log.error "Extension was not found by '#{full_path_pattern}' pattern!"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
profile['extensions.firebug.currentVersion'] = 'Last' # avoid 'first run' tab
|
83
|
+
profile["extensions.firebug.previousPlacement"] = 1
|
84
|
+
profile["extensions.firebug.onByDefault"] = true
|
85
|
+
profile["extensions.firebug.defaultPanelName"] = "firepath"
|
86
|
+
profile["extensions.firebug.script.enableSites"] = true
|
87
|
+
profile["extensions.firebug.net.enableSites"] = true
|
88
|
+
profile["extensions.firebug.console.enableSites"] = true
|
89
|
+
|
90
|
+
Capybara::Selenium::Driver.new app, browser: :firefox, profile: profile
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def define_webkit_driver
|
95
|
+
require 'capybara-webkit'
|
96
|
+
end
|
97
|
+
|
98
|
+
def define_poltergeist_driver
|
99
|
+
require 'capybara/poltergeist'
|
100
|
+
Capybara.register_driver :poltergeist do |app|
|
101
|
+
Capybara::Poltergeist::Driver.new(
|
102
|
+
app, {
|
103
|
+
js_errors: !settings.pjs_ignore_js_errors,
|
104
|
+
phantomjs_options: ["--ignore-ssl-errors=#{settings.pjs_ignore_ssl_errors ? 'yes' : 'no'}" ]
|
105
|
+
}
|
106
|
+
)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def define_phantomjs_driver
|
111
|
+
Capybara.register_driver :phantomjs do |app|
|
112
|
+
Capybara::Selenium::Driver.new(
|
113
|
+
app, browser: :phantomjs,
|
114
|
+
desired_capabilities: {
|
115
|
+
javascript_enabled: !settings.pjs_ignore_js_errors
|
116
|
+
},
|
117
|
+
args: ["--ignore-ssl-errors=#{settings.pjs_ignore_ssl_errors ? 'yes' : 'no'}" ]
|
118
|
+
)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def define_sauce_driver
|
123
|
+
task_name = ENV['RAKE_TASK'].to_s.sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
|
124
|
+
caps_opts = {
|
125
|
+
platform: settings.sl_platform,
|
126
|
+
browser_name: settings.sl_browser_name,
|
127
|
+
name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.sl_browser_name.upcase}",
|
128
|
+
"max-duration" => settings.sl_max_duration,
|
129
|
+
'idle-timeout' => settings.sl_idle_timeout,
|
130
|
+
'selenium-version' => settings.sl_selenium_version,
|
131
|
+
'record-screenshots' => settings.sl_record_screenshot,
|
132
|
+
'video-upload-on-pass' => settings.sl_video_upload_on_pass
|
133
|
+
}
|
134
|
+
|
135
|
+
unless (settings.sl_browser_version.to_s || "").empty?
|
136
|
+
caps_opts['version'] = settings.sl_browser_version.to_s
|
137
|
+
end
|
138
|
+
|
139
|
+
options = {
|
140
|
+
url: settings.sl_url,
|
141
|
+
desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.new(caps_opts),
|
142
|
+
http_client: ::Selenium::WebDriver::Remote::Http::Default.new.tap{|c| c.timeout = settings.timeout_medium},
|
143
|
+
browser: :remote
|
144
|
+
}
|
145
|
+
|
146
|
+
Capybara.register_driver :sauce do |app|
|
147
|
+
driver = Capybara::Selenium::Driver.new(app, options)
|
148
|
+
driver.browser.file_detector = lambda do |args|
|
149
|
+
str = args.first.to_s
|
150
|
+
str if File.exist?(str)
|
151
|
+
end
|
152
|
+
driver
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def define_testingbot_driver
|
157
|
+
require 'testingbot'
|
158
|
+
task_name = ENV['RAKE_TASK'].to_s.sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
|
159
|
+
caps_opts = {
|
160
|
+
platform: settings.tb_platform,
|
161
|
+
browser_name: settings.tb_browser_name,
|
162
|
+
name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.tb_browser_name.upcase}",
|
163
|
+
maxduration: settings.tb_max_duration.to_i,
|
164
|
+
idletimeout: settings.tb_idle_timeout.to_i,
|
165
|
+
'selenium-version' => settings.tb_selenium_version,
|
166
|
+
screenshot: settings.tb_record_screenshot,
|
167
|
+
'avoid-proxy' => settings.tb_avoid_proxy
|
168
|
+
}
|
169
|
+
|
170
|
+
unless (settings.tb_browser_version.to_s || "").empty?
|
171
|
+
caps_opts['version'] = settings.tb_browser_version.to_s
|
172
|
+
end
|
173
|
+
options = {
|
174
|
+
url: settings.tb_url,
|
175
|
+
desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.new(caps_opts),
|
176
|
+
http_client: ::Selenium::WebDriver::Remote::Http::Default.new.tap{|c| c.timeout = settings.timeout_medium},
|
177
|
+
browser: :remote
|
178
|
+
}
|
179
|
+
Capybara.register_driver :testingbot do |app|
|
180
|
+
driver = Capybara::Selenium::Driver.new(app, options)
|
181
|
+
driver.browser.file_detector = lambda do |args|
|
182
|
+
str = args.first.to_s
|
183
|
+
str if File.exist?(str)
|
184
|
+
end
|
185
|
+
driver
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
##
|
191
|
+
#
|
192
|
+
# Returns url of current Sauce Labs job
|
193
|
+
#
|
194
|
+
# *Parameters:*
|
195
|
+
# * +name+ - Your account name
|
196
|
+
#
|
197
|
+
# *Returns:*
|
198
|
+
# * +string+ - URL address of last running Sauce Labs job
|
199
|
+
#
|
200
|
+
|
201
|
+
def sauce_resource_path(name)
|
202
|
+
host = "https://#{settings.sl_user}:#{settings.sl_api_key}@saucelabs.com"
|
203
|
+
path = "/rest/#{settings.sl_user}/jobs/#{session_id}/results/#{name}"
|
204
|
+
"#{host}#{path}"
|
205
|
+
end
|
206
|
+
|
207
|
+
##
|
208
|
+
#
|
209
|
+
# Sends http request to change current Sauce Labs job status - pass/fail
|
210
|
+
#
|
211
|
+
# *Parameters:*
|
212
|
+
# * +json_data+ - test status as hash (for details see Saucelab documentation)
|
213
|
+
#
|
214
|
+
|
215
|
+
|
216
|
+
def update_sauce_job_status(json_data = {})
|
217
|
+
host = "http://#{settings.sl_user}:#{settings.sl_api_key}@saucelabs.com"
|
218
|
+
path = "/rest/v1/#{settings.sl_user}/jobs/#{session_id}"
|
219
|
+
url = "#{host}#{path}"
|
220
|
+
::RestClient.put url, json_data.to_json, content_type: :json, accept: :json
|
221
|
+
end
|
222
|
+
|
223
|
+
##
|
224
|
+
#
|
225
|
+
# Returns custom name for Sauce Labs job
|
226
|
+
#
|
227
|
+
# *Returns:*
|
228
|
+
# * +string+ - Return name of current Sauce Labs job
|
229
|
+
#
|
230
|
+
|
231
|
+
def suite_name
|
232
|
+
res = if ENV['RAKE_TASK']
|
233
|
+
res = ENV['RAKE_TASK'].sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
|
234
|
+
res.empty? ? 'ALL' : res
|
235
|
+
else
|
236
|
+
'CUSTOM'
|
237
|
+
end
|
238
|
+
"#{res} #{settings.sl_browser_name.upcase}"
|
239
|
+
end
|
240
|
+
|
241
|
+
##
|
242
|
+
#
|
243
|
+
# Returns current session id
|
244
|
+
#
|
245
|
+
|
246
|
+
def session_id
|
247
|
+
Capybara.current_session.driver.browser.instance_variable_get(:@bridge).session_id
|
248
|
+
end
|
249
|
+
|
250
|
+
Capybara.run_server = false
|
251
|
+
Capybara.app_host = ''
|
252
|
+
Capybara.default_wait_time = settings.timeout_small
|
253
|
+
Capybara.ignore_hidden_elements = true
|
254
|
+
Capybara.visible_text_only = true
|
255
|
+
Capybara.match = :one
|
256
|
+
Capybara.exact_options = true
|
257
|
+
Capybara.default_driver = settings.driver.to_sym
|
258
|
+
Capybara.javascript_driver = settings.driver.to_sym
|
259
|
+
|
260
|
+
define_driver
|
261
|
+
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
# @deprecated
|
266
|
+
#
|
267
|
+
CapybaraSettings = Capybara::Settings
|