ruby_raider 1.1.4 → 2.0.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.
- checksums.yaml +4 -4
- data/.github/workflows/integration.yml +4 -6
- data/.github/workflows/reek.yml +6 -5
- data/.github/workflows/release.yml +175 -0
- data/.github/workflows/rubocop.yml +7 -6
- data/.github/workflows/system_tests.yml +83 -0
- data/.gitignore +1 -1
- data/.rubocop.yml +24 -0
- data/README.md +3 -1
- data/RELEASE.md +412 -0
- data/RELEASE_QUICK_GUIDE.md +77 -0
- data/bin/release +186 -0
- data/lib/adopter/adopt_menu.rb +150 -0
- data/lib/adopter/converters/base_converter.rb +85 -0
- data/lib/adopter/converters/identity_converter.rb +56 -0
- data/lib/adopter/migration_plan.rb +75 -0
- data/lib/adopter/migrator.rb +96 -0
- data/lib/adopter/plan_builder.rb +278 -0
- data/lib/adopter/project_analyzer.rb +256 -0
- data/lib/adopter/project_detector.rb +159 -0
- data/lib/commands/adopt_commands.rb +43 -0
- data/lib/generators/automation/templates/account.tt +9 -5
- data/lib/generators/automation/templates/appium_caps.tt +60 -6
- data/lib/generators/automation/templates/home.tt +4 -4
- data/lib/generators/automation/templates/login.tt +61 -4
- data/lib/generators/automation/templates/page.tt +13 -7
- data/lib/generators/automation/templates/partials/home_page_selector.tt +4 -4
- data/lib/generators/automation/templates/partials/initialize_selector.tt +3 -1
- data/lib/generators/automation/templates/partials/pdp_page_selector.tt +4 -4
- data/lib/generators/automation/templates/partials/visit_method.tt +11 -1
- data/lib/generators/automation/templates/pdp.tt +1 -1
- data/lib/generators/cucumber/templates/env.tt +6 -4
- data/lib/generators/cucumber/templates/partials/capybara_env.tt +20 -0
- data/lib/generators/cucumber/templates/partials/capybara_world.tt +6 -0
- data/lib/generators/cucumber/templates/partials/mobile_steps.tt +2 -2
- data/lib/generators/cucumber/templates/partials/web_steps.tt +4 -3
- data/lib/generators/cucumber/templates/steps.tt +2 -2
- data/lib/generators/cucumber/templates/world.tt +5 -3
- data/lib/generators/generator.rb +14 -2
- data/lib/generators/helper_generator.rb +16 -3
- data/lib/generators/infrastructure/github_generator.rb +6 -0
- data/lib/generators/infrastructure/templates/github.tt +11 -7
- data/lib/generators/infrastructure/templates/github_appium.tt +108 -0
- data/lib/generators/infrastructure/templates/gitlab.tt +5 -2
- data/lib/generators/invoke_generators.rb +1 -0
- data/lib/generators/menu_generator.rb +2 -0
- data/lib/generators/minitest/minitest_generator.rb +23 -0
- data/lib/generators/minitest/templates/test.tt +93 -0
- data/lib/generators/rspec/templates/spec.tt +12 -10
- data/lib/generators/template_renderer/partial_cache.rb +116 -0
- data/lib/generators/template_renderer/partial_resolver.rb +103 -0
- data/lib/generators/template_renderer/template_error.rb +50 -0
- data/lib/generators/template_renderer.rb +90 -0
- data/lib/generators/templates/common/config.tt +2 -2
- data/lib/generators/templates/common/gemfile.tt +15 -3
- data/lib/generators/templates/common/partials/web_config.tt +1 -1
- data/lib/generators/templates/common/read_me.tt +3 -1
- data/lib/generators/templates/helpers/allure_helper.tt +2 -2
- data/lib/generators/templates/helpers/browser_helper.tt +1 -0
- data/lib/generators/templates/helpers/capybara_helper.tt +28 -0
- data/lib/generators/templates/helpers/driver_helper.tt +1 -1
- data/lib/generators/templates/helpers/partials/allure_imports.tt +3 -1
- data/lib/generators/templates/helpers/partials/allure_requirements.tt +3 -1
- data/lib/generators/templates/helpers/partials/appium_driver.tt +46 -0
- data/lib/generators/templates/helpers/partials/axe_driver.tt +10 -0
- data/lib/generators/templates/helpers/partials/browserstack_config.tt +13 -0
- data/lib/generators/templates/helpers/partials/driver_and_options.tt +6 -114
- data/lib/generators/templates/helpers/partials/quit_driver.tt +3 -1
- data/lib/generators/templates/helpers/partials/screenshot.tt +3 -1
- data/lib/generators/templates/helpers/partials/selenium_driver.tt +25 -0
- data/lib/generators/templates/helpers/spec_helper.tt +17 -4
- data/lib/generators/templates/helpers/test_helper.tt +26 -0
- data/lib/generators/templates/helpers/visual_spec_helper.tt +1 -1
- data/lib/ruby_raider.rb +5 -0
- data/lib/version +1 -1
- data/spec/adopter/adopt_menu_spec.rb +176 -0
- data/spec/adopter/converters/identity_converter_spec.rb +145 -0
- data/spec/adopter/migration_plan_spec.rb +113 -0
- data/spec/adopter/migrator_spec.rb +277 -0
- data/spec/adopter/plan_builder_spec.rb +298 -0
- data/spec/adopter/project_analyzer_spec.rb +337 -0
- data/spec/adopter/project_detector_spec.rb +295 -0
- data/spec/generators/fixtures/templates/test.tt +1 -0
- data/spec/generators/fixtures/templates/test_partial.tt +1 -0
- data/spec/generators/template_renderer_spec.rb +298 -0
- data/spec/integration/commands/scaffolding_commands_spec.rb +2 -2
- data/spec/integration/commands/utility_commands_spec.rb +2 -2
- data/spec/integration/end_to_end_spec.rb +325 -0
- data/spec/integration/generators/automation_generator_spec.rb +11 -11
- data/spec/integration/generators/common_generator_spec.rb +40 -40
- data/spec/integration/generators/cucumber_generator_spec.rb +7 -7
- data/spec/integration/generators/github_generator_spec.rb +8 -8
- data/spec/integration/generators/gitlab_generator_spec.rb +8 -8
- data/spec/integration/generators/helpers_generator_spec.rb +73 -35
- data/spec/integration/generators/minitest_generator_spec.rb +70 -0
- data/spec/integration/generators/rspec_generator_spec.rb +7 -7
- data/spec/integration/settings_helper.rb +1 -1
- data/spec/integration/spec_helper.rb +20 -2
- data/spec/system/capybara_spec.rb +42 -0
- data/spec/system/selenium_spec.rb +19 -17
- data/spec/system/support/system_test_helper.rb +35 -0
- data/spec/system/watir_spec.rb +19 -17
- metadata +46 -16
- data/.github/workflows/push_gem.yml +0 -37
- data/.github/workflows/selenium.yml +0 -22
- data/.github/workflows/watir.yml +0 -22
- data/lib/generators/automation/templates/partials/android_caps.tt +0 -17
- data/lib/generators/automation/templates/partials/cross_platform_caps.tt +0 -25
- data/lib/generators/automation/templates/partials/ios_caps.tt +0 -18
- data/lib/generators/automation/templates/partials/selenium_account.tt +0 -9
- data/lib/generators/automation/templates/partials/selenium_login.tt +0 -34
- data/lib/generators/automation/templates/partials/watir_account.tt +0 -7
- data/lib/generators/automation/templates/partials/watir_login.tt +0 -32
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'template_renderer/partial_cache'
|
|
4
|
+
require_relative 'template_renderer/partial_resolver'
|
|
5
|
+
require_relative 'template_renderer/template_error'
|
|
6
|
+
|
|
7
|
+
# Template rendering module for Ruby Raider generators
|
|
8
|
+
#
|
|
9
|
+
# Provides a clean partial() helper for including ERB templates with:
|
|
10
|
+
# - Automatic caching of compiled ERB objects (10x performance improvement)
|
|
11
|
+
# - Context-aware path resolution (relative to caller, then all source_paths)
|
|
12
|
+
# - Helpful error messages when partials are missing
|
|
13
|
+
# - Flexible whitespace handling (trim_mode, strip options)
|
|
14
|
+
#
|
|
15
|
+
# Usage in templates:
|
|
16
|
+
# <%= partial('screenshot') %> # Default: trim_mode: '-', no strip
|
|
17
|
+
# <%= partial('screenshot', strip: true) %> # With .strip!
|
|
18
|
+
# <%= partial('screenshot', trim: false) %> # No trim_mode
|
|
19
|
+
# <%= partial('driver_config', trim_mode: '<>') %> # Custom trim_mode
|
|
20
|
+
#
|
|
21
|
+
# The partial() method automatically has access to all generator instance
|
|
22
|
+
# variables and methods (cucumber?, mobile?, selenium?, etc.) through binding.
|
|
23
|
+
module TemplateRenderer
|
|
24
|
+
# Render a partial template with caching and smart path resolution
|
|
25
|
+
#
|
|
26
|
+
# @param name [String] Partial name without .tt extension (e.g., 'screenshot')
|
|
27
|
+
# @param options [Hash] Rendering options
|
|
28
|
+
# @option options [String, nil] :trim_mode ERB trim mode (default: '-')
|
|
29
|
+
# - '-' : Trim lines ending with -%>
|
|
30
|
+
# - '<>' : Omit newlines for lines starting with <% and ending with %>
|
|
31
|
+
# - nil : No trimming
|
|
32
|
+
# @option options [Boolean] :strip Whether to call .strip! on result (default: false)
|
|
33
|
+
# @option options [Boolean] :trim Whether to use trim_mode (default: true)
|
|
34
|
+
#
|
|
35
|
+
# @return [String] Rendered template content
|
|
36
|
+
#
|
|
37
|
+
# @example Basic usage
|
|
38
|
+
# <%= partial('screenshot') %>
|
|
39
|
+
#
|
|
40
|
+
# @example With strip
|
|
41
|
+
# <%= partial('screenshot', strip: true) %>
|
|
42
|
+
#
|
|
43
|
+
# @example No trim mode
|
|
44
|
+
# <%= partial('quit_driver', trim: false) %>
|
|
45
|
+
#
|
|
46
|
+
# @raise [TemplateNotFoundError] If partial cannot be found
|
|
47
|
+
# @raise [TemplateRenderError] If rendering fails
|
|
48
|
+
def partial(name, options = {})
|
|
49
|
+
# Default options
|
|
50
|
+
options = {
|
|
51
|
+
trim_mode: '-',
|
|
52
|
+
strip: false,
|
|
53
|
+
trim: true
|
|
54
|
+
}.merge(options)
|
|
55
|
+
|
|
56
|
+
# Handle trim: false by setting trim_mode to nil
|
|
57
|
+
options[:trim_mode] = nil if options[:trim] == false
|
|
58
|
+
|
|
59
|
+
# Render the partial through the cache
|
|
60
|
+
result = self.class.template_renderer.render_partial(name, binding, options)
|
|
61
|
+
|
|
62
|
+
# Apply strip if requested
|
|
63
|
+
options[:strip] ? result.strip : result
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Module hook for including in classes
|
|
67
|
+
def self.included(base)
|
|
68
|
+
base.extend(ClassMethods)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Class methods added to the including class
|
|
72
|
+
module ClassMethods
|
|
73
|
+
# Get the shared template renderer instance
|
|
74
|
+
# Each generator class gets its own cache instance
|
|
75
|
+
def template_renderer
|
|
76
|
+
@template_renderer ||= PartialCache.new(self)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Clear the template cache (useful for testing)
|
|
80
|
+
def clear_template_cache
|
|
81
|
+
@template_renderer&.clear
|
|
82
|
+
@template_renderer = nil
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Get cache statistics (useful for debugging)
|
|
86
|
+
def template_cache_stats
|
|
87
|
+
@template_renderer&.stats || { size: 0, entries: [], memory_estimate: 0 }
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<% if mobile? -%>
|
|
2
|
-
<%=
|
|
2
|
+
<%= partial('mobile_config', trim: false) %>
|
|
3
3
|
<% else -%>
|
|
4
|
-
<%=
|
|
4
|
+
<%= partial('web_config') %>
|
|
5
5
|
<% end -%>
|
|
@@ -6,10 +6,16 @@ gem 'appium_lib'
|
|
|
6
6
|
gem 'appium_console'
|
|
7
7
|
<% end %>
|
|
8
8
|
<%- if cucumber? -%>
|
|
9
|
-
gem 'allure-cucumber', '2.
|
|
9
|
+
gem 'allure-cucumber', '2.28.0'
|
|
10
|
+
<%- elsif minitest? -%>
|
|
11
|
+
gem 'allure-ruby-commons', '2.28.0'
|
|
10
12
|
<%- else -%>
|
|
11
|
-
gem 'allure-rspec', '2.
|
|
12
|
-
gem 'allure-ruby-commons', '2.
|
|
13
|
+
gem 'allure-rspec', '2.28.0'
|
|
14
|
+
gem 'allure-ruby-commons', '2.28.0'
|
|
15
|
+
<%- end -%>
|
|
16
|
+
<%- if capybara? -%>
|
|
17
|
+
gem 'capybara'
|
|
18
|
+
gem 'selenium-webdriver'
|
|
13
19
|
<%- end -%>
|
|
14
20
|
<%- if axe? -%>
|
|
15
21
|
gem 'axe-core-rspec'
|
|
@@ -29,10 +35,16 @@ gem '<%= framework %>'
|
|
|
29
35
|
<%- if cucumber? -%>
|
|
30
36
|
gem 'rspec'
|
|
31
37
|
<%- end -%>
|
|
38
|
+
<%- if minitest? -%>
|
|
39
|
+
gem 'minitest-reporters'
|
|
40
|
+
<%- end -%>
|
|
32
41
|
gem 'rubocop'
|
|
33
42
|
<%- if rspec? -%>
|
|
34
43
|
gem 'rubocop-rspec'
|
|
35
44
|
<%- end -%>
|
|
45
|
+
<%- if minitest? -%>
|
|
46
|
+
gem 'rubocop-minitest'
|
|
47
|
+
<%- end -%>
|
|
36
48
|
gem 'ruby_raider', '~> 1.1.0'
|
|
37
49
|
<%- if selenium_based? %>
|
|
38
50
|
gem 'selenium-webdriver'
|
|
@@ -34,7 +34,9 @@ Ruby Raider is a generator and scaffolding gem to make UI test automation easier
|
|
|
34
34
|
| | | Cucumber and Appium Cross-platform | |
|
|
35
35
|
| | | Rspec and Appium Cross-platform | |
|
|
36
36
|
|
|
37
|
-
***
|
|
37
|
+
***The web tests run against the [Raider Test Store](https://raider-test-site.onrender.com/).***
|
|
38
|
+
|
|
39
|
+
***In order to run the Appium tests, download the example [app](https://github.com/RaiderHQ/raider_test_app).***
|
|
38
40
|
***Remember to use the full path of the app that you download in the capabilities file and start the server using one of
|
|
39
41
|
the commands below:***
|
|
40
42
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
<%=-
|
|
4
|
-
<%- allure =
|
|
3
|
+
<%=- partial('allure_requirements', trim: false, strip: true) -%>
|
|
4
|
+
<%- allure = partial('allure_imports', trim: false, strip: true) -%>
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
module AllureHelper
|
|
@@ -17,6 +17,7 @@ module BrowserHelper
|
|
|
17
17
|
|
|
18
18
|
def create_browser(*args)
|
|
19
19
|
args = args.empty? ? config['browser_arguments'][config['browser']] : args
|
|
20
|
+
args += ['--headless'] if ENV['HEADLESS'] && !args.include?('--headless')
|
|
20
21
|
Watir::Browser.new(config['browser'], options: { args: args })
|
|
21
22
|
end
|
|
22
23
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'capybara'
|
|
4
|
+
require 'capybara/dsl'
|
|
5
|
+
require 'selenium-webdriver'
|
|
6
|
+
require 'yaml'
|
|
7
|
+
|
|
8
|
+
module CapybaraHelper
|
|
9
|
+
def self.configure
|
|
10
|
+
config = YAML.load_file('config/config.yml')
|
|
11
|
+
|
|
12
|
+
Capybara.configure do |capybara_config|
|
|
13
|
+
capybara_config.default_driver = :selenium
|
|
14
|
+
capybara_config.javascript_driver = :selenium
|
|
15
|
+
capybara_config.app_host = config['url']
|
|
16
|
+
capybara_config.default_max_wait_time = 10
|
|
17
|
+
capybara_config.run_server = false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
Capybara.register_driver :selenium do |app|
|
|
21
|
+
browser = config['browser'].to_sym
|
|
22
|
+
args = config['browser_arguments'][config['browser']] || []
|
|
23
|
+
args += ['--headless'] if ENV['HEADLESS'] && !args.include?('--headless')
|
|
24
|
+
options = Selenium::WebDriver::Chrome::Options.new(args:)
|
|
25
|
+
Capybara::Selenium::Driver.new(app, browser:, options:)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
def create_driver
|
|
2
|
+
@driver = configure_driver
|
|
3
|
+
end
|
|
4
|
+
<%- if cross_platform? -%>
|
|
5
|
+
|
|
6
|
+
def platform
|
|
7
|
+
@platform ||= YAML.load_file('config/config.yml')['platform'].to_s
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def platform_caps
|
|
11
|
+
@platform_caps ||= YAML.load_file('config/capabilities.yml')[platform]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# :reek:UtilityFunction
|
|
15
|
+
def parsed_caps
|
|
16
|
+
platform_caps['appium:options']['app'] = parse_app_path(platform_caps['appium:options']['app'])
|
|
17
|
+
platform_caps
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def parse_app_path(path)
|
|
21
|
+
File.expand_path(path, Dir.pwd)
|
|
22
|
+
end
|
|
23
|
+
<%- else -%>
|
|
24
|
+
|
|
25
|
+
# :reek:UtilityFunction
|
|
26
|
+
def parsed_caps
|
|
27
|
+
caps = YAML.load_file('config/capabilities.yml')
|
|
28
|
+
caps['appium:options']['app'] = app_path(caps['appium:options']['app'])
|
|
29
|
+
caps
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def app_path(path)
|
|
33
|
+
File.expand_path(path, Dir.pwd)
|
|
34
|
+
end
|
|
35
|
+
<%- end -%>
|
|
36
|
+
|
|
37
|
+
<%= partial('browserstack_config', strip: true) %>
|
|
38
|
+
|
|
39
|
+
def configure_driver
|
|
40
|
+
if browserstack?
|
|
41
|
+
Appium::Driver.new({ caps: browserstack_caps,
|
|
42
|
+
'appium_lib': { server_url: parsed_browserstack_url}}, true)
|
|
43
|
+
else
|
|
44
|
+
Appium::Driver.new({ caps: parsed_caps })
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
def create_driver(browser, js_path, skip_iframes)
|
|
2
|
+
if ENV['HEADLESS']
|
|
3
|
+
options = Selenium::WebDriver::Chrome::Options.new(args: ['--headless'])
|
|
4
|
+
@driver = Selenium::WebDriver.for(browser, options:)
|
|
5
|
+
end
|
|
6
|
+
AxeSelenium.configure(@driver || browser) do |config|
|
|
7
|
+
config.jslib_path = js_path if js_path
|
|
8
|
+
config.skip_iframes = skip_iframes if skip_iframes
|
|
9
|
+
end.page
|
|
10
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
def browserstack?
|
|
2
|
+
ENV['TEST_ENV'] == 'browserstack'
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
def browserstack_caps
|
|
6
|
+
@browserstack_caps ||= YAML.load_file('config/capabilities.yml')['browserstack']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def parsed_browserstack_url
|
|
10
|
+
username = ENV['BROWSERSTACK_USER']
|
|
11
|
+
access_key = ENV['BROWSERSTACK_KEY']
|
|
12
|
+
"https://#{username}:#{access_key}@hub-cloud.browserstack.com/wd/hub"
|
|
13
|
+
end
|
|
@@ -1,115 +1,7 @@
|
|
|
1
1
|
<% if axe? -%>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
<% elsif selenium_based? -%>
|
|
9
|
-
def create_driver(*opts)
|
|
10
|
-
@config = YAML.load_file('config/config.yml')
|
|
11
|
-
browser = @config['browser']
|
|
12
|
-
Selenium::WebDriver.for(browser.to_sym, options: create_webdriver_options(*opts))
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def browser_arguments(*opts)
|
|
16
|
-
opts.empty? ? @config['browser_arguments'][@config['browser']] : opts
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def driver_options
|
|
20
|
-
@config['driver_options']
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# :reek:FeatureEnvy
|
|
24
|
-
def create_webdriver_options(*opts)
|
|
25
|
-
load_browser = @config['browser'].to_s
|
|
26
|
-
browser = load_browser == 'ie' ? load_browser.upcase : load_browser.capitalize
|
|
27
|
-
options = "Selenium::WebDriver::#{browser}::Options".constantize.new
|
|
28
|
-
browser_arguments(*opts).each { |arg| options.add_argument(arg) }
|
|
29
|
-
driver_options.each { |opt| options.add_option(opt.first, opt.last) }
|
|
30
|
-
options
|
|
31
|
-
end
|
|
32
|
-
<% elsif cross_platform? -%>
|
|
33
|
-
def create_driver
|
|
34
|
-
@driver = configure_driver
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def platform
|
|
38
|
-
@platform ||= YAML.load_file('config/config.yml')['platform'].to_s
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def platform_caps
|
|
42
|
-
@platform_caps ||= YAML.load_file('config/capabilities.yml')[platform]
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# :reek:UtilityFunction
|
|
46
|
-
def parsed_caps
|
|
47
|
-
platform_caps['appium:options']['app'] = parse_app_path(platform_caps['appium:options']['app'])
|
|
48
|
-
platform_caps
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def parse_app_path(path)
|
|
52
|
-
File.expand_path(path, Dir.pwd)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def browserstack?
|
|
56
|
-
ENV['TEST_ENV'] == 'browserstack'
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def browserstack_caps
|
|
60
|
-
@browserstack_caps ||= YAML.load_file('config/capabilities.yml')['browserstack']
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def configure_driver
|
|
64
|
-
if browserstack?
|
|
65
|
-
Appium::Driver.new({ caps: browserstack_caps,
|
|
66
|
-
'appium_lib': { server_url: parsed_browserstack_url}}, true)
|
|
67
|
-
else
|
|
68
|
-
Appium::Driver.new({ caps: parsed_caps })
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def parsed_browserstack_url
|
|
73
|
-
username = ENV['BROWSERSTACK_USER']
|
|
74
|
-
access_key = ENV['BROWSERSTACK_KEY']
|
|
75
|
-
"https://#{username}:#{access_key}@hub-cloud.browserstack.com/wd/hub"
|
|
76
|
-
end
|
|
77
|
-
<% else -%>
|
|
78
|
-
def create_driver
|
|
79
|
-
@driver = configure_driver
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
# :reek:UtilityFunction
|
|
83
|
-
def parsed_caps
|
|
84
|
-
caps = YAML.load_file('config/capabilities.yml')
|
|
85
|
-
caps['appium:options']['app'] = app_path(caps['appium:options']['app'])
|
|
86
|
-
caps
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def app_path(path)
|
|
90
|
-
File.expand_path(path, Dir.pwd)
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def browserstack?
|
|
94
|
-
ENV['TEST_ENV'] == 'browserstack'
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def browserstack_caps
|
|
98
|
-
@browserstack_caps ||= YAML.load_file('config/capabilities.yml')['browserstack']
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def configure_driver
|
|
102
|
-
if browserstack?
|
|
103
|
-
Appium::Driver.new({ caps: browserstack_caps,
|
|
104
|
-
'appium_lib': { server_url: parsed_browserstack_url}}, true)
|
|
105
|
-
else
|
|
106
|
-
Appium::Driver.new({ caps: parsed_caps })
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def parsed_browserstack_url
|
|
111
|
-
username = ENV['BROWSERSTACK_USER']
|
|
112
|
-
access_key = ENV['BROWSERSTACK_KEY']
|
|
113
|
-
"https://#{username}:#{access_key}@hub-cloud.browserstack.com/wd/hub"
|
|
114
|
-
end
|
|
115
|
-
<% end -%>
|
|
2
|
+
<%= partial('axe_driver', strip: true) %>
|
|
3
|
+
<%- elsif selenium_based? -%>
|
|
4
|
+
<%= partial('selenium_driver', strip: true) %>
|
|
5
|
+
<%- else -%>
|
|
6
|
+
<%= partial('appium_driver', strip: true) %>
|
|
7
|
+
<%- end -%>
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
<% if
|
|
1
|
+
<% if capybara? %>
|
|
2
|
+
screenshot = Capybara.page.save_screenshot("#{temp_folder}/#{example_name}.png")
|
|
3
|
+
<% elsif selenium_based? %>
|
|
2
4
|
screenshot = driver.save_screenshot("#{temp_folder}/#{example_name}.png")
|
|
3
5
|
<% elsif watir? %>
|
|
4
6
|
screenshot = browser.screenshot.save("#{temp_folder}/#{example_name}.png")
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
def create_driver(*opts)
|
|
2
|
+
@config = YAML.load_file('config/config.yml')
|
|
3
|
+
browser = @config['browser']
|
|
4
|
+
Selenium::WebDriver.for(browser.to_sym, options: create_webdriver_options(*opts))
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def browser_arguments(*opts)
|
|
8
|
+
args = opts.empty? ? @config['browser_arguments'][@config['browser']] : opts
|
|
9
|
+
args += ['--headless'] if ENV['HEADLESS'] && !args.include?('--headless')
|
|
10
|
+
args
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def driver_options
|
|
14
|
+
@config['driver_options']
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# :reek:FeatureEnvy
|
|
18
|
+
def create_webdriver_options(*opts)
|
|
19
|
+
load_browser = @config['browser'].to_s
|
|
20
|
+
browser = load_browser == 'ie' ? load_browser.upcase : load_browser.capitalize
|
|
21
|
+
options = "Selenium::WebDriver::#{browser}::Options".constantize.new
|
|
22
|
+
browser_arguments(*opts).each { |arg| options.add_argument(arg) }
|
|
23
|
+
driver_options.each { |opt| options.add_option(opt.first, opt.last) }
|
|
24
|
+
options
|
|
25
|
+
end
|
|
@@ -6,7 +6,9 @@ require 'axe-rspec'
|
|
|
6
6
|
require 'rspec'
|
|
7
7
|
require 'tmpdir'
|
|
8
8
|
require_relative 'allure_helper'
|
|
9
|
-
<%- if
|
|
9
|
+
<%- if capybara? -%>
|
|
10
|
+
require_relative 'capybara_helper'
|
|
11
|
+
<%- elsif watir? -%>
|
|
10
12
|
require_relative 'browser_helper'
|
|
11
13
|
<%- else -%>
|
|
12
14
|
require_relative 'driver_helper'
|
|
@@ -17,11 +19,22 @@ module SpecHelper
|
|
|
17
19
|
AllureHelper.configure
|
|
18
20
|
RSpec.configure do |config|
|
|
19
21
|
config.formatter = AllureHelper.formatter
|
|
20
|
-
|
|
22
|
+
<%- if capybara? -%>
|
|
23
|
+
config.include(Capybara::DSL)
|
|
24
|
+
CapybaraHelper.configure
|
|
25
|
+
<%- elsif watir? -%>
|
|
26
|
+
config.include(BrowserHelper)
|
|
27
|
+
<%- else -%>
|
|
28
|
+
config.include(DriverHelper)
|
|
29
|
+
<%- end -%>
|
|
21
30
|
<%- if mobile? -%>
|
|
22
31
|
config.before(:each) do
|
|
23
32
|
driver.start_driver
|
|
24
33
|
end
|
|
34
|
+
<%- elsif capybara? -%>
|
|
35
|
+
config.before(:each) do
|
|
36
|
+
Capybara.current_session.driver.browser.manage.window.maximize
|
|
37
|
+
end
|
|
25
38
|
<%- elsif selenium_based? -%>
|
|
26
39
|
config.before(:each) do
|
|
27
40
|
driver.manage.window.maximize
|
|
@@ -35,10 +48,10 @@ module SpecHelper
|
|
|
35
48
|
config.after(:each) do |example|
|
|
36
49
|
example_name = example.description
|
|
37
50
|
Dir.mktmpdir do |temp_folder|
|
|
38
|
-
<%=
|
|
51
|
+
<%= partial('screenshot', strip: true) %>
|
|
39
52
|
AllureHelper.add_screenshot(example_name, screenshot)
|
|
40
53
|
end
|
|
41
|
-
<%=
|
|
54
|
+
<%= partial('quit_driver', strip: true) %>
|
|
42
55
|
end
|
|
43
56
|
end
|
|
44
57
|
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
<%- if axe? %>
|
|
4
|
+
require 'axe-minitest'
|
|
5
|
+
<%- end -%>
|
|
6
|
+
require 'minitest/autorun'
|
|
7
|
+
require 'tmpdir'
|
|
8
|
+
require_relative 'allure_helper'
|
|
9
|
+
<%- if watir? -%>
|
|
10
|
+
require_relative 'browser_helper'
|
|
11
|
+
<%- elsif capybara? -%>
|
|
12
|
+
require_relative 'capybara_helper'
|
|
13
|
+
<%- else -%>
|
|
14
|
+
require_relative 'driver_helper'
|
|
15
|
+
<%- end -%>
|
|
16
|
+
|
|
17
|
+
AllureHelper.configure
|
|
18
|
+
<%- if capybara? -%>
|
|
19
|
+
CapybaraHelper.configure
|
|
20
|
+
<%- end -%>
|
|
21
|
+
|
|
22
|
+
module TestHelper
|
|
23
|
+
<% if watir? %>include BrowserHelper<% elsif capybara? %>include Capybara::DSL<% else %>include DriverHelper<% end %>
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
Minitest::Test.include(TestHelper)
|
|
@@ -22,7 +22,7 @@ module SpecHelper
|
|
|
22
22
|
config.after(:each) do |example|
|
|
23
23
|
example_name = example.description
|
|
24
24
|
Dir.mktmpdir do |temp_folder|
|
|
25
|
-
<%=
|
|
25
|
+
<%= partial('screenshot', strip: true) %>
|
|
26
26
|
AllureHelper.add_screenshot(example_name, screenshot)
|
|
27
27
|
end
|
|
28
28
|
@eyes.close
|
data/lib/ruby_raider.rb
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
require_relative '../lib/plugin/plugin'
|
|
4
4
|
require_relative '../lib/commands/plugin_commands'
|
|
5
5
|
require_relative '../lib/commands/loaded_commands'
|
|
6
|
+
require_relative '../lib/commands/adopt_commands'
|
|
6
7
|
require_relative '../lib/commands/scaffolding_commands'
|
|
7
8
|
require_relative '../lib/commands/utility_commands'
|
|
8
9
|
|
|
@@ -45,6 +46,10 @@ module RubyRaider
|
|
|
45
46
|
|
|
46
47
|
map 'v' => 'version'
|
|
47
48
|
|
|
49
|
+
desc 'adopt', 'Adopts an existing test project into Ruby Raider conventions'
|
|
50
|
+
subcommand 'adopt', AdoptCommands
|
|
51
|
+
map 'a' => 'adopt'
|
|
52
|
+
|
|
48
53
|
desc 'generate', 'Provides access to all the scaffolding commands'
|
|
49
54
|
subcommand 'generate', ScaffoldingCommands
|
|
50
55
|
map 'g' => 'generate'
|
data/lib/version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
2.0.0
|