howitzer 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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