howitzer 1.0.1 → 1.0.2

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