howitzer 1.0.2 → 1.1.0

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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +3 -1
  4. data/.ruby-gemset +1 -0
  5. data/.travis.yml +4 -1
  6. data/.yardopts +5 -0
  7. data/CHANGELOG.md +23 -1
  8. data/CONTRIBUTING.md +14 -0
  9. data/GETTING_STARTED.md +283 -183
  10. data/Gemfile +3 -2
  11. data/LICENSE +1 -1
  12. data/README.md +93 -39
  13. data/Rakefile +4 -0
  14. data/bin/howitzer +34 -5
  15. data/features/cli_help.feature +3 -2
  16. data/features/cli_new.feature +1 -1
  17. data/features/cli_unknown.feature +1 -1
  18. data/features/cli_update.feature +84 -0
  19. data/features/step_definitions/common_steps.rb +9 -1
  20. data/generators/base_generator.rb +30 -15
  21. data/generators/config/config_generator.rb +7 -7
  22. data/generators/config/templates/custom.yml +1 -0
  23. data/generators/config/templates/default.yml +35 -5
  24. data/generators/cucumber/templates/env.rb +2 -2
  25. data/generators/cucumber/templates/transformers.rb +3 -1
  26. data/generators/root/templates/Gemfile +5 -3
  27. data/generators/root/templates/Rakefile +2 -0
  28. data/generators/rspec/templates/example_spec.rb +3 -3
  29. data/generators/rspec/templates/spec_helper.rb +6 -7
  30. data/howitzer.gemspec +15 -15
  31. data/lib/howitzer/capybara/settings.rb +125 -49
  32. data/lib/howitzer/helpers.rb +161 -94
  33. data/lib/howitzer/mailgun/client.rb +1 -1
  34. data/lib/howitzer/tasks/framework.rake +3 -0
  35. data/lib/howitzer/utils.rb +1 -1
  36. data/lib/howitzer/utils/locator_store.rb +1 -1
  37. data/lib/howitzer/utils/log.rb +1 -1
  38. data/lib/howitzer/utils/page_validator.rb +1 -1
  39. data/lib/howitzer/version.rb +1 -1
  40. data/lib/howitzer/web_page.rb +11 -11
  41. data/spec/spec_helper.rb +25 -22
  42. data/spec/support/generator_helper.rb +8 -1
  43. data/spec/unit/generators/base_generator_spec.rb +242 -0
  44. data/spec/unit/generators/config_generator_spec.rb +34 -0
  45. data/spec/unit/generators/cucumber_generator_spec.rb +45 -0
  46. data/spec/unit/generators/emails_generator_spec.rb +31 -0
  47. data/spec/unit/generators/pages_generator_spec.rb +33 -0
  48. data/spec/unit/generators/root_generator_spec.rb +35 -0
  49. data/spec/unit/generators/rspec_generator_spec.rb +36 -0
  50. data/spec/unit/generators/tasks_generator_spec.rb +31 -0
  51. data/spec/unit/lib/capybara/dsl_ex_spec.rb +11 -11
  52. data/spec/unit/lib/capybara/settings_spec.rb +336 -58
  53. data/spec/unit/lib/email_spec.rb +17 -17
  54. data/spec/unit/lib/helpers_spec.rb +699 -315
  55. data/spec/unit/lib/mailgun/client_spec.rb +9 -9
  56. data/spec/unit/lib/mailgun/connector_spec.rb +20 -20
  57. data/spec/unit/lib/mailgun/response_spec.rb +9 -9
  58. data/spec/unit/lib/settings_spec.rb +6 -6
  59. data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +31 -31
  60. data/spec/unit/lib/utils/data_generator/gen_spec.rb +20 -20
  61. data/spec/unit/lib/utils/locator_store_spec.rb +39 -39
  62. data/spec/unit/lib/utils/log_spec.rb +42 -42
  63. data/spec/unit/lib/utils/page_validator_spec.rb +69 -70
  64. data/spec/unit/lib/web_page_spec.rb +91 -69
  65. data/spec/unit/version_spec.rb +3 -3
  66. metadata +100 -78
  67. data/spec/unit/generators/generators_spec.rb +0 -175
@@ -1,13 +1,13 @@
1
1
  require_relative '../base_generator'
2
2
  module Howitzer
3
3
  class ConfigGenerator < BaseGenerator
4
- def manifest
5
- { files:
6
- [
7
- { source: 'custom.yml', destination: 'config/custom.yml'},
8
- { source: 'default.yml', destination: 'config/default.yml'}
9
- ]
10
- }
4
+ def manifest
5
+ { files:
6
+ [
7
+ { source: 'custom.yml', destination: 'config/custom.yml'},
8
+ { source: 'default.yml', destination: 'config/default.yml'}
9
+ ]
10
+ }
11
11
  end
12
12
 
13
13
  protected
@@ -1,4 +1,5 @@
1
1
  app_host: localhost:3000
2
+ maximized_window: true
2
3
  driver: selenium
3
4
  sel_browser: chrome
4
5
  debug_mode: true
@@ -19,13 +19,19 @@
19
19
  # TEST ENVIRONMENTS SETTINGS #
20
20
  ###########################################################
21
21
 
22
- # Specify one of the following drivers: selenium, selenium_dev, webkit, poltergeist, phantomjs, sauce, testingbot
23
- driver: poltergeist
22
+ # Specify maximized browser window size
23
+ maximized_window: false
24
+
25
+ # Specify one of the following drivers: selenium, selenium_dev, selenium_grid, webkit, poltergeist, phantomjs, sauce, testingbot, browserstack
26
+ driver: phantomjs
24
27
 
25
28
  # -Selenium-
26
- # specify one of next browsers: iexplore (ie), firefox (ff), chrome, opera
29
+ # specify one of next browsers: iexplore (ie), firefox (ff), chrome, opera, safari
27
30
  sel_browser: ff
28
31
 
32
+ # -Selenium Grid-
33
+ sel_hub_url: "http://example.com:4444/wd/hub"
34
+
29
35
  # -PhantomJS-
30
36
  # specify settings for poltergeist
31
37
  pjs_ignore_js_errors: false
@@ -53,6 +59,31 @@
53
59
  tb_idle_timeout: '180'
54
60
  tb_record_screenshot: false
55
61
 
62
+ # -BrowserStack
63
+ bs_user_name: bs_user
64
+ bs_password: bs_password
65
+ bs_url: "http://${bs_user_name}:${bs_password}@hub.browserstack.com/wd/hub"
66
+ bs_os_name: 'Windows'
67
+ bs_os_version: '8'
68
+ bs_browser_name: 'Firefox'
69
+ bs_browser_version: '16.0'
70
+ bs_resolution: '1024x768'
71
+ bs_max_duration: '1800'
72
+ bs_idle_timeout: '180'
73
+
74
+ # Run tests on mobile browsers
75
+ bs_mobile: false
76
+ bs_m_browser: 'iPhone'
77
+ bs_m_platform: 'MAC'
78
+ bs_m_device: 'iPhone 5'
79
+
80
+ bs_local: 'false'
81
+ bs_local_ID: 'Testing123'
82
+ bs_build: 'v1'
83
+ bs_project: 'Test Project'
84
+ bs_ssl: 'true'
85
+ bs_debug: 'false'
86
+
56
87
  ###########################################################
57
88
  # DATABASE SETTINGS #
58
89
  ###########################################################
@@ -85,5 +116,4 @@
85
116
  timeout_tiny: 1
86
117
  timeout_short: 3
87
118
  timeout_small: 20
88
- timeout_medium: 60
89
-
119
+ timeout_medium: 60
@@ -14,7 +14,7 @@ if sauce_driver?
14
14
  end
15
15
 
16
16
  Before do |scenario|
17
- log.print_feature_name(scenario.feature.title)
17
+ log.print_feature_name(scenario.feature.name)
18
18
  log.print_scenario_name(scenario.name)
19
19
  @session_start = duration(Time.now.utc - DataStorage.extract('sauce', :start_time))
20
20
  end
@@ -36,4 +36,4 @@ at_exit do
36
36
  log.info "SAUCE SERVER LOG URL: #{Capybara::Settings.sauce_resource_path('selenium-server.log')}"
37
37
  Capybara::Settings.update_sauce_job_status(passed: DataStorage.extract('sauce', :status))
38
38
  end
39
- end
39
+ end
@@ -24,5 +24,7 @@ Transform /^table:.*$/ do |table|
24
24
  res
25
25
  end
26
26
  end
27
- Cucumber::Ast::Table.new(raw)
27
+ location = Cucumber::Core::Ast::Location.of_caller
28
+ ast_table = Cucumber::Core::Ast::DataTable.new(raw, location)
29
+ Cucumber::MultilineArgument::DataTable.new(ast_table)
28
30
  end
@@ -1,5 +1,7 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
- gem 'howitzer' #, github: "strongqa/howitzer", branch: "develop"
4
- gem 'debugger'
3
+ # Uncomment it if you are going to use 'webkit' driver. QT library should be installed. See https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit
4
+ #
5
+ # gem 'capybara-webkit'
5
6
 
7
+ gem 'howitzer'
@@ -3,6 +3,8 @@ require 'rake/clean'
3
3
  require 'howitzer/settings'
4
4
  require 'howitzer/utils/log'
5
5
 
6
+ load 'howitzer/tasks/framework.rake'
7
+
6
8
  Dir.chdir(File.join(File.dirname(__FILE__), '.'))
7
9
 
8
10
  if settings.required_clean_logs
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- feature "Some feature" do
4
- scenario "test scenario" do
5
- expect(true).to be_true
3
+ RSpec.feature 'Some feature' do
4
+ scenario 'test scenario' do
5
+ expect(true).to be_truthy
6
6
  end
7
7
  end
@@ -2,6 +2,8 @@ require 'rspec'
2
2
  require 'capybara/rspec'
3
3
  require_relative '../boot'
4
4
 
5
+ Dir[File.join(File.dirname(__FILE__), 'support', '**', '*.rb')].each{ |f| require f }
6
+
5
7
  RSpec.configure do |config|
6
8
  log.settings_as_formatted_text
7
9
 
@@ -12,21 +14,18 @@ RSpec.configure do |config|
12
14
  config.include Capybara::RSpecMatchers
13
15
  config.include DataGenerator
14
16
 
15
- config.mock_with(:rspec){|c| c.syntax = :expect}
16
- config.expect_with(:rspec) { |c| c.syntax = :expect }
17
-
18
- config.color_enabled = true
19
- config.treat_symbols_as_metadata_keys_with_true_values = true
17
+ config.disable_monkey_patching = true
18
+ config.color = true
20
19
 
21
20
  config.before(:all) do
22
21
  if sauce_driver?
23
- suite_name = "#{(ENV['RAKE_TASK'] || 'CUSTOM').sub("rspec:", '').upcase} #{settings.sl_browser_name.upcase}"
22
+ suite_name = "#{(ENV['RAKE_TASK'] || 'CUSTOM').sub('rspec:', '').upcase} #{settings.sl_browser_name.upcase}"
24
23
  Capybara.drivers[:sauce][].options[:desired_capabilities][:name] = suite_name
25
24
  end
26
25
  end
27
26
 
28
27
  config.before(:each) do
29
- log.print_scenario_name(example.description.empty? ? example.metadata[:full_description] : example.description)
28
+ log.print_scenario_name(RSpec.current_example.description.empty? ? RSpec.current_example.metadata[:full_description] : RSpec.current_example.description)
30
29
  @session_start = duration(Time.now.utc - DataStorage.extract('sauce', :start_time))
31
30
  end
32
31
 
@@ -2,42 +2,42 @@
2
2
  require File.expand_path('../lib/howitzer/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Roman Parashchenko, Konstantin Lynda, Nikolay Zozulyak"]
6
- gem.email = ["strongqa@gmail.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.}
5
+ gem.author = 'Roman Parashchenko'
6
+ gem.email = 'howitzer@strongqa.com'
7
+ gem.description = %q{Howitzer uses the best practices and design patterns allowing to generate a test project in less than 5 minutes. It has out-of-the-box configurations for parallel cross-browser testing in the Cloud.}
8
8
  gem.summary = %q{Ruby based framework for acceptance testing}
9
- gem.homepage = "https://github.com/strongqa/howitzer"
9
+ gem.homepage = 'http://strongqa.github.io/howitzer/'
10
+ gem.license = 'MIT'
10
11
 
11
12
  gem.bindir = 'bin'
12
13
  gem.files = `git ls-files`.split($\)
13
14
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
15
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
- gem.name = "howitzer"
16
- gem.require_paths = ["lib"]
16
+ gem.name = 'howitzer'
17
+ gem.require_paths = ['lib']
17
18
  gem.version = Howitzer::VERSION
18
19
  gem.required_ruby_version = '>= 1.9.3'
19
20
 
20
- gem.add_runtime_dependency 'nokogiri', '~> 1.6.2.rc2' if gem.platform.to_s =~ /mswin|mingw/
21
+ gem.add_runtime_dependency 'nokogiri', '~> 1.6' if gem.platform.to_s =~ /mswin|mingw/
21
22
  gem.add_runtime_dependency 'rake'
22
23
  gem.add_runtime_dependency 'gli'
23
- gem.add_runtime_dependency 'i18n'
24
24
  gem.add_runtime_dependency 'syntax'
25
- gem.add_runtime_dependency 'cucumber'
26
- gem.add_runtime_dependency 'rspec', '~> 2.0'
25
+ gem.add_runtime_dependency 'cucumber', '~>2.0'
26
+ gem.add_runtime_dependency 'rspec', '~>3.2'
27
27
  gem.add_runtime_dependency 'sexy_settings'
28
28
  gem.add_runtime_dependency 'repeater'
29
29
  gem.add_runtime_dependency 'launchy'
30
- gem.add_runtime_dependency 'log4r', '1.1.10'
30
+ gem.add_runtime_dependency 'log4r', '~>1.1.10'
31
31
  gem.add_runtime_dependency 'rest-client'
32
32
  gem.add_runtime_dependency 'poltergeist'
33
33
  gem.add_runtime_dependency 'rawler'
34
34
  gem.add_runtime_dependency 'capybara'
35
35
  gem.add_runtime_dependency 'selenium-webdriver'
36
- gem.add_runtime_dependency 'activesupport', '~>4.0'
36
+ gem.add_runtime_dependency 'activesupport', '~>4.2'
37
37
  gem.add_runtime_dependency 'testingbot'
38
38
 
39
39
  gem.add_development_dependency('aruba')
40
- gem.add_development_dependency("fuubar", [">= 0.0.1"])
41
- gem.add_development_dependency("ffaker")
42
-
40
+ gem.add_development_dependency('fuubar')
41
+ gem.add_development_dependency('ffaker')
42
+ gem.add_development_dependency('yard')
43
43
  end
@@ -1,10 +1,7 @@
1
- ##
2
- #
3
- # Predefined Capybara settings and capybara drivers
4
- #
5
1
  require 'selenium-webdriver'
6
2
  require 'capybara'
7
3
  require 'howitzer/utils/log'
4
+ require 'howitzer/helpers'
8
5
  module Capybara
9
6
  module Settings
10
7
  extend self
@@ -20,11 +17,11 @@ module Capybara
20
17
 
21
18
  def self.base_ff_profile_settings
22
19
  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
20
+ profile['network.http.phishy-userpass-length'] = 255
21
+ profile['browser.safebrowsing.malware.enabled'] = false
22
+ profile['network.automatic-ntlm-auth.allow-non-fqdn'] = true
23
+ profile['network.ntlm.send-lm-response'] = true
24
+ profile['network.automatic-ntlm-auth.trusted-uris'] = settings.app_host
28
25
  profile
29
26
  end
30
27
 
@@ -36,7 +33,7 @@ module Capybara
36
33
  #
37
34
 
38
35
  def define_driver
39
- case settings.driver.to_sym
36
+ case settings.driver.to_s.to_sym
40
37
  when :selenium
41
38
  define_selenium_driver
42
39
  when :selenium_dev
@@ -51,16 +48,39 @@ module Capybara
51
48
  define_sauce_driver
52
49
  when :testingbot
53
50
  define_testingbot_driver
51
+ when :browserstack
52
+ define_browserstack_driver
53
+ when :selenium_grid
54
+ define_selenium_grid_driver
54
55
  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
+ log.error "Unknown '#{settings.driver}' driver. Check your settings, it should be one of [selenium, selenium_grid, selenium_dev, webkit, poltergeist, phantomjs, sauce, testingbot, browserstack]"
56
57
  end
57
58
  end
58
59
 
59
60
  private
61
+ def define_selenium_grid_driver
62
+ Capybara.register_driver :selenium_grid do |app|
63
+ caps = if ie_browser?
64
+ ::Selenium::WebDriver::Remote::Capabilities.internet_explorer
65
+ elsif ff_browser?
66
+ ::Selenium::WebDriver::Remote::Capabilities.firefox
67
+ elsif chrome_browser?
68
+ ::Selenium::WebDriver::Remote::Capabilities.chrome
69
+ elsif opera_browser?
70
+ ::Selenium::WebDriver::Remote::Capabilities.opera
71
+ elsif safari_browser?
72
+ ::Selenium::WebDriver::Remote::Capabilities.safari
73
+ else
74
+ log.error "Unknown '#{settings.sel_browser}' sel_browser. Check your settings, it should be one of [:ie, :iexplore, :ff, :firefox, :chrome, :opera, safari]"
75
+ end
76
+
77
+ Capybara::Selenium::Driver.new(app, :browser => :remote, :url => settings.sel_hub_url, :desired_capabilities => caps)
78
+ end
79
+ end
60
80
 
61
81
  def define_selenium_driver
62
82
  Capybara.register_driver :selenium do |app|
63
- params = {browser: settings.sel_browser.to_sym}
83
+ params = {browser: settings.sel_browser.to_s.to_sym}
64
84
  params[:profile] = base_ff_profile_settings if ff_browser?
65
85
  Capybara::Selenium::Driver.new app, params
66
86
  end
@@ -80,12 +100,12 @@ module Capybara
80
100
  end
81
101
  end
82
102
  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
103
+ profile['extensions.firebug.previousPlacement'] = 1
104
+ profile['extensions.firebug.onByDefault'] = true
105
+ profile['extensions.firebug.defaultPanelName'] = 'firepath'
106
+ profile['extensions.firebug.script.enableSites'] = true
107
+ profile['extensions.firebug.net.enableSites'] = true
108
+ profile['extensions.firebug.console.enableSites'] = true
89
109
 
90
110
  Capybara::Selenium::Driver.new app, browser: :firefox, profile: profile
91
111
  end
@@ -99,10 +119,10 @@ module Capybara
99
119
  require 'capybara/poltergeist'
100
120
  Capybara.register_driver :poltergeist do |app|
101
121
  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
- }
122
+ app, {
123
+ js_errors: !settings.pjs_ignore_js_errors,
124
+ phantomjs_options: ["--ignore-ssl-errors=#{settings.pjs_ignore_ssl_errors ? 'yes' : 'no'}" ]
125
+ }
106
126
  )
107
127
  end
108
128
  end
@@ -111,36 +131,36 @@ module Capybara
111
131
  Capybara.register_driver :phantomjs do |app|
112
132
  Capybara::Selenium::Driver.new(
113
133
  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'}" ]
134
+ desired_capabilities: {
135
+ javascript_enabled: !settings.pjs_ignore_js_errors
136
+ },
137
+ args: ["--ignore-ssl-errors=#{settings.pjs_ignore_ssl_errors ? 'yes' : 'no'}" ]
118
138
  )
119
139
  end
120
140
  end
121
141
 
122
142
  def define_sauce_driver
123
- task_name = ENV['RAKE_TASK'].to_s.sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
143
+ task_name = rake_task_name
124
144
  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
145
+ platform: settings.sl_platform,
146
+ browser_name: settings.sl_browser_name,
147
+ name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.sl_browser_name.upcase}",
148
+ 'max-duration' => settings.sl_max_duration,
149
+ 'idle-timeout' => settings.sl_idle_timeout,
150
+ 'selenium-version' => settings.sl_selenium_version,
151
+ 'record-screenshots' => settings.sl_record_screenshot,
152
+ 'video-upload-on-pass' => settings.sl_video_upload_on_pass
133
153
  }
134
154
 
135
- unless (settings.sl_browser_version.to_s || "").empty?
155
+ unless (settings.sl_browser_version.to_s || '').empty?
136
156
  caps_opts['version'] = settings.sl_browser_version.to_s
137
157
  end
138
158
 
139
159
  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
160
+ url: settings.sl_url,
161
+ desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.new(caps_opts),
162
+ http_client: ::Selenium::WebDriver::Remote::Http::Default.new.tap{|c| c.timeout = settings.timeout_medium},
163
+ browser: :remote
144
164
  }
145
165
 
146
166
  Capybara.register_driver :sauce do |app|
@@ -155,7 +175,7 @@ module Capybara
155
175
 
156
176
  def define_testingbot_driver
157
177
  require 'testingbot'
158
- task_name = ENV['RAKE_TASK'].to_s.sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
178
+ task_name = rake_task_name
159
179
  caps_opts = {
160
180
  platform: settings.tb_platform,
161
181
  browser_name: settings.tb_browser_name,
@@ -168,7 +188,7 @@ module Capybara
168
188
  }
169
189
 
170
190
  unless (settings.tb_browser_version.to_s || "").empty?
171
- caps_opts['version'] = settings.tb_browser_version.to_s
191
+ caps_opts['version'] = settings.tb_browser_version.to_s
172
192
  end
173
193
  options = {
174
194
  url: settings.tb_url,
@@ -187,6 +207,49 @@ module Capybara
187
207
  end
188
208
  end
189
209
 
210
+ def define_browserstack_driver
211
+ task_name = rake_task_name
212
+ caps_opts = {
213
+ name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.bs_mobile ? settings.bs_m_browser : settings.bs_browser_name.upcase}",
214
+ maxduration: settings.bs_max_duration.to_i,
215
+ idletimeout: settings.bs_idle_timeout.to_i,
216
+ project: settings.bs_project,
217
+ build: settings.bs_build,
218
+ resolution: settings.bs_resolution
219
+ }
220
+
221
+ if settings.bs_local
222
+ caps_opts['browserstack.local'] = settings.bs_local
223
+ caps_opts['browserstack.localIdentifier'] = settings.bs_local_ID
224
+ end
225
+
226
+ if settings.bs_mobile
227
+ caps_opts[:browserName] = settings.bs_m_browser
228
+ caps_opts[:platform] = settings.bs_m_platform
229
+ caps_opts[:device] = settings.bs_m_device
230
+ else
231
+ caps_opts[:os] = settings.bs_os_name
232
+ caps_opts[:os_version] = settings.bs_os_version
233
+ caps_opts[:browser] = settings.bs_browser_name
234
+ caps_opts[:browser_version] = settings.bs_browser_version
235
+ end
236
+
237
+ options = {
238
+ url: settings.bs_url,
239
+ desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.new(caps_opts),
240
+ browser: :remote
241
+ }
242
+ Capybara.register_driver :browserstack do |app|
243
+ driver = Capybara::Selenium::Driver.new(app, options)
244
+ driver.browser.file_detector = lambda do |args|
245
+ str = args.first.to_s
246
+ str if File.exist?(str)
247
+ end
248
+
249
+ driver
250
+ end
251
+ end
252
+
190
253
  ##
191
254
  #
192
255
  # Returns url of current Sauce Labs job
@@ -230,11 +293,11 @@ module Capybara
230
293
 
231
294
  def suite_name
232
295
  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
296
+ res = ENV['RAKE_TASK'].sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
297
+ res.empty? ? 'ALL' : res
298
+ else
299
+ 'CUSTOM'
300
+ end
238
301
  "#{res} #{settings.sl_browser_name.upcase}"
239
302
  end
240
303
 
@@ -247,15 +310,28 @@ module Capybara
247
310
  Capybara.current_session.driver.browser.instance_variable_get(:@bridge).session_id
248
311
  end
249
312
 
313
+ ##
314
+ #
315
+ # Returns custom name for rake task
316
+ #
317
+ # *Returns:*
318
+ # * +string+ - Returns rake task name
319
+ #
320
+
321
+ def rake_task_name
322
+ ENV['RAKE_TASK'].to_s.sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
323
+ end
324
+
250
325
  Capybara.run_server = false
251
326
  Capybara.app_host = ''
327
+ Capybara.asset_host = app_base_url
252
328
  Capybara.default_wait_time = settings.timeout_small
253
329
  Capybara.ignore_hidden_elements = true
254
330
  Capybara.visible_text_only = true
255
331
  Capybara.match = :one
256
332
  Capybara.exact_options = true
257
- Capybara.default_driver = settings.driver.to_sym
258
- Capybara.javascript_driver = settings.driver.to_sym
333
+ Capybara.default_driver = settings.driver.to_s.to_sym
334
+ Capybara.javascript_driver = settings.driver.to_s.to_sym
259
335
 
260
336
  define_driver
261
337