howitzer 1.0.1 → 1.0.2

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 (81) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -1
  3. data/.travis.yml +3 -2
  4. data/CHANGELOG.md +25 -5
  5. data/GETTING_STARTED.md +158 -13
  6. data/README.md +49 -32
  7. data/Rakefile +10 -1
  8. data/bin/howitzer +49 -78
  9. data/features/cli_help.feature +30 -0
  10. data/features/cli_new.feature +263 -0
  11. data/features/cli_unknown.feature +17 -0
  12. data/features/cli_version.feature +14 -0
  13. data/features/step_definitions/common_steps.rb +1 -0
  14. data/features/support/env.rb +1 -0
  15. data/features/support/transformers.rb +3 -0
  16. data/generators/base_generator.rb +2 -0
  17. data/generators/config/config_generator.rb +1 -1
  18. data/generators/config/templates/default.yml +4 -14
  19. data/generators/cucumber/cucumber_generator.rb +1 -1
  20. data/generators/cucumber/templates/cucumber.yml +1 -2
  21. data/generators/cucumber/templates/env.rb +8 -7
  22. data/generators/emails/emails_generator.rb +1 -1
  23. data/generators/pages/pages_generator.rb +1 -1
  24. data/generators/pages/templates/example_page.rb +2 -2
  25. data/generators/root/root_generator.rb +1 -1
  26. data/generators/root/templates/Gemfile +1 -1
  27. data/generators/rspec/rspec_generator.rb +1 -1
  28. data/generators/rspec/templates/example_spec.rb +2 -2
  29. data/generators/rspec/templates/rspec.rake +1 -1
  30. data/generators/rspec/templates/spec_helper.rb +6 -5
  31. data/generators/tasks/tasks_generator.rb +1 -1
  32. data/generators/tasks/templates/common.rake +1 -0
  33. data/howitzer.gemspec +8 -8
  34. data/lib/howitzer.rb +4 -1
  35. data/lib/howitzer/blank_page.rb +6 -0
  36. data/lib/howitzer/capybara/dsl_ex.rb +15 -0
  37. data/lib/howitzer/capybara/settings.rb +267 -0
  38. data/lib/howitzer/email.rb +134 -0
  39. data/lib/howitzer/exceptions.rb +18 -0
  40. data/lib/howitzer/helpers.rb +34 -23
  41. data/lib/howitzer/init.rb +1 -4
  42. data/lib/howitzer/mailgun/client.rb +48 -0
  43. data/lib/howitzer/mailgun/connector.rb +34 -0
  44. data/lib/howitzer/mailgun/response.rb +28 -0
  45. data/lib/howitzer/utils.rb +2 -2
  46. data/lib/howitzer/utils/data_generator/data_storage.rb +15 -2
  47. data/lib/howitzer/utils/data_generator/gen.rb +14 -10
  48. data/lib/howitzer/utils/locator_store.rb +14 -7
  49. data/lib/howitzer/utils/log.rb +2 -0
  50. data/lib/howitzer/utils/page_validator.rb +74 -27
  51. data/lib/howitzer/version.rb +1 -1
  52. data/lib/howitzer/web_page.rb +83 -32
  53. data/spec/config/default.yml +10 -12
  54. data/spec/spec_helper.rb +12 -0
  55. data/spec/support/mailgun_unit_client.rb +60 -0
  56. data/spec/unit/generators/generators_spec.rb +7 -7
  57. data/spec/unit/lib/capybara/dsl_ex_spec.rb +60 -0
  58. data/spec/unit/lib/{capybara_settings_spec.rb → capybara/settings_spec.rb} +16 -10
  59. data/spec/unit/lib/email_spec.rb +129 -0
  60. data/spec/unit/lib/helpers_spec.rb +160 -34
  61. data/spec/unit/lib/init_spec.rb +1 -12
  62. data/spec/unit/lib/mailgun/client_spec.rb +36 -0
  63. data/spec/unit/lib/mailgun/connector_spec.rb +70 -0
  64. data/spec/unit/lib/mailgun/response_spec.rb +29 -0
  65. data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +23 -5
  66. data/spec/unit/lib/utils/data_generator/gen_spec.rb +2 -63
  67. data/spec/unit/lib/utils/locator_store_spec.rb +41 -6
  68. data/spec/unit/lib/utils/log_spec.rb +1 -1
  69. data/spec/unit/lib/utils/page_validator_spec.rb +149 -25
  70. data/spec/unit/lib/web_page_spec.rb +127 -53
  71. metadata +102 -142
  72. data/lib/howitzer/utils/capybara_patched.rb +0 -23
  73. data/lib/howitzer/utils/capybara_settings.rb +0 -247
  74. data/lib/howitzer/utils/email/email.rb +0 -85
  75. data/lib/howitzer/utils/email/mail_client.rb +0 -132
  76. data/lib/howitzer/utils/email/mailgun.rb +0 -175
  77. data/lib/howitzer/utils/email/mailgun_helper.rb +0 -61
  78. data/spec/unit/bin/howitzer_spec.rb +0 -175
  79. data/spec/unit/lib/utils/email/email_spec.rb +0 -75
  80. data/spec/unit/lib/utils/email/mail_client_spec.rb +0 -115
  81. 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'
@@ -0,0 +1,3 @@
1
+ Transform /<HOWITZER_VERSION>/ do |text|
2
+ text.gsub("<HOWITZER_VERSION>", Howitzer::VERSION)
3
+ end
@@ -16,9 +16,11 @@ module Howitzer
16
16
  case type
17
17
  when :files
18
18
  copy_files(list)
19
+ #:nocov:
19
20
  when :templates
20
21
  copy_templates(list)
21
22
  else nil
23
+ #:nocov:
22
24
  end
23
25
  end
24
26
  end
@@ -13,7 +13,7 @@ module Howitzer
13
13
  protected
14
14
  def banner
15
15
  <<-EOF
16
- Creates config files.
16
+ * Config files generation ...
17
17
  EOF
18
18
  end
19
19
  end
@@ -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
- # MAIL SETTINGS #
77
+ # MAILGUN SETTINGS #
78
78
  ###########################################################
79
- mail_smtp_server: smtp.demo.com
80
- mail_smtp_port: 25
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 #
@@ -18,7 +18,7 @@ module Howitzer
18
18
  protected
19
19
  def banner
20
20
  <<-EOS
21
- Integrates Cucumber to the framework
21
+ * Cucumber integration to the framework ...
22
22
  EOS
23
23
  end
24
24
  end
@@ -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(CapybaraSettings)
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] = CapybaraSettings.suite_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.clear_ns("user")
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: #{CapybaraSettings.sauce_resource_path('selenium-server.log')}"
35
- CapybaraSettings.update_sauce_job_status(passed: DataStorage.extract('sauce', :status))
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
@@ -9,7 +9,7 @@ module Howitzer
9
9
  protected
10
10
  def banner
11
11
  <<-EOS
12
- Creates a simple email class."
12
+ * Email example generation ...
13
13
  EOS
14
14
  end
15
15
  end
@@ -14,7 +14,7 @@ module Howitzer
14
14
  protected
15
15
  def banner
16
16
  <<-EOS
17
- Creates PageOriented pattern structure
17
+ * PageOriented pattern structure generation ...
18
18
  EOS
19
19
  end
20
20
  end
@@ -2,7 +2,7 @@ require_relative 'example_menu'
2
2
 
3
3
  class ExamplePage < WebPage
4
4
  URL = '/'
5
- validates :url, pattern: /#{Regexp.escape(settings.app_host)}\/?/
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
@@ -16,7 +16,7 @@ module Howitzer
16
16
  protected
17
17
  def banner
18
18
  <<-EOF
19
- Creates root config files.
19
+ * Root files generation ...
20
20
  EOF
21
21
  end
22
22
  end
@@ -1,5 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem 'howitzer', git: "git://github.com/romikoops/howitzer.git", branch: "develop"
3
+ gem 'howitzer' #, github: "strongqa/howitzer", branch: "develop"
4
4
  gem 'debugger'
5
5
 
@@ -15,7 +15,7 @@ module Howitzer
15
15
  protected
16
16
  def banner
17
17
  <<-EOS
18
- Integrates RSpec to the framework.
18
+ * RSpec integration to the framework ...
19
19
  EOS
20
20
  end
21
21
 
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Some feature" do
4
- it "test scenario" do
3
+ feature "Some feature" do
4
+ scenario "test scenario" do
5
5
  expect(true).to be_true
6
6
  end
7
7
  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 CapybaraSettings
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
- Gen.delete_all_mailboxes
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
@@ -9,7 +9,7 @@ module Howitzer
9
9
  protected
10
10
  def banner
11
11
  <<-EOF
12
- Creates RAKE tasks folder and file.
12
+ * Base rake task generation ...
13
13
  EOF
14
14
  end
15
15
  end
@@ -1,6 +1,7 @@
1
1
  desc "Check broken links"
2
2
  task :check_links do
3
3
  require 'rawler'
4
+ require 'active_support'
4
5
  require 'active_support/core_ext'
5
6
  require 'howitzer/helpers'
6
7
 
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{The framework is based on Page Object pattern, Capybara and Rspec/Cucumber libraries}
8
- gem.summary = %q{Universal Ruby Test Framework for black box testing}
9
- gem.homepage = "https://github.com/romikoops/howitzer"
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 'activeresource', '~>4.0'
36
+ gem.add_runtime_dependency 'activesupport', '~>4.0'
36
37
  gem.add_runtime_dependency 'testingbot'
37
38
 
38
- gem.add_development_dependency("rspec", [">= 2.14.1"])
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/web_page'
7
+ require 'howitzer/email'
8
+ require 'howitzer/web_page'
9
+ require 'howitzer/blank_page'
@@ -0,0 +1,6 @@
1
+ require 'howitzer/web_page'
2
+
3
+ class BlankPage < WebPage
4
+ URL = 'about:blank'
5
+ validates :url, pattern: /^about:blank$/
6
+ end
@@ -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