howitzer 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -1
  3. data/LICENSE +1 -1
  4. data/README.md +16 -16
  5. data/generators/base_generator.rb +1 -1
  6. data/generators/config/config_generator.rb +1 -4
  7. data/generators/config/templates/boot.rb +1 -1
  8. data/generators/config/templates/capybara.rb +1 -3
  9. data/generators/config/templates/default.yml +5 -19
  10. data/generators/config/templates/drivers/browserstack.rb +1 -1
  11. data/generators/config/templates/drivers/crossbrowsertesting.rb +1 -1
  12. data/generators/config/templates/drivers/headless_chrome.rb +1 -1
  13. data/generators/config/templates/drivers/headless_firefox.rb +1 -1
  14. data/generators/config/templates/drivers/sauce.rb +1 -1
  15. data/generators/config/templates/drivers/selenium.rb +1 -1
  16. data/generators/config/templates/drivers/selenium_grid.rb +2 -2
  17. data/generators/config/templates/drivers/testingbot.rb +1 -1
  18. data/generators/cucumber/templates/env.rb +1 -1
  19. data/generators/cucumber/templates/hooks.rb +8 -2
  20. data/generators/cucumber/templates/transformers.rb +1 -1
  21. data/generators/prerequisites/templates/factory_bot.rb +1 -1
  22. data/generators/root/templates/Gemfile.erb +4 -10
  23. data/generators/rspec/templates/spec_helper.rb +4 -4
  24. data/generators/turnip/templates/spec_helper.rb +4 -4
  25. data/generators/web/templates/example_page.rb +1 -1
  26. data/lib/howitzer/cache.rb +1 -1
  27. data/lib/howitzer/capybara_helpers.rb +27 -7
  28. data/lib/howitzer/email.rb +2 -2
  29. data/lib/howitzer/exceptions.rb +21 -21
  30. data/lib/howitzer/gmail_api/client.rb +13 -4
  31. data/lib/howitzer/log.rb +6 -6
  32. data/lib/howitzer/mailgun_api/client.rb +3 -2
  33. data/lib/howitzer/mailgun_api/response.rb +1 -2
  34. data/lib/howitzer/mailtrap_api/client.rb +1 -1
  35. data/lib/howitzer/meta/actions.rb +13 -16
  36. data/lib/howitzer/meta/element.rb +12 -10
  37. data/lib/howitzer/utils/string_extensions.rb +6 -2
  38. data/lib/howitzer/version.rb +1 -1
  39. data/lib/howitzer/web/base_section.rb +1 -1
  40. data/lib/howitzer/web/capybara_methods_proxy.rb +11 -5
  41. data/lib/howitzer/web/element_dsl.rb +104 -45
  42. data/lib/howitzer/web/iframe_dsl.rb +2 -2
  43. data/lib/howitzer/web/page.rb +4 -14
  44. data/lib/howitzer/web/page_dsl.rb +15 -6
  45. data/lib/howitzer/web/page_validator.rb +25 -26
  46. data/lib/howitzer/web/section.rb +5 -2
  47. data/lib/howitzer/web/section_dsl.rb +64 -30
  48. data/lib/howitzer.rb +2 -2
  49. metadata +24 -161
  50. data/.coveralls.yml +0 -1
  51. data/.gitignore +0 -14
  52. data/.rspec +0 -3
  53. data/.rubocop.yml +0 -60
  54. data/.ruby-gemset +0 -1
  55. data/.travis.yml +0 -8
  56. data/Gemfile +0 -14
  57. data/ISSUE_TEMPLATE.md +0 -16
  58. data/MAINTENANCE.md +0 -32
  59. data/Rakefile +0 -38
  60. data/features/cli_help.feature +0 -31
  61. data/features/cli_new.feature +0 -393
  62. data/features/cli_unknown.feature +0 -17
  63. data/features/cli_update.feature +0 -223
  64. data/features/cli_version.feature +0 -14
  65. data/features/step_definitions/common_steps.rb +0 -34
  66. data/features/support/env.rb +0 -1
  67. data/generators/config/templates/drivers/poltergeist.rb +0 -11
  68. data/generators/config/templates/drivers/webkit.rb +0 -6
  69. data/generators/root/templates/.gitignore +0 -21
  70. data/generators/root/templates/.rubocop.yml.erb +0 -56
  71. data/generators/turnip/templates/.rspec +0 -1
  72. data/howitzer.gemspec +0 -39
  73. data/lib/howitzer/mail_adapters/debugmail.rb +0 -0
  74. data/spec/config/custom.yml +0 -9
  75. data/spec/spec_helper.rb +0 -73
  76. data/spec/support/generator_helper.rb +0 -21
  77. data/spec/support/logger_helper.rb +0 -13
  78. data/spec/support/shared_examples/capybara_context_holder.rb +0 -33
  79. data/spec/support/shared_examples/capybara_methods_proxy.rb +0 -94
  80. data/spec/support/shared_examples/dynamic_section_methods.rb +0 -35
  81. data/spec/support/shared_examples/element_dsl.rb +0 -242
  82. data/spec/support/shared_examples/meta_highlight_xpath.rb +0 -41
  83. data/spec/unit/generators/base_generator_spec.rb +0 -283
  84. data/spec/unit/generators/config_generator_spec.rb +0 -61
  85. data/spec/unit/generators/cucumber_generator_spec.rb +0 -62
  86. data/spec/unit/generators/emails_generator_spec.rb +0 -35
  87. data/spec/unit/generators/prerequisites_generator_spec.rb +0 -53
  88. data/spec/unit/generators/root_generator_spec.rb +0 -86
  89. data/spec/unit/generators/rspec_generator_spec.rb +0 -36
  90. data/spec/unit/generators/tasks_generator_spec.rb +0 -31
  91. data/spec/unit/generators/templates/cucumber_spec.rb +0 -97
  92. data/spec/unit/generators/templates/rspec_spec.rb +0 -88
  93. data/spec/unit/generators/templates/turnip_spec.rb +0 -98
  94. data/spec/unit/generators/turnip_generator_spec.rb +0 -52
  95. data/spec/unit/generators/web_generator_spec.rb +0 -52
  96. data/spec/unit/lib/cache_spec.rb +0 -85
  97. data/spec/unit/lib/capybara_helpers_spec.rb +0 -730
  98. data/spec/unit/lib/email_spec.rb +0 -186
  99. data/spec/unit/lib/gmail_api/client_spec.rb +0 -26
  100. data/spec/unit/lib/howitzer_spec.rb +0 -92
  101. data/spec/unit/lib/init_spec.rb +0 -2
  102. data/spec/unit/lib/log_spec.rb +0 -122
  103. data/spec/unit/lib/mail_adapters/abstract_spec.rb +0 -62
  104. data/spec/unit/lib/mail_adapters/gmail_spec.rb +0 -128
  105. data/spec/unit/lib/mail_adapters/mailgun_spec.rb +0 -158
  106. data/spec/unit/lib/mail_adapters/mailtrap_spec.rb +0 -130
  107. data/spec/unit/lib/mailgun_api/client_spec.rb +0 -80
  108. data/spec/unit/lib/mailgun_api/connector_spec.rb +0 -54
  109. data/spec/unit/lib/mailgun_api/response_spec.rb +0 -28
  110. data/spec/unit/lib/mailtrap_api/client_spec.rb +0 -67
  111. data/spec/unit/lib/meta/element_spec.rb +0 -59
  112. data/spec/unit/lib/meta/entry_spec.rb +0 -77
  113. data/spec/unit/lib/meta/iframe_spec.rb +0 -66
  114. data/spec/unit/lib/meta/section_spec.rb +0 -43
  115. data/spec/unit/lib/utils/string_extensions_spec.rb +0 -77
  116. data/spec/unit/lib/web/base_section_spec.rb +0 -43
  117. data/spec/unit/lib/web/element_dsl_spec.rb +0 -31
  118. data/spec/unit/lib/web/iframe_dsl_spec.rb +0 -203
  119. data/spec/unit/lib/web/page_dsl_spec.rb +0 -74
  120. data/spec/unit/lib/web/page_spec.rb +0 -385
  121. data/spec/unit/lib/web/page_validator_spec.rb +0 -276
  122. data/spec/unit/lib/web/section_dsl_spec.rb +0 -165
  123. data/spec/unit/lib/web/section_spec.rb +0 -70
  124. data/spec/unit/version_spec.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7364832d86f0134a208559b840387a50685f15458ca2e54a7cac8f9869fe2974
4
- data.tar.gz: e761cd0524e173f0414ecd57ab2a9c1a99fba1325bb379fa9d56873aa74b6516
3
+ metadata.gz: 1c577b57b08ceb6da2f3a82b8b7e29950f02903fd519379bf42d49bfbb98d619
4
+ data.tar.gz: 3c3ee954802caa64bddd20e53c230dae5a6442bd83860b85058f90a61bf8cbc3
5
5
  SHA512:
6
- metadata.gz: 943c4121f3f8d1f9264a94819236543da59b7ad9aefb7f226b5d47049c5b34bf2ddc1bdb38b6ca10992ea3285fc738ddae774f95ff4ad3dd79bd437397ce7f69
7
- data.tar.gz: de7ca6029f7e6eae2837a3fbbc799403cbff55ca33a6b4b4de05200ef10466477e76fcc416fdad94226919565f3d1574bc7129e23ad66f0a86335e5bcc716765
6
+ metadata.gz: 1bbe3fe208d2d92ebfa7b04e6ae7fa7842ff8400515f8e699ab8587cbdb1ee8206f2cfc0a9e7b3841173fd6c4f7d0ab01341dc24172ca0a3fb4136c07a14ca46
7
+ data.tar.gz: 3f98ca3bc90bd1e35b7b2a87bbc8059878de7bbe08109cbdeff83e46f02bf9a8503f3bc4d034028fbef73718aac71702424276a49d59f892e25bf771d21e8f4d
data/CHANGELOG.md CHANGED
@@ -1,9 +1,24 @@
1
- ## [In git](https://github.com/strongqa/howitzer/compare/v2.2.0...master)
1
+ ## [In git](https://github.com/strongqa/howitzer/compare/v2.3.0...master)
2
2
 
3
3
  ### New Features
4
4
 
5
5
  ### Bug-fixes
6
6
 
7
+ ## [v2.3.0](https://github.com/strongqa/howitzer/compare/v2.2.0...v2.3.0)
8
+
9
+ ### New Features
10
+ - Support Ruby 3.0 (minimum version is 2.6.8)
11
+ - Unlock Activesupport 6.x
12
+ - Support latest versions of Cucumber
13
+ - Integrate rubocop-rspec linter
14
+ - Use latest version Rubocop
15
+ - Stop capybara-webkit support
16
+ - Stop poltergeist support
17
+ - Stop Apium driver support
18
+ - remove gmail gem from dependencies and add it only when it is really required
19
+ - Migrate to new Travis CI domain
20
+ - Replace abandoned Coveralls integration with Codecov [codecov.io](https://codecov.io/gh/strongqa/howitzer/)
21
+
7
22
  ## [v2.2.0](https://github.com/strongqa/howitzer/compare/v2.1.1...v2.2.0)
8
23
 
9
24
  ### New Features
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2016 Roman Parashchenko and StrongQA, Ltd.
1
+ Copyright (c) 2012-2021 Roman Parashchenko and StrongQA, LLC.
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,20 +1,22 @@
1
1
  <p align="center" style="overflow: hidden;">
2
- <a href="http://howitzer-framework.io">
2
+ <a href="https://howitzer-framework.io">
3
3
  <img src="https://raw.githubusercontent.com/strongqa/howitzer/gh-pages/images/howitzer-logo.png" alt="Howitzer" />
4
4
  </a>
5
5
  <br/>
6
6
 
7
- <p align="center"><b>Ruby-based framework for acceptance testing of web applications.</b></p>
7
+ <p align="center"><b>A Ruby-based framework for acceptance testing of web applications.</b></p>
8
8
 
9
9
  <p align="center">The framework was built with modern patterns, techniques, and tools in automated testing in order to speed up tests development and simplify supporting.</p>
10
10
 
11
11
  <p align="center">
12
12
  <a href="https://gitter.im/strongqa/howitzer"><img src="https://badges.gitter.im/Join%20Chat.svg" /></a>
13
- <a href="https://rubygems.org/gems/howitzer"><img src="http://img.shields.io/gem/v/howitzer.svg" /></a>
14
- <a href="https://travis-ci.org/strongqa/howitzer"><img src="https://travis-ci.org/strongqa/howitzer.svg?branch=master" /></a>
13
+ <a href="https://rubygems.org/gems/howitzer"><img src="https://img.shields.io/gem/v/howitzer.svg" /></a>
14
+ <a href="https://app.travis-ci.com/github/strongqa/howitzer"><img src="https://app.travis-ci.com/strongqa/howitzer.svg?branch=master" /></a>
15
15
  <a href="https://codeclimate.com/github/strongqa/howitzer"><img src="https://codeclimate.com/github/strongqa/howitzer.png" /></a>
16
- <a href='https://coveralls.io/github/strongqa/howitzer?branch=master'><img src='https://coveralls.io/repos/github/strongqa/howitzer/badge.svg?branch=master' alt='Coverage Status' /></a>
17
- <a href="https://github.com/strongqa/howitzer/blob/master/LICENSE"><img src="http://img.shields.io/badge/license-MIT-blue.svg" /></a>
16
+ <a href="https://codecov.io/gh/strongqa/howitzer">
17
+ <img src="https://codecov.io/gh/strongqa/howitzer/branch/master/graph/badge.svg?token=vB8DYQtmjA"/>
18
+ </a>
19
+ <a href="https://github.com/strongqa/howitzer/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" /></a>
18
20
  </p>
19
21
 
20
22
  </p>
@@ -30,7 +32,7 @@
30
32
  - Ability to execute tests against to both browserless driver and actual browsers with no changes in your tests.
31
33
 
32
34
  ## Documentation
33
- Refer to the [GETTING STARTED](http://docs.howitzer-framework.io) document to start working with *Howitzer*.
35
+ Refer to the [GETTING STARTED](https://docs.howitzer-framework.io) document to start working with *Howitzer*.
34
36
 
35
37
  You can also find the Rdoc documentation on [Rubygems](https://rubygems.org/gems/howitzer).
36
38
 
@@ -41,16 +43,14 @@ You can also find the Rdoc documentation on [Rubygems](https://rubygems.org/gems
41
43
 
42
44
  ## Requirements
43
45
  * Supported OS: Mac OS X, Linux, Windows
44
- * [Ruby](https://www.ruby-lang.org/en/downloads/) 2.3+
46
+ * [Ruby](https://www.ruby-lang.org/en/downloads/) 2.6.8+
45
47
  * [DevKit](https://github.com/oneclick/rubyinstaller/wiki/Development-Kit#installation-instructions) (For **Windows** only)
46
- * [PhantomJS](http://phantomjs.org/download.html) (For **poltergeist** driver only)
47
48
  * [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/) (For **chrome** selenium browser, 2.29+ for headless mode)
48
49
  * [GeckoDriver](https://github.com/mozilla/geckodriver/releases) (For **firefox** selenium browser)
49
50
  * [SafariDriver](https://webkit.org/blog/6900/webdriver-support-in-safari-10/) (For **safari** selenium browser)
50
- * [QT](https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit) (For **webkit** driver only)
51
51
  * [Chrome](https://www.google.com/chrome/browser/desktop/index.html) v.59+ (For **headless chrome** support)
52
52
  * [Firefox](https://www.mozilla.org/en-US/firefox/new/) v.56+ (For **headless firefox** support)
53
- * [Android SDK](https://developer.android.com/studio/index.html) and [Appium](http://appium.io/getting-started.html) (For Appium driver)
53
+ * [Android SDK](https://developer.android.com/studio) and [Appium](https://appium.io/docs/en/about-appium/getting-started) (For Appium driver)
54
54
  ## Setup
55
55
  To install, type
56
56
 
@@ -67,7 +67,7 @@ To generate the project with [Cucumber](https://cucumber.io/), type:
67
67
  howitzer new <PROJECT NAME> --cucumber
68
68
  ```
69
69
 
70
- With [Rspec](http://rspec.info/):
70
+ With [Rspec](https://rspec.info/):
71
71
 
72
72
  ```bash
73
73
  howitzer new <PROJECT NAME> --rspec
@@ -145,7 +145,7 @@ community](https://github.com/strongqa/howitzer/graphs/contributors).
145
145
  License
146
146
  -------
147
147
 
148
- howitzer is Copyright © 2012-2017 Roman Parashchenko and StrongQA Ltd. It is free
148
+ howitzer is Copyright © 2012-2021 Roman Parashchenko and StrongQA LLC. It is free
149
149
  software, and may be redistributed under the terms specified in the
150
150
  [LICENSE](LICENSE) file.
151
151
 
@@ -154,11 +154,11 @@ About StrongQA
154
154
 
155
155
  ![StrongQA](https://github.com/strongqa/howitzer/blob/gh-pages/images/strongqa-logo.png)
156
156
 
157
- howitzer is maintained and funded by StrongQA, Ltd.
158
- The names and logos for StrongQA are trademarks of StrongQA, Ltd.
157
+ howitzer is maintained and funded by StrongQA, LLC.
158
+ The names and logos for StrongQA are trademarks of StrongQA, LLC.
159
159
 
160
160
  We love open source software!
161
161
  See [our other projects][testing_solutions] or [hire us][hire] to consult and develop testing solutions.
162
162
 
163
- [testing_solutions]: http://strongqa.com/testing_solutions/?utm_source=github
163
+ [testing_solutions]: https://strongqa.com/services/testing-solutions?utm_source=github
164
164
  [hire]: https://strongqa.com?utm_source=github
@@ -119,7 +119,7 @@ module Howitzer
119
119
 
120
120
  def write_template(dest_path, source_path)
121
121
  File.open(dest_path, 'w+') do |f|
122
- f.write(ERB.new(File.open(source_path, 'r').read, nil, '-')
122
+ f.write(ERB.new(File.open(source_path, 'r').read, trim_mode: '-')
123
123
  .result(OpenStruct.new(@options).instance_eval { binding }))
124
124
  end
125
125
  end
@@ -9,17 +9,14 @@ module Howitzer
9
9
  { source: 'custom.yml', destination: 'config/custom.yml' },
10
10
  { source: 'capybara.rb', destination: 'config/capybara.rb' },
11
11
  { source: 'default.yml', destination: 'config/default.yml' },
12
- { source: 'drivers/appium.rb', destination: 'config/drivers/appium.rb' },
13
12
  { source: 'drivers/browserstack.rb', destination: 'config/drivers/browserstack.rb' },
14
13
  { source: 'drivers/crossbrowsertesting.rb', destination: 'config/drivers/crossbrowsertesting.rb' },
15
14
  { source: 'drivers/headless_chrome.rb', destination: 'config/drivers/headless_chrome.rb' },
16
15
  { source: 'drivers/headless_firefox.rb', destination: 'config/drivers/headless_firefox.rb' },
17
- { source: 'drivers/poltergeist.rb', destination: 'config/drivers/poltergeist.rb' },
18
16
  { source: 'drivers/sauce.rb', destination: 'config/drivers/sauce.rb' },
19
17
  { source: 'drivers/selenium.rb', destination: 'config/drivers/selenium.rb' },
20
18
  { source: 'drivers/selenium_grid.rb', destination: 'config/drivers/selenium_grid.rb' },
21
- { source: 'drivers/testingbot.rb', destination: 'config/drivers/testingbot.rb' },
22
- { source: 'drivers/webkit.rb', destination: 'config/drivers/webkit.rb' }
19
+ { source: 'drivers/testingbot.rb', destination: 'config/drivers/testingbot.rb' }
23
20
  ] }
24
21
  end
25
22
 
@@ -3,7 +3,7 @@ require 'bundler/setup'
3
3
 
4
4
  Bundler.require(:default)
5
5
 
6
- Dir[
6
+ Dir[ # rubocop:disable Lint/NonDeterministicRequireOrder
7
7
  './emails/**/*.rb',
8
8
  './web/sections/**/*.rb',
9
9
  './web/pages/**/*.rb',
@@ -2,8 +2,6 @@ HOWITZER_KNOWN_DRIVERS = %i[
2
2
  appium
3
3
  selenium
4
4
  selenium_grid
5
- webkit
6
- poltergeist
7
5
  sauce
8
6
  testingbot
9
7
  browserstack
@@ -14,7 +12,7 @@ HOWITZER_KNOWN_DRIVERS = %i[
14
12
 
15
13
  unless HOWITZER_KNOWN_DRIVERS.include?(Howitzer.driver.to_s.to_sym)
16
14
  raise Howitzer::UnknownDriverError, "Unknown '#{Howitzer.driver}' driver." \
17
- " Check your settings, it should be one of #{HOWITZER_KNOWN_DRIVERS}"
15
+ " Check your settings, it should be one of #{HOWITZER_KNOWN_DRIVERS}"
18
16
  end
19
17
 
20
18
  Capybara.configure do |config|
@@ -26,16 +26,16 @@
26
26
  # Specify SEED to reproduce the shuffling from a previous run. e.g. 'random:5738'
27
27
  test_order: defined
28
28
 
29
- # Specify one of the following drivers: selenium, selenium_grid, webkit, poltergeist, sauce,
29
+ # Specify one of the following drivers: selenium, selenium_grid, sauce,
30
30
  # testingbot, browserstack, crossbrowsertesting, headless_chrome, headless_firefox, appium
31
- driver: poltergeist
31
+ driver: headless_chrome
32
32
 
33
33
  # -Selenium-
34
34
  # specify one of next browsers: iexplore (ie), firefox (ff), chrome, safari
35
35
  selenium_browser: ff
36
36
 
37
37
  # -Headless Chrome-
38
- # List of available flags (http://peter.sh/experiments/chromium-command-line-switches/)
38
+ # List of available flags (https://peter.sh/experiments/chromium-command-line-switches/)
39
39
  headless_chrome_flags: "window-size=1920x1080, disable-gpu"
40
40
 
41
41
  # -Headless Firefox-
@@ -45,20 +45,6 @@
45
45
  # -Selenium Grid-
46
46
  selenium_hub_url: "http://example.com:4444/wd/hub"
47
47
 
48
- # -Poltergeist-
49
- # specify settings for poltergeist
50
- phantom_ignore_js_errors: false
51
- phantom_ignore_ssl_errors: true
52
-
53
- # -Appium- (https://appium.io/docs/en/writing-running-appium/caps/)
54
- appium_url: "http://localhost:80/wd/hub"
55
- appium_platform_name: "iOS"
56
- appium_platform_version: "10.0"
57
- appium_browser_name: "Safari"
58
- appium_device_name: "iPad Air 2 Simulator"
59
- appium_device_orientation: "portrait"
60
-
61
-
62
48
  rspec_wait_timeout: 10
63
49
 
64
50
  ###########################################################
@@ -68,7 +54,7 @@
68
54
  cloud_auth_pass: api_key_or_api_secret_or_access_key
69
55
  cloud_platform: any
70
56
  cloud_browser_name: Chrome
71
- cloud_browser_version: '31'
57
+ cloud_browser_version: 'latest'
72
58
  cloud_max_duration: '1800'
73
59
  cloud_http_idle_timeout: 40
74
60
 
@@ -117,7 +103,7 @@
117
103
  mail_wait_time: 60
118
104
  mail_sleep_time: 3
119
105
 
120
- # -Mailgun- (http://www.mailgun.com/)
106
+ # -Mailgun- (https://mailgun.com/)
121
107
  mailgun_key: mailgun_account_private_key
122
108
  mailgun_domain: mailgun_domain_with_stored_method
123
109
 
@@ -14,7 +14,7 @@ Capybara.register_driver :browserstack do |app|
14
14
  caps[:firefox_profile] = profile
15
15
  end
16
16
  end
17
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.browserstack.com/wd/hub"
17
+ url = "https://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.browserstack.com/wd/hub"
18
18
  CapybaraHelpers.cloud_driver(app, caps, url)
19
19
  end
20
20
 
@@ -19,7 +19,7 @@ Capybara.register_driver :crossbrowsertesting do |app|
19
19
  caps[:firefox_profile] = profile
20
20
  end
21
21
  end
22
- url = "http://#{CGI.escape(Howitzer.cloud_auth_login)}:#{Howitzer.cloud_auth_pass}"\
22
+ url = "https://#{CGI.escape(Howitzer.cloud_auth_login)}:#{Howitzer.cloud_auth_pass}"\
23
23
  '@hub.crossbrowsertesting.com/wd/hub'
24
24
  CapybaraHelpers.cloud_driver(app, caps, url)
25
25
  end
@@ -7,7 +7,7 @@ Capybara.register_driver :headless_chrome do |app|
7
7
  startup_flags.concat(Howitzer.headless_chrome_flags.split(/\s*,\s*/)) if Howitzer.headless_chrome_flags
8
8
  options = Selenium::WebDriver::Chrome::Options.new(args: startup_flags)
9
9
  params = { browser: :chrome, options: options }
10
- Capybara::Selenium::Driver.new app, params
10
+ Capybara::Selenium::Driver.new app, **params
11
11
  end
12
12
 
13
13
  Capybara::Screenshot.class_eval do
@@ -13,7 +13,7 @@ Capybara.register_driver :headless_firefox do |app|
13
13
  end
14
14
  options = Selenium::WebDriver::Firefox::Options.new(args: startup_flags, profile: ff_profile)
15
15
  params = { browser: :firefox, options: options }
16
- Capybara::Selenium::Driver.new app, params
16
+ Capybara::Selenium::Driver.new app, **params
17
17
  end
18
18
 
19
19
  Capybara.javascript_driver = :headless_firefox
@@ -16,7 +16,7 @@ Capybara.register_driver :sauce do |app|
16
16
  caps[:firefox_profile] = profile
17
17
  end
18
18
  end
19
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@ondemand.saucelabs.com:80/wd/hub"
19
+ url = "https://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@ondemand.saucelabs.com/wd/hub"
20
20
  CapybaraHelpers.cloud_driver(app, caps, url)
21
21
  end
22
22
 
@@ -20,5 +20,5 @@ Capybara.register_driver :selenium do |app|
20
20
  args << "user-agent=#{Howitzer.user_agent}" if Howitzer.user_agent.present?
21
21
  params[:options] = Selenium::WebDriver::Chrome::Options.new(args: args)
22
22
  end
23
- Capybara::Selenium::Driver.new app, params
23
+ Capybara::Selenium::Driver.new app, **params
24
24
  end
@@ -11,8 +11,8 @@ Capybara.register_driver :selenium_grid do |app|
11
11
  Selenium::WebDriver::Remote::Capabilities.safari
12
12
  else
13
13
  raise Howitzer::UnknownBrowserError, "Unknown '#{Howitzer.selenium_browser}' selenium_browser." \
14
- ' Check your settings, it should be one of' \
15
- ' [:ie, :iexplore, :ff, :firefox, :chrome, :safari]'
14
+ ' Check your settings, it should be one of' \
15
+ ' [:ie, :iexplore, :ff, :firefox, :chrome, :safari]'
16
16
  end
17
17
  if Howitzer.user_agent.present?
18
18
  if CapybaraHelpers.chrome_browser?
@@ -15,7 +15,7 @@ Capybara.register_driver :testingbot do |app|
15
15
  caps[:firefox_profile] = profile
16
16
  end
17
17
  end
18
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.testingbot.com/wd/hub"
18
+ url = "https://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.testingbot.com/wd/hub"
19
19
  CapybaraHelpers.cloud_driver(app, caps, url)
20
20
  end
21
21
 
@@ -14,7 +14,7 @@ AfterConfiguration do |config|
14
14
  if Howitzer.test_order.present?
15
15
  order, seed = Howitzer.test_order.split(':')
16
16
  config.instance_variable_get(:@options)[:order] = order
17
- config.instance_variable_get(:@options)[:seed] = seed
17
+ config.instance_variable_get(:@options)[:seed] ||= seed
18
18
  end
19
19
  end
20
20
 
@@ -1,6 +1,12 @@
1
1
  Before do |scenario|
2
2
  Capybara.use_default_driver
3
- Howitzer::Log.print_feature_name(scenario.feature.name)
3
+ feature_name = \
4
+ if Gem::Requirement.new('>3').satisfied_by?(Gem::Version.new(Cucumber::VERSION))
5
+ File.read(scenario.location.file)[/Feature:\s(.+)/, 1]
6
+ else
7
+ scenario.feature.name
8
+ end
9
+ Howitzer::Log.print_feature_name(feature_name)
4
10
  Howitzer::Log.print_scenario_name(scenario.name)
5
11
  @session_start = CapybaraHelpers.duration(Time.now.utc - Howitzer::Cache.extract(:cloud, :start_time))
6
12
  end
@@ -10,7 +16,7 @@ After do |scenario|
10
16
  Howitzer::Cache.store(:cloud, :status, false) if scenario.failed?
11
17
  session_end = CapybaraHelpers.duration(Time.now.utc - Howitzer::Cache.extract(:cloud, :start_time))
12
18
  Howitzer::Log.info "CLOUD VIDEO #{@session_start} - #{session_end}" \
13
- " URL: #{CapybaraHelpers.cloud_resource_path(:video)}"
19
+ " URL: #{CapybaraHelpers.cloud_resource_path(:video)}"
14
20
  elsif CapybaraHelpers.ie_browser?
15
21
  Howitzer::Log.info 'IE reset session'
16
22
  Capybara.current_session.execute_script("void(document.execCommand('ClearAuthenticationCache', false));")
@@ -15,7 +15,7 @@
15
15
  # end
16
16
  ParameterType(
17
17
  name: 'factory',
18
- regexp: /(?:factory|FACTORY)_([A-Za-z_]+)(\d*)(?:\[\:(.+)\])?/,
18
+ regexp: /(?:factory|FACTORY)_([A-Za-z_]+)(\d*)(?:\[:(.+)\])?/,
19
19
  transformer: lambda do |_, factory, num, property|
20
20
  res = FactoryBot.given_by_number(factory.downcase, num)
21
21
  res = res.send(property) if property
@@ -1,4 +1,4 @@
1
- # @see http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md
1
+ # @see https://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md
2
2
  require 'factory_bot'
3
3
 
4
4
  FactoryBot.definition_file_paths = [File.join(__dir__, 'factories')]
@@ -1,7 +1,9 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ ruby '>=2.6.8'
4
+
3
5
  gem 'capybara-screenshot'
4
- <%= "gem 'cucumber', '~>3.0'\n" if cucumber -%>
6
+ <%= "gem 'cucumber', '>=3.0', '<7'\n" if cucumber -%>
5
7
  <%= "gem 'cuke_sniffer', require: false\n" if cucumber -%>
6
8
  gem 'factory_bot'
7
9
  gem 'howitzer'
@@ -11,18 +13,10 @@ gem 'repeater'
11
13
  gem 'rest-client'
12
14
  <%= "gem 'rspec', '~>3.2'\n" if rspec || turnip -%>
13
15
  gem 'rubocop'
16
+ <%= "gem 'rubocop-rspec'\n" if rspec || turnip -%>
14
17
  <%= "gem 'turnip'\n" if turnip -%>
15
18
  <%= "gem 'syntax'\n" if cucumber -%>
16
19
 
17
20
  # Uncomment it if you are going to use 'appium' driver. Appium and Android SDK should be installed.
18
21
  # See https://appium.io/docs/en/about-appium/getting-started/
19
22
  # gem 'appium_capybara'
20
-
21
- # Uncomment it if you are going to use 'webkit' driver. QT library should be installed.
22
- # See https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit
23
- #
24
- # gem 'capybara-webkit'
25
-
26
- # Uncomment it if you are going to use 'poltergeist' driver. PhantomJS should be installed.
27
- # See https://github.com/jnicklas/capybara#poltergeist
28
- # gem 'poltergeist', git: 'https://github.com/teampoltergeist/poltergeist.git', branch: :master
@@ -2,7 +2,7 @@ require 'capybara/rspec/features'
2
2
  require_relative '../config/boot'
3
3
  require_relative '../config/capybara'
4
4
 
5
- Dir['./spec/support/**/*.rb'].each { |f| require f }
5
+ Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
6
6
 
7
7
  RSpec.configure do |config|
8
8
  Howitzer::Log.settings_as_formatted_text
@@ -17,7 +17,7 @@ RSpec.configure do |config|
17
17
  config.wait_timeout = Howitzer.rspec_wait_timeout
18
18
  config.order = Howitzer.test_order.presence || :defined
19
19
 
20
- config.before(:each) do
20
+ config.before do
21
21
  scenario_name =
22
22
  if RSpec.current_example.description.blank?
23
23
  RSpec.current_example.metadata[:full_description]
@@ -28,12 +28,12 @@ RSpec.configure do |config|
28
28
  @session_start = CapybaraHelpers.duration(Time.now.utc - Howitzer::Cache.extract(:cloud, :start_time))
29
29
  end
30
30
 
31
- config.after(:each) do
31
+ config.after do
32
32
  Howitzer::Cache.clear_all_ns
33
33
  if CapybaraHelpers.cloud_driver?
34
34
  session_end = CapybaraHelpers.duration(Time.now.utc - Howitzer::Cache.extract(:cloud, :start_time))
35
35
  Howitzer::Log.info "CLOUD VIDEO #{@session_start} - #{session_end}" \
36
- " URL: #{CapybaraHelpers.cloud_resource_path(:video)}"
36
+ " URL: #{CapybaraHelpers.cloud_resource_path(:video)}"
37
37
  elsif CapybaraHelpers.ie_browser?
38
38
  Howitzer::Log.info 'IE reset session'
39
39
  Capybara.current_session.execute_script("void(document.execCommand('ClearAuthenticationCache', false));")
@@ -1,7 +1,7 @@
1
1
  require_relative '../config/boot'
2
2
  require_relative '../config/capybara'
3
3
 
4
- Dir['./spec/support/**/*.rb'].each { |f| require f }
4
+ Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
5
5
 
6
6
  RSpec.configure do |config|
7
7
  Howitzer::Log.settings_as_formatted_text
@@ -16,7 +16,7 @@ RSpec.configure do |config|
16
16
  config.wait_timeout = Howitzer.rspec_wait_timeout
17
17
  config.order = Howitzer.test_order.presence || :defined
18
18
 
19
- config.before(:each) do
19
+ config.before do
20
20
  scenario_name =
21
21
  if RSpec.current_example.description.blank?
22
22
  RSpec.current_example.metadata[:full_description]
@@ -27,12 +27,12 @@ RSpec.configure do |config|
27
27
  @session_start = CapybaraHelpers.duration(Time.now.utc - Howitzer::Cache.extract(:cloud, :start_time))
28
28
  end
29
29
 
30
- config.after(:each) do
30
+ config.after do
31
31
  Howitzer::Cache.clear_all_ns
32
32
  if CapybaraHelpers.cloud_driver?
33
33
  session_end = CapybaraHelpers.duration(Time.now.utc - Howitzer::Cache.extract(:cloud, :start_time))
34
34
  Howitzer::Log.info "CLOUD VIDEO #{@session_start} - #{session_end}" \
35
- " URL: #{CapybaraHelpers.cloud_resource_path(:video)}"
35
+ " URL: #{CapybaraHelpers.cloud_resource_path(:video)}"
36
36
  elsif CapybaraHelpers.ie_browser?
37
37
  Howitzer::Log.info 'IE reset session'
38
38
  Capybara.current_session.execute_script("void(document.execCommand('ClearAuthenticationCache', false));")
@@ -1,7 +1,7 @@
1
1
  # This class is example of web page
2
2
  class ExamplePage < Howitzer::Web::Page
3
3
  path '/'
4
- validate :url, %r{\A(?:.*?:\/\/)?[^\/]*\/?\z}
4
+ validate :url, %r{\A(?:.*?://)?[^/]*/?\z}
5
5
 
6
6
  section :menu
7
7
 
@@ -4,7 +4,7 @@ module Howitzer
4
4
  # Data can be stored in memory using this class
5
5
  #
6
6
  module Cache
7
- SPECIAL_NS_LIST = [:cloud].freeze #:nodoc:
7
+ SPECIAL_NS_LIST = [:cloud].freeze # :nodoc:
8
8
  @data ||= {}
9
9
 
10
10
  class << self
@@ -1,11 +1,33 @@
1
1
  require 'rest-client'
2
2
  require 'howitzer/exceptions'
3
3
 
4
+ # There is an issue with supporting Ruby 3 by Selenium Webdriver 3.x version
5
+ # https://github.com/SeleniumHQ/selenium/issues/9001
6
+ # Migration to Selenium Webdriver 4 is planned when it will be released without alfa, beta stages.
7
+ if Gem::Requirement.new('>=3').satisfied_by?(Gem::Version.new(RUBY_VERSION)) ||
8
+ Gem::Requirement.new(['>=3', '<4']).satisfied_by?(Gem::Version.new(Selenium::WebDriver::VERSION))
9
+ module Selenium
10
+ module WebDriver
11
+ module Remote
12
+ class Bridge # rubocop:disable Style/Documentation
13
+ class << self
14
+ alias original_handshake handshake
15
+
16
+ def handshake(opts = {})
17
+ original_handshake(**opts)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
4
26
  module Howitzer
5
27
  # This module holds capybara helpers methods
6
28
  module CapybaraHelpers
7
- CHECK_YOUR_SETTINGS_MSG = 'Please check your settings'.freeze #:nodoc:
8
- HOWITZER_KNOWN_BROWSERS = [ #:nodoc:
29
+ CHECK_YOUR_SETTINGS_MSG = 'Please check your settings'.freeze # :nodoc:
30
+ HOWITZER_KNOWN_BROWSERS = [ # :nodoc:
9
31
  CLOUD_BROWSERS = [
10
32
  SAUCE = :sauce,
11
33
  TESTINGBOT = :testingbot,
@@ -15,10 +37,8 @@ module Howitzer
15
37
  LOCAL_BROWSERS = [
16
38
  HEADLESS_CHROME = :headless_chrome,
17
39
  HEADLESS_FIREFOX = :headless_firefox,
18
- POLTERGEIST = :poltergeist,
19
40
  SELENIUM = :selenium,
20
- SELENIUM_GRID = :selenium_grid,
21
- WEBKIT = :webkit
41
+ SELENIUM_GRID = :selenium_grid
22
42
  ].freeze
23
43
  ].freeze
24
44
 
@@ -127,7 +147,7 @@ module Howitzer
127
147
  http_client: http_client,
128
148
  browser: :remote
129
149
  }
130
- driver = Capybara::Selenium::Driver.new(app, options)
150
+ driver = Capybara::Selenium::Driver.new(app, **options)
131
151
  driver.browser.file_detector = remote_file_detector
132
152
  driver
133
153
  end
@@ -199,7 +219,7 @@ module Howitzer
199
219
  end
200
220
 
201
221
  def update_sauce_job_status(json_data = {})
202
- host = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@saucelabs.com"
222
+ host = "https://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@saucelabs.com"
203
223
  path = "/rest/v1/#{Howitzer.cloud_auth_login}/jobs/#{session_id}"
204
224
  url = "#{host}#{path}"
205
225
  ::RestClient.put url, json_data.to_json, content_type: :json, accept: :json
@@ -79,8 +79,8 @@ module Howitzer
79
79
  def self.find_by_recipient(recipient, params = {})
80
80
  if defined?(subject_value).nil? || subject_value.nil?
81
81
  raise Howitzer::NoEmailSubjectError, "Please specify email subject. For example:\n" \
82
- "class SomeEmail < Howitzer::Email\n" \
83
- " subject ‘some subject text’\nend"
82
+ "class SomeEmail < Howitzer::Email\n" \
83
+ " subject ‘some subject text’\nend"
84
84
  end
85
85
  new(adapter.find(recipient, expand_subject(params), wait: wait_time_value))
86
86
  end
@@ -1,24 +1,24 @@
1
1
  # This module holds all custom howitzer exceptions
2
2
  module Howitzer
3
- CommunicationError = Class.new(StandardError) #:nodoc:
4
- ParseError = Class.new(StandardError) #:nodoc:
5
- InvalidApiKeyError = Class.new(StandardError) #:nodoc:
6
- BadElementParamsError = Class.new(StandardError) #:nodoc:
7
- NoValidationError = Class.new(StandardError) #:nodoc:
8
- UnknownValidationError = Class.new(StandardError) #:nodoc:
9
- EmailNotFoundError = Class.new(StandardError) #:nodoc:
10
- NoAttachmentsError = Class.new(StandardError) #:nodoc:
11
- DriverNotSpecifiedError = Class.new(StandardError) #:nodoc:
12
- UnknownDriverError = Class.new(StandardError) #:nodoc:
13
- CloudBrowserNotSpecifiedError = Class.new(StandardError) #:nodoc:
14
- SelBrowserNotSpecifiedError = Class.new(StandardError) #:nodoc:
15
- UnknownBrowserError = Class.new(StandardError) #:nodoc:
16
- IncorrectPageError = Class.new(StandardError) #:nodoc:
17
- AmbiguousPageMatchingError = Class.new(StandardError) #:nodoc:
18
- NoMailAdapterError = Class.new(StandardError) #:nodoc:
19
- NoPathForPageError = Class.new(StandardError) #:nodoc:
20
- NoEmailSubjectError = Class.new(StandardError) #:nodoc:
21
- NoDataError = Class.new(StandardError) #:nodoc:
22
- UndefinedElementError = Class.new(StandardError) #:nodoc:
23
- UndefinedSexySettingError = Class.new(StandardError) #:nodoc:
3
+ CommunicationError = Class.new(StandardError) # :nodoc:
4
+ ParseError = Class.new(StandardError) # :nodoc:
5
+ InvalidApiKeyError = Class.new(StandardError) # :nodoc:
6
+ BadElementParamsError = Class.new(StandardError) # :nodoc:
7
+ NoValidationError = Class.new(StandardError) # :nodoc:
8
+ UnknownValidationError = Class.new(StandardError) # :nodoc:
9
+ EmailNotFoundError = Class.new(StandardError) # :nodoc:
10
+ NoAttachmentsError = Class.new(StandardError) # :nodoc:
11
+ DriverNotSpecifiedError = Class.new(StandardError) # :nodoc:
12
+ UnknownDriverError = Class.new(StandardError) # :nodoc:
13
+ CloudBrowserNotSpecifiedError = Class.new(StandardError) # :nodoc:
14
+ SelBrowserNotSpecifiedError = Class.new(StandardError) # :nodoc:
15
+ UnknownBrowserError = Class.new(StandardError) # :nodoc:
16
+ IncorrectPageError = Class.new(StandardError) # :nodoc:
17
+ AmbiguousPageMatchingError = Class.new(StandardError) # :nodoc:
18
+ NoMailAdapterError = Class.new(StandardError) # :nodoc:
19
+ NoPathForPageError = Class.new(StandardError) # :nodoc:
20
+ NoEmailSubjectError = Class.new(StandardError) # :nodoc:
21
+ NoDataError = Class.new(StandardError) # :nodoc:
22
+ UndefinedElementError = Class.new(StandardError) # :nodoc:
23
+ UndefinedSexySettingError = Class.new(StandardError) # :nodoc:
24
24
  end