howitzer 2.1.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +44 -1
  3. data/LICENSE +1 -1
  4. data/README.md +19 -17
  5. data/generators/base_generator.rb +5 -7
  6. data/generators/config/config_generator.rb +3 -4
  7. data/generators/config/templates/boot.rb +2 -2
  8. data/generators/config/templates/capybara.rb +4 -5
  9. data/generators/config/templates/default.yml +21 -11
  10. data/generators/config/templates/drivers/browserstack.rb +31 -4
  11. data/generators/config/templates/drivers/crossbrowsertesting.rb +9 -11
  12. data/generators/config/templates/drivers/headless_chrome.rb +1 -1
  13. data/generators/config/templates/drivers/headless_firefox.rb +23 -0
  14. data/generators/config/templates/drivers/lambdatest.rb +30 -0
  15. data/generators/config/templates/drivers/sauce.rb +30 -2
  16. data/generators/config/templates/drivers/selenium.rb +1 -1
  17. data/generators/config/templates/drivers/selenium_grid.rb +3 -3
  18. data/generators/config/templates/drivers/testingbot.rb +29 -2
  19. data/generators/cucumber/templates/cuke_sniffer.rake +2 -2
  20. data/generators/cucumber/templates/env.rb +8 -0
  21. data/generators/cucumber/templates/hooks.rb +9 -3
  22. data/generators/cucumber/templates/transformers.rb +1 -1
  23. data/generators/prerequisites/templates/factory_bot.rb +2 -1
  24. data/generators/root/root_generator.rb +1 -1
  25. data/generators/root/templates/Gemfile.erb +4 -10
  26. data/generators/rspec/templates/spec_helper.rb +6 -5
  27. data/generators/turnip/templates/spec_helper.rb +6 -5
  28. data/generators/web/templates/example_page.rb +1 -1
  29. data/lib/howitzer/cache.rb +20 -19
  30. data/lib/howitzer/capybara_helpers.rb +59 -14
  31. data/lib/howitzer/email.rb +3 -2
  32. data/lib/howitzer/exceptions.rb +21 -21
  33. data/lib/howitzer/gmail_api/client.rb +13 -4
  34. data/lib/howitzer/log.rb +6 -6
  35. data/lib/howitzer/mail_adapters/gmail.rb +3 -0
  36. data/lib/howitzer/mail_adapters/mailgun.rb +3 -1
  37. data/lib/howitzer/mail_adapters/mailtrap.rb +3 -0
  38. data/lib/howitzer/mailgun_api/client.rb +3 -2
  39. data/lib/howitzer/mailgun_api/connector.rb +1 -0
  40. data/lib/howitzer/mailgun_api/response.rb +1 -2
  41. data/lib/howitzer/mailtrap_api/client.rb +1 -1
  42. data/lib/howitzer/meta/actions.rb +35 -0
  43. data/lib/howitzer/meta/element.rb +40 -0
  44. data/lib/howitzer/meta/entry.rb +62 -0
  45. data/lib/howitzer/meta/iframe.rb +41 -0
  46. data/lib/howitzer/meta/section.rb +30 -0
  47. data/lib/howitzer/meta.rb +11 -0
  48. data/lib/howitzer/utils/string_extensions.rb +6 -2
  49. data/lib/howitzer/version.rb +1 -1
  50. data/lib/howitzer/web/base_section.rb +1 -1
  51. data/lib/howitzer/web/capybara_context_holder.rb +1 -0
  52. data/lib/howitzer/web/capybara_methods_proxy.rb +15 -6
  53. data/lib/howitzer/web/element_dsl.rb +104 -44
  54. data/lib/howitzer/web/iframe_dsl.rb +4 -2
  55. data/lib/howitzer/web/page.rb +14 -14
  56. data/lib/howitzer/web/page_dsl.rb +18 -6
  57. data/lib/howitzer/web/page_validator.rb +27 -26
  58. data/lib/howitzer/web/section.rb +13 -2
  59. data/lib/howitzer/web/section_dsl.rb +65 -30
  60. data/lib/howitzer.rb +40 -0
  61. metadata +31 -157
  62. data/.coveralls.yml +0 -1
  63. data/.gitignore +0 -14
  64. data/.rspec +0 -3
  65. data/.rubocop.yml +0 -51
  66. data/.ruby-gemset +0 -1
  67. data/.travis.yml +0 -7
  68. data/Gemfile +0 -14
  69. data/ISSUE_TEMPLATE.md +0 -16
  70. data/MAINTENANCE.md +0 -32
  71. data/Rakefile +0 -38
  72. data/features/cli_help.feature +0 -31
  73. data/features/cli_new.feature +0 -389
  74. data/features/cli_unknown.feature +0 -17
  75. data/features/cli_update.feature +0 -218
  76. data/features/cli_version.feature +0 -14
  77. data/features/step_definitions/common_steps.rb +0 -34
  78. data/features/support/env.rb +0 -1
  79. data/generators/config/templates/drivers/phantomjs.rb +0 -19
  80. data/generators/config/templates/drivers/poltergeist.rb +0 -11
  81. data/generators/config/templates/drivers/webkit.rb +0 -6
  82. data/generators/root/templates/.gitignore +0 -21
  83. data/generators/root/templates/.rubocop.yml +0 -35
  84. data/generators/turnip/templates/.rspec +0 -1
  85. data/howitzer.gemspec +0 -39
  86. data/lib/howitzer/mail_adapters/debugmail.rb +0 -0
  87. data/spec/config/custom.yml +0 -9
  88. data/spec/spec_helper.rb +0 -73
  89. data/spec/support/generator_helper.rb +0 -21
  90. data/spec/support/logger_helper.rb +0 -13
  91. data/spec/support/shared_examples/capybara_context_holder.rb +0 -33
  92. data/spec/support/shared_examples/capybara_methods_proxy.rb +0 -94
  93. data/spec/support/shared_examples/dynamic_section_methods.rb +0 -35
  94. data/spec/support/shared_examples/element_dsl.rb +0 -242
  95. data/spec/unit/generators/base_generator_spec.rb +0 -283
  96. data/spec/unit/generators/config_generator_spec.rb +0 -59
  97. data/spec/unit/generators/cucumber_generator_spec.rb +0 -62
  98. data/spec/unit/generators/emails_generator_spec.rb +0 -35
  99. data/spec/unit/generators/prerequisites_generator_spec.rb +0 -53
  100. data/spec/unit/generators/root_generator_spec.rb +0 -75
  101. data/spec/unit/generators/rspec_generator_spec.rb +0 -36
  102. data/spec/unit/generators/tasks_generator_spec.rb +0 -31
  103. data/spec/unit/generators/turnip_generator_spec.rb +0 -52
  104. data/spec/unit/generators/web_generator_spec.rb +0 -52
  105. data/spec/unit/lib/cache_spec.rb +0 -85
  106. data/spec/unit/lib/capybara_helpers_spec.rb +0 -697
  107. data/spec/unit/lib/email_spec.rb +0 -186
  108. data/spec/unit/lib/gmail_api/client_spec.rb +0 -26
  109. data/spec/unit/lib/howitzer_spec.rb +0 -69
  110. data/spec/unit/lib/init_spec.rb +0 -2
  111. data/spec/unit/lib/log_spec.rb +0 -122
  112. data/spec/unit/lib/mail_adapters/abstract_spec.rb +0 -62
  113. data/spec/unit/lib/mail_adapters/gmail_spec.rb +0 -128
  114. data/spec/unit/lib/mail_adapters/mailgun_spec.rb +0 -158
  115. data/spec/unit/lib/mail_adapters/mailtrap_spec.rb +0 -130
  116. data/spec/unit/lib/mailgun_api/client_spec.rb +0 -80
  117. data/spec/unit/lib/mailgun_api/connector_spec.rb +0 -54
  118. data/spec/unit/lib/mailgun_api/response_spec.rb +0 -28
  119. data/spec/unit/lib/mailtrap_api/client_spec.rb +0 -67
  120. data/spec/unit/lib/utils/string_extensions_spec.rb +0 -77
  121. data/spec/unit/lib/web/base_section_spec.rb +0 -43
  122. data/spec/unit/lib/web/element_dsl_spec.rb +0 -22
  123. data/spec/unit/lib/web/iframe_dsl_spec.rb +0 -203
  124. data/spec/unit/lib/web/page_dsl_spec.rb +0 -74
  125. data/spec/unit/lib/web/page_spec.rb +0 -378
  126. data/spec/unit/lib/web/page_validator_spec.rb +0 -276
  127. data/spec/unit/lib/web/section_dsl_spec.rb +0 -165
  128. data/spec/unit/lib/web/section_spec.rb +0 -63
  129. data/spec/unit/version_spec.rb +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 94940ab8c75aebb8875f48220c8019504db644bd
4
- data.tar.gz: 1228bad1fea3a9b128e74d248c394c8a4ac1bcfb
2
+ SHA256:
3
+ metadata.gz: fe051b3bfe068d7fe68f999882f1aac432ee24dd558438e3e0b6f195c7123885
4
+ data.tar.gz: '09dca8df71b0ed83c4f0cf6f49679330628d92934f4e2e36bd861ddeb3ff2427'
5
5
  SHA512:
6
- metadata.gz: 87eefa4b47bfc459116c1ada0bd47b013f4ef7f519b8e88297adbe2b6526513a78bc401980b97a07fc50ce737505b2a95e13738ad21b42a9bf2cf22097f88cd9
7
- data.tar.gz: 520dc413394cdc682f421477f0e6779fc403dd364172e5b83afbfd28d99c22d957fd5841852dfd427f0ce3b08f398921afa5a6dcb5fdb90a91e4d741a80ed99a
6
+ metadata.gz: 5265ec269dba8e334e2c1223ac788c2a65b331f2374d9007ae78a3c0b5fc1aa79a9ce65ccfff713efeec3a7e6531cf42fc413eeb722c908f916b7fd5efc8f34d
7
+ data.tar.gz: 72948920c6c1cd9b437e766dc89bc205b12837c86e98a225ff05d853d17f16a4b833cbcc9febeeafd4b5ed3f60be915c0a67e779dd5d9967175c6b9e62cfc9f5
data/CHANGELOG.md CHANGED
@@ -1,9 +1,52 @@
1
- ## [In git](https://github.com/strongqa/howitzer/compare/v2.1.1...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
+ ## [2.4.0](https://github.com/strongqa/howitzer/compare/v2.3.0...v2.4.0) (2022-07-22)
8
+
9
+
10
+ ### Features
11
+
12
+ * LambdaTest support ([#305](https://github.com/strongqa/howitzer/issues/305)) ([eca5b8a](https://github.com/strongqa/howitzer/commit/eca5b8a6e4e30c4b9a7640ee999c061cd8e71e09))
13
+ * RegExp email subject matcher for Mailgun ([#304](https://github.com/strongqa/howitzer/issues/304)) ([598c9a2](https://github.com/strongqa/howitzer/commit/598c9a27b5dd8047c212ad050f86b78fa72d326d))
14
+ * Selenium 4 support ([#303](https://github.com/strongqa/howitzer/issues/303)) ([c5bf2d8](https://github.com/strongqa/howitzer/commit/c5bf2d8426e36f97b9fa109a783803c7b1bb538d))
15
+
16
+
17
+ ### Continuous Integration
18
+
19
+ * release-please integration ([#307](https://github.com/strongqa/howitzer/issues/307)) ([bd2f53e](https://github.com/strongqa/howitzer/commit/bd2f53e75c9ef283daadf8f9063d827c4f885a77))
20
+
21
+ ## [v2.3.0](https://github.com/strongqa/howitzer/compare/v2.2.0...v2.3.0)
22
+
23
+ ### New Features
24
+ - Support Ruby 3.0 (minimum version is 2.6.8)
25
+ - Unlock Activesupport 6.x
26
+ - Support latest versions of Cucumber
27
+ - Integrate rubocop-rspec linter
28
+ - Use latest version Rubocop
29
+ - Stop capybara-webkit support
30
+ - Stop poltergeist support
31
+ - Stop Apium driver support
32
+ - remove gmail gem from dependencies and add it only when it is really required
33
+ - Migrate to new Travis CI domain
34
+ - Replace abandoned Coveralls integration with Codecov [codecov.io](https://codecov.io/gh/strongqa/howitzer/)
35
+
36
+ ## [v2.2.0](https://github.com/strongqa/howitzer/compare/v2.1.1...v2.2.0)
37
+
38
+ ### New Features
39
+ - [#293](https://github.com/strongqa/howitzer/issues/293) add support ordering for run tests
40
+ - [#276](https://github.com/strongqa/howitzer/issues/276) Add support Capybara v3
41
+ - [#280](https://github.com/strongqa/howitzer/issues/280) Add support Firefox Headless
42
+ - [#241](https://github.com/strongqa/howitzer/issues/241) meta interface added. Allows tracking elements,sections, iframes on the page.
43
+ - [#266](https://github.com/strongqa/howitzer/issues/266) ruby 2.2 no longer supported
44
+ - [#265](https://github.com/strongqa/howitzer/issues/265) Add Appium driver
45
+ ### Bug-fixes
46
+ - [#286](https://github.com/strongqa/howitzer/issues/286) [Installation] generated rubocop.yml doesn't cover ruby sources
47
+ - [#274](https://github.com/strongqa/howitzer/issues/274) Stopped PhantomJS supporting
48
+ - [#282](https://github.com/strongqa/howitzer/issues/282) Multiple sessions don't work properly
49
+
7
50
  ## [v2.1.1](https://github.com/strongqa/howitzer/compare/v2.1.0...v2.1.1)
8
51
 
9
52
  ### 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,21 +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>
15
- <a href='https://gemnasium.com/strongqa/howitzer'><img src="https://gemnasium.com/strongqa/howitzer.svg" /></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>
16
15
  <a href="https://codeclimate.com/github/strongqa/howitzer"><img src="https://codeclimate.com/github/strongqa/howitzer.png" /></a>
17
- <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>
18
- <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>
19
20
  </p>
20
21
 
21
22
  </p>
@@ -25,13 +26,13 @@
25
26
  - Fast installation and configuration of the complete testing infrastructure (takes less than 5 minutes).
26
27
  - Elegant, intuitive and powerful Ruby language underneath.
27
28
  - Possibility to choose your favorite BDD tool (Cucumber, RSpec or Turnip).
28
- - Integration with SauceLabs, Testingbot, BrowserStack, CrossBrowserTesting cloud services.
29
+ - Integration with SauceLabs, Testingbot, BrowserStack, CrossBrowserTesting, LambdaTest cloud services.
29
30
  - Integration with MailGun, Gmail, Mailtrap email services.
30
31
  - Easy tests support based on the best patterns, techniques, principles.
31
32
  - Ability to execute tests against to both browserless driver and actual browsers with no changes in your tests.
32
33
 
33
34
  ## Documentation
34
- 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*.
35
36
 
36
37
  You can also find the Rdoc documentation on [Rubygems](https://rubygems.org/gems/howitzer).
37
38
 
@@ -42,14 +43,13 @@ You can also find the Rdoc documentation on [Rubygems](https://rubygems.org/gems
42
43
 
43
44
  ## Requirements
44
45
  * Supported OS: Mac OS X, Linux, Windows
45
- * [Ruby](https://www.ruby-lang.org/en/downloads/) 2.2.2+
46
+ * [Ruby](https://www.ruby-lang.org/en/downloads/) 2.6.8+
46
47
  * [DevKit](https://github.com/oneclick/rubyinstaller/wiki/Development-Kit#installation-instructions) (For **Windows** only)
47
- * [PhantomJS](http://phantomjs.org/download.html) (For **phantomjs** and **poltergeist** drivers only)
48
48
  * [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/) (For **chrome** selenium browser, 2.29+ for headless mode)
49
49
  * [GeckoDriver](https://github.com/mozilla/geckodriver/releases) (For **firefox** selenium browser)
50
50
  * [SafariDriver](https://webkit.org/blog/6900/webdriver-support-in-safari-10/) (For **safari** selenium browser)
51
- * [QT](https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit) (For **webkit** driver only)
52
51
  * [Chrome](https://www.google.com/chrome/browser/desktop/index.html) v.59+ (For **headless chrome** support)
52
+ * [Firefox](https://www.mozilla.org/en-US/firefox/new/) v.56+ (For **headless firefox** support)
53
53
  ## Setup
54
54
  To install, type
55
55
 
@@ -66,7 +66,7 @@ To generate the project with [Cucumber](https://cucumber.io/), type:
66
66
  howitzer new <PROJECT NAME> --cucumber
67
67
  ```
68
68
 
69
- With [Rspec](http://rspec.info/):
69
+ With [Rspec](https://rspec.info/):
70
70
 
71
71
  ```bash
72
72
  howitzer new <PROJECT NAME> --rspec
@@ -134,6 +134,8 @@ Don't forget to review the difference, to see if there were any unexpected chang
134
134
  Contributing
135
135
  ------------
136
136
 
137
+ [![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/0)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/0)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/1)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/1)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/2)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/2)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/3)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/3)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/4)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/4)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/5)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/5)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/6)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/6)[![](https://sourcerer.io/fame/romikoops/strongqa/howitzer/images/7)](https://sourcerer.io/fame/romikoops/strongqa/howitzer/links/7)
138
+
137
139
  Please see [CONTRIBUTING.md](CONTRIBUTING.md).
138
140
 
139
141
  howitzer was originally designed by Roman Parashchenko and is now maintained by StrongQA team. You can find list of contributors here [open source
@@ -142,7 +144,7 @@ community](https://github.com/strongqa/howitzer/graphs/contributors).
142
144
  License
143
145
  -------
144
146
 
145
- howitzer is Copyright © 2012-2017 Roman Parashchenko and StrongQA Ltd. It is free
147
+ howitzer is Copyright © 2012-2021 Roman Parashchenko and StrongQA LLC. It is free
146
148
  software, and may be redistributed under the terms specified in the
147
149
  [LICENSE](LICENSE) file.
148
150
 
@@ -151,11 +153,11 @@ About StrongQA
151
153
 
152
154
  ![StrongQA](https://github.com/strongqa/howitzer/blob/gh-pages/images/strongqa-logo.png)
153
155
 
154
- howitzer is maintained and funded by StrongQA, Ltd.
155
- The names and logos for StrongQA are trademarks of StrongQA, Ltd.
156
+ howitzer is maintained and funded by StrongQA, LLC.
157
+ The names and logos for StrongQA are trademarks of StrongQA, LLC.
156
158
 
157
159
  We love open source software!
158
160
  See [our other projects][testing_solutions] or [hire us][hire] to consult and develop testing solutions.
159
161
 
160
- [testing_solutions]: http://strongqa.com/testing_solutions/?utm_source=github
162
+ [testing_solutions]: https://strongqa.com/services/testing-solutions?utm_source=github
161
163
  [hire]: https://strongqa.com?utm_source=github
@@ -89,8 +89,8 @@ module Howitzer
89
89
  copy_templates_file_exist(data, destination_path, source_path)
90
90
  else
91
91
  write_template(destination_path, source_path)
92
- puts_info "#{ColorizedString.new('Added').light_green} template '#{data[:source]}' with"\
93
- " params '#{@options}' to destination '#{data[:destination]}'"
92
+ puts_info "#{ColorizedString.new('Added').light_green} template '#{data[:source]}' with " \
93
+ "params '#{@options}' to destination '#{data[:destination]}'"
94
94
  end
95
95
  end
96
96
  end
@@ -118,10 +118,8 @@ module Howitzer
118
118
  end
119
119
 
120
120
  def write_template(dest_path, source_path)
121
- File.open(dest_path, 'w+') do |f|
122
- f.write(ERB.new(File.open(source_path, 'r').read, nil, '-')
123
- .result(OpenStruct.new(@options).instance_eval { binding }))
124
- end
121
+ File.write(dest_path, ERB.new(File.read(source_path), trim_mode: '-')
122
+ .result(OpenStruct.new(@options).instance_eval { binding })) # rubocop:disable Style/OpenStructUse
125
123
  end
126
124
 
127
125
  private
@@ -170,7 +168,7 @@ module Howitzer
170
168
  when 'y'
171
169
  FileUtils.cp(source, destination)
172
170
  puts_info(" #{ColorizedString.new('Forced').light_green} '#{data[:destination]}' file")
173
- when 'n' then
171
+ when 'n'
174
172
  puts_info(" #{ColorizedString.new('Skipped').light_black} '#{data[:destination]}' file")
175
173
  else nil
176
174
  end
@@ -12,13 +12,12 @@ module Howitzer
12
12
  { source: 'drivers/browserstack.rb', destination: 'config/drivers/browserstack.rb' },
13
13
  { source: 'drivers/crossbrowsertesting.rb', destination: 'config/drivers/crossbrowsertesting.rb' },
14
14
  { source: 'drivers/headless_chrome.rb', destination: 'config/drivers/headless_chrome.rb' },
15
- { source: 'drivers/phantomjs.rb', destination: 'config/drivers/phantomjs.rb' },
16
- { source: 'drivers/poltergeist.rb', destination: 'config/drivers/poltergeist.rb' },
15
+ { source: 'drivers/headless_firefox.rb', destination: 'config/drivers/headless_firefox.rb' },
16
+ { source: 'drivers/lambdatest.rb', destination: 'config/drivers/lambdatest.rb' },
17
17
  { source: 'drivers/sauce.rb', destination: 'config/drivers/sauce.rb' },
18
18
  { source: 'drivers/selenium.rb', destination: 'config/drivers/selenium.rb' },
19
19
  { source: 'drivers/selenium_grid.rb', destination: 'config/drivers/selenium_grid.rb' },
20
- { source: 'drivers/testingbot.rb', destination: 'config/drivers/testingbot.rb' },
21
- { source: 'drivers/webkit.rb', destination: 'config/drivers/webkit.rb' }
20
+ { source: 'drivers/testingbot.rb', destination: 'config/drivers/testingbot.rb' }
22
21
  ] }
23
22
  end
24
23
 
@@ -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',
@@ -11,4 +11,4 @@ Dir[
11
11
  './prerequisites/factory_bot.rb'
12
12
  ].each { |f| require f }
13
13
 
14
- String.send(:include, Howitzer::Utils::StringExtensions)
14
+ String.include Howitzer::Utils::StringExtensions
@@ -1,19 +1,18 @@
1
1
  HOWITZER_KNOWN_DRIVERS = %i[
2
2
  selenium
3
3
  selenium_grid
4
- webkit
5
- poltergeist
6
- phantomjs
7
4
  sauce
8
5
  testingbot
9
6
  browserstack
10
7
  crossbrowsertesting
8
+ lambdatest
11
9
  headless_chrome
10
+ headless_firefox
12
11
  ].freeze
13
12
 
14
13
  unless HOWITZER_KNOWN_DRIVERS.include?(Howitzer.driver.to_s.to_sym)
15
- raise Howitzer::UnknownDriverError, "Unknown '#{Howitzer.driver}' driver." \
16
- " Check your settings, it should be one of #{HOWITZER_KNOWN_DRIVERS}"
14
+ raise Howitzer::UnknownDriverError, "Unknown '#{Howitzer.driver}' driver. " \
15
+ "Check your settings, it should be one of #{HOWITZER_KNOWN_DRIVERS}"
17
16
  end
18
17
 
19
18
  Capybara.configure do |config|
@@ -21,26 +21,31 @@
21
21
  page_load_idle_timeout: 20
22
22
  maximized_window: true # Specify maximized browser window size
23
23
 
24
- # Specify one of the following drivers: selenium, selenium_grid, webkit, poltergeist, phantomjs, sauce,
25
- # testingbot, browserstack, crossbrowsertesting, headless_chrome
26
- driver: phantomjs
24
+ # Run scenarios in the order they were 'defined' (default).
25
+ # 'random' - shuffle scenarios before running.
26
+ # Specify SEED to reproduce the shuffling from a previous run. e.g. 'random:5738'
27
+ test_order: defined
28
+
29
+ # Specify one of the following drivers: selenium, selenium_grid, sauce,
30
+ # testingbot, browserstack, crossbrowsertesting, lambdatest, headless_chrome,
31
+ # headless_firefox
32
+ driver: headless_chrome
27
33
 
28
34
  # -Selenium-
29
35
  # specify one of next browsers: iexplore (ie), firefox (ff), chrome, safari
30
36
  selenium_browser: ff
31
37
 
32
38
  # -Headless Chrome-
33
- # List of available flags (http://peter.sh/experiments/chromium-command-line-switches/)
39
+ # List of available flags (https://peter.sh/experiments/chromium-command-line-switches/)
34
40
  headless_chrome_flags: "window-size=1920x1080, disable-gpu"
35
41
 
42
+ # -Headless Firefox-
43
+ # For use custom screen size "maximized_window" should be false
44
+ headless_firefox_flags: "-height=1920, -width=1080"
45
+
36
46
  # -Selenium Grid-
37
47
  selenium_hub_url: "http://example.com:4444/wd/hub"
38
48
 
39
- # -PhantomJS/Poltergeist-
40
- # specify settings for poltergeist
41
- phantom_ignore_js_errors: false
42
- phantom_ignore_ssl_errors: true
43
-
44
49
  rspec_wait_timeout: 10
45
50
 
46
51
  ###########################################################
@@ -50,7 +55,7 @@
50
55
  cloud_auth_pass: api_key_or_api_secret_or_access_key
51
56
  cloud_platform: any
52
57
  cloud_browser_name: Chrome
53
- cloud_browser_version: '31'
58
+ cloud_browser_version: 'latest'
54
59
  cloud_max_duration: '1800'
55
60
  cloud_http_idle_timeout: 40
56
61
 
@@ -77,6 +82,11 @@
77
82
  cloud_cbt_record_video: 'true'
78
83
  cloud_cbt_record_network: 'true'
79
84
 
85
+ # -LambdaTest (https://www.lambdatest.com/support/docs/selenium-automation-capabilities)
86
+ cloud_lambdatest_resolution: '1024x768'
87
+ cloud_lambdatest_project: 'Howitzer Example'
88
+ cloud_lambdatest_build: 'v1'
89
+
80
90
  ###########################################################
81
91
  # CAPYBARA SETTINGS #
82
92
  ###########################################################
@@ -99,7 +109,7 @@
99
109
  mail_wait_time: 60
100
110
  mail_sleep_time: 3
101
111
 
102
- # -Mailgun- (http://www.mailgun.com/)
112
+ # -Mailgun- (https://mailgun.com/)
103
113
  mailgun_key: mailgun_account_private_key
104
114
  mailgun_domain: mailgun_domain_with_stored_method
105
115
 
@@ -1,10 +1,32 @@
1
- Capybara.register_driver :browserstack do |app|
1
+ def w3c_selenium_browserstack_caps # rubocop:disable Metrics/AbcSize
2
+ caps = CapybaraHelpers.required_w3c_cloud_caps
3
+ bstack_options = {
4
+ sessionName: "#{(Howitzer.current_rake_task || 'ALL').upcase} #{Howitzer.cloud_browser_name}",
5
+ projectName: Howitzer.cloud_bstack_project,
6
+ buildName: Howitzer.cloud_bstack_build
7
+ }
8
+ bstack_options['resolution'] = Howitzer.cloud_bstack_resolution if Howitzer.cloud_bstack_resolution.present?
9
+ bstack_options['os'] = Howitzer.cloud_bstack_os if Howitzer.cloud_bstack_os.present?
10
+ caps['bstack:options'] = bstack_options
11
+ if Howitzer.user_agent.present?
12
+ if CapybaraHelpers.chrome_browser?
13
+ caps['goog:chromeOptions'] = { 'args' => ["--user-agent=#{Howitzer.user_agent}"] }
14
+ elsif CapybaraHelpers.ff_browser?
15
+ profile = Selenium::WebDriver::Firefox::Profile.new
16
+ profile['general.useragent.override'] = Howitzer.user_agent
17
+ caps['moz:firefoxOptions'] = { profile: profile.as_json['zip'] }
18
+ end
19
+ end
20
+ caps
21
+ end
22
+
23
+ def classic_selenium_browserstack_caps # rubocop:disable Metrics/AbcSize
2
24
  caps = CapybaraHelpers.required_cloud_caps.merge(
3
25
  project: Howitzer.cloud_bstack_project,
4
26
  build: Howitzer.cloud_bstack_build
5
27
  )
6
- caps[:resolution] = Howitzer.cloud_bstack_resolution if Howitzer.cloud_bstack_resolution.present?
7
- caps[:device] = Howitzer.cloud_bstack_mobile_device if Howitzer.cloud_bstack_mobile_device.present?
28
+ caps['resolution'] = Howitzer.cloud_bstack_resolution if Howitzer.cloud_bstack_resolution.present?
29
+ caps['os'] = Howitzer.cloud_bstack_os if Howitzer.cloud_bstack_os.present?
8
30
  if Howitzer.user_agent.present?
9
31
  if CapybaraHelpers.chrome_browser?
10
32
  caps['chromeOptions'] = { 'args' => ["--user-agent=#{Howitzer.user_agent}"] }
@@ -14,7 +36,12 @@ Capybara.register_driver :browserstack do |app|
14
36
  caps[:firefox_profile] = profile
15
37
  end
16
38
  end
17
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.browserstack.com/wd/hub"
39
+ caps
40
+ end
41
+
42
+ Capybara.register_driver :browserstack do |app|
43
+ url = "https://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.browserstack.com/wd/hub"
44
+ caps = CapybaraHelpers.w3c_selenium? ? w3c_selenium_browserstack_caps : classic_selenium_browserstack_caps
18
45
  CapybaraHelpers.cloud_driver(app, caps, url)
19
46
  end
20
47
 
@@ -1,15 +1,15 @@
1
1
  # :crossbrowsertesting driver
2
2
 
3
3
  Capybara.register_driver :crossbrowsertesting do |app|
4
- caps = {}
5
- caps['name'] = Howitzer.cloud_cbt_name
6
- caps['build'] = Howitzer.cloud_cbt_build
7
- caps['browser_api_name'] = Howitzer.cloud_browser_name + Howitzer.cloud_browser_version.to_s
8
- caps['os_api_name'] = Howitzer.cloud_cbt_os_api_name
9
- caps['screen_resolution'] = Howitzer.cloud_cbt_screen_resolution
10
- caps['record_video'] = Howitzer.cloud_cbt_record_video
11
- caps['record_network'] = Howitzer.cloud_cbt_record_network
12
- caps['max_duration'] = Howitzer.cloud_max_duration
4
+ url = "https://#{CGI.escape(Howitzer.cloud_auth_login)}:#{Howitzer.cloud_auth_pass}" \
5
+ '@hub.crossbrowsertesting.com/wd/hub'
6
+ caps = CapybaraHelpers.required_cloud_caps.merge(
7
+ build: Howitzer.cloud_cbt_build,
8
+ screenResolution: Howitzer.cloud_cbt_screen_resolution,
9
+ record_video: Howitzer.cloud_cbt_record_video,
10
+ record_network: Howitzer.cloud_cbt_record_network,
11
+ max_duration: Howitzer.cloud_max_duration
12
+ )
13
13
  if Howitzer.user_agent.present?
14
14
  if CapybaraHelpers.chrome_browser?
15
15
  caps['chromeOptions'] = { 'args' => ["--user-agent=#{Howitzer.user_agent}"] }
@@ -19,8 +19,6 @@ 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}"\
23
- '@hub.crossbrowsertesting.com/wd/hub'
24
22
  CapybaraHelpers.cloud_driver(app, caps, url)
25
23
  end
26
24
 
@@ -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
@@ -0,0 +1,23 @@
1
+ # :headless_firefox driver
2
+
3
+ Capybara.register_driver :headless_firefox do |app|
4
+ startup_flags = ['--headless']
5
+ startup_flags.concat(Howitzer.headless_firefox_flags.split(/\s*,\s*/)) if Howitzer.headless_firefox_flags
6
+ ff_profile = Selenium::WebDriver::Firefox::Profile.new.tap do |profile|
7
+ profile['network.http.phishy-userpass-length'] = 255
8
+ profile['browser.safebrowsing.malware.enabled'] = false
9
+ profile['network.automatic-ntlm-auth.allow-non-fqdn'] = true
10
+ profile['network.ntlm.send-lm-response'] = true
11
+ profile['network.automatic-ntlm-auth.trusted-uris'] = Howitzer.app_host
12
+ profile['general.useragent.override'] = Howitzer.user_agent if Howitzer.user_agent.present?
13
+ end
14
+ options = Selenium::WebDriver::Firefox::Options.new(args: startup_flags, profile: ff_profile)
15
+ params = { browser: :firefox, options: options }
16
+ Capybara::Selenium::Driver.new app, **params
17
+ end
18
+
19
+ Capybara.javascript_driver = :headless_firefox
20
+
21
+ Capybara::Screenshot.class_eval do
22
+ register_driver :headless_firefox, &registered_drivers[:selenium]
23
+ end
@@ -0,0 +1,30 @@
1
+ def w3c_selenium_lambdatest_caps
2
+ caps = CapybaraHelpers.required_w3c_cloud_caps
3
+ lt_options = {
4
+ name: "#{(Howitzer.current_rake_task || 'ALL').upcase} #{Howitzer.cloud_browser_name}",
5
+ build: Howitzer.cloud_lambdatest_build
6
+ }
7
+ lt_options[:platformName] = Howitzer.cloud_platform unless Howitzer.cloud_platform.casecmp?('any')
8
+ lt_options[:resolution] = Howitzer.cloud_lambdatest_resolution if Howitzer.cloud_lambdatest_resolution.present?
9
+ caps['LT:Options'] = lt_options
10
+ caps
11
+ end
12
+
13
+ def classic_selenium_lambdatest_caps
14
+ caps = CapybaraHelpers.required_cloud_caps.merge(
15
+ build: Howitzer.cloud_lambdatest_build,
16
+ acceptSslCerts: true
17
+ )
18
+ caps[:resolution] = Howitzer.cloud_lambdatest_resolution if Howitzer.cloud_lambdatest_resolution.present?
19
+ caps
20
+ end
21
+
22
+ Capybara.register_driver :lambdatest do |app|
23
+ url = "https://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.lambdatest.com/wd/hub"
24
+ caps = CapybaraHelpers.w3c_selenium? ? w3c_selenium_lambdatest_caps : classic_selenium_lambdatest_caps
25
+ CapybaraHelpers.cloud_driver(app, caps, url)
26
+ end
27
+
28
+ Capybara::Screenshot.class_eval do
29
+ register_driver :lambdatest, &registered_drivers[:selenium]
30
+ end
@@ -1,6 +1,29 @@
1
1
  # :sauce driver
2
2
 
3
- Capybara.register_driver :sauce do |app|
3
+ def w3c_selenium_browserstack_caps # rubocop:disable Metrics/AbcSize
4
+ caps = CapybaraHelpers.required_w3c_cloud_caps
5
+ caps['platform'] = Howitzer.cloud_platform unless Howitzer.cloud_platform.casecmp?('any')
6
+ sauce_options = {
7
+ name: "#{(Howitzer.current_rake_task || 'ALL').upcase} #{Howitzer.cloud_browser_name}",
8
+ maxDuration: Howitzer.cloud_max_duration,
9
+ idleTimeout: Howitzer.cloud_sauce_idle_timeout,
10
+ recordScreenshots: Howitzer.cloud_sauce_record_screenshots,
11
+ videoUploadOnPass: Howitzer.cloud_sauce_video_upload_on_pass
12
+ }
13
+ caps['sauce:options'] = sauce_options
14
+ if Howitzer.user_agent.present?
15
+ if CapybaraHelpers.chrome_browser?
16
+ caps['goog:chromeOptions'] = { 'args' => ["--user-agent=#{Howitzer.user_agent}"] }
17
+ elsif CapybaraHelpers.ff_browser?
18
+ profile = Selenium::WebDriver::Firefox::Profile.new
19
+ profile['general.useragent.override'] = Howitzer.user_agent
20
+ caps['moz:firefoxOptions'] = { profile: profile.as_json['zip'] }
21
+ end
22
+ end
23
+ caps
24
+ end
25
+
26
+ def classic_selenium_browserstack_caps # rubocop:disable Metrics/AbcSize
4
27
  caps = CapybaraHelpers.required_cloud_caps.merge(
5
28
  maxDuration: Howitzer.cloud_max_duration,
6
29
  idleTimeout: Howitzer.cloud_sauce_idle_timeout,
@@ -16,7 +39,12 @@ Capybara.register_driver :sauce do |app|
16
39
  caps[:firefox_profile] = profile
17
40
  end
18
41
  end
19
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@ondemand.saucelabs.com:80/wd/hub"
42
+ caps
43
+ end
44
+
45
+ Capybara.register_driver :sauce do |app|
46
+ url = "https://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@ondemand.saucelabs.com/wd/hub"
47
+ caps = CapybaraHelpers.w3c_selenium? ? w3c_selenium_browserstack_caps : classic_selenium_browserstack_caps
20
48
  CapybaraHelpers.cloud_driver(app, caps, url)
21
49
  end
22
50
 
@@ -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
@@ -10,9 +10,9 @@ Capybara.register_driver :selenium_grid do |app|
10
10
  elsif CapybaraHelpers.safari_browser?
11
11
  Selenium::WebDriver::Remote::Capabilities.safari
12
12
  else
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]'
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]'
16
16
  end
17
17
  if Howitzer.user_agent.present?
18
18
  if CapybaraHelpers.chrome_browser?
@@ -1,6 +1,28 @@
1
1
  # :testingbot driver
2
2
 
3
- Capybara.register_driver :testingbot do |app|
3
+ def w3c_selenium_browserstack_caps # rubocop:disable Metrics/AbcSize
4
+ caps = CapybaraHelpers.required_w3c_cloud_caps
5
+ caps[:platformName] = Howitzer.cloud_platform unless Howitzer.cloud_platform.casecmp?('any')
6
+ tb_options = {
7
+ name: "#{(Howitzer.current_rake_task || 'ALL').upcase} #{Howitzer.cloud_browser_name}",
8
+ maxduration: Howitzer.cloud_max_duration,
9
+ idletimeout: Howitzer.cloud_testingbot_idle_timeout,
10
+ screenshot: Howitzer.cloud_testingbot_screenshots
11
+ }
12
+ caps['tb:options'] = tb_options
13
+ if Howitzer.user_agent.present?
14
+ if CapybaraHelpers.chrome_browser?
15
+ caps['goog:chromeOptions'] = { 'args' => ["--user-agent=#{Howitzer.user_agent}"] }
16
+ elsif CapybaraHelpers.ff_browser?
17
+ profile = Selenium::WebDriver::Firefox::Profile.new
18
+ profile['general.useragent.override'] = Howitzer.user_agent
19
+ caps['moz:firefoxOptions'] = { profile: profile.as_json['zip'] }
20
+ end
21
+ end
22
+ caps
23
+ end
24
+
25
+ def classic_selenium_browserstack_caps
4
26
  caps = CapybaraHelpers.required_cloud_caps.merge(
5
27
  maxduration: Howitzer.cloud_max_duration,
6
28
  idletimeout: Howitzer.cloud_testingbot_idle_timeout,
@@ -15,7 +37,12 @@ Capybara.register_driver :testingbot do |app|
15
37
  caps[:firefox_profile] = profile
16
38
  end
17
39
  end
18
- url = "http://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.testingbot.com/wd/hub"
40
+ caps
41
+ end
42
+
43
+ Capybara.register_driver :testingbot do |app|
44
+ url = "https://#{Howitzer.cloud_auth_login}:#{Howitzer.cloud_auth_pass}@hub.testingbot.com/wd/hub"
45
+ caps = CapybaraHelpers.w3c_selenium? ? w3c_selenium_browserstack_caps : classic_selenium_browserstack_caps
19
46
  CapybaraHelpers.cloud_driver(app, caps, url)
20
47
  end
21
48
 
@@ -1,11 +1,11 @@
1
1
  require 'cuke_sniffer'
2
2
 
3
3
  def path_to_features
4
- @_path_to_features ||= File.expand_path(File.join(__dir__, '..', 'features'))
4
+ @path_to_features ||= File.expand_path(File.join(__dir__, '..', 'features'))
5
5
  end
6
6
 
7
7
  def cuke_sniffer
8
- @_cuke_sniffer ||= CukeSniffer::CLI.new(
8
+ @cuke_sniffer ||= CukeSniffer::CLI.new(
9
9
  features_location: path_to_features,
10
10
  step_definitions_location: File.join(path_to_features, 'step_definitions'),
11
11
  hooks_location: File.join(path_to_features, 'support'),
@@ -10,6 +10,14 @@ RSpec.configure do |config|
10
10
  config.disable_monkey_patching!
11
11
  end
12
12
 
13
+ AfterConfiguration do |config|
14
+ if Howitzer.test_order.present?
15
+ order, seed = Howitzer.test_order.split(':')
16
+ config.instance_variable_get(:@options)[:order] = order
17
+ config.instance_variable_get(:@options)[:seed] ||= seed
18
+ end
19
+ end
20
+
13
21
  FileUtils.mkdir_p(Howitzer.log_dir)
14
22
 
15
23
  Howitzer::Log.settings_as_formatted_text