testcentricity 3.0.4 → 3.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/lib/testcentricity/app_core/appium_connect_helper.rb +1 -0
- data/lib/testcentricity/app_core/screen_section.rb +0 -1
- data/lib/testcentricity/app_elements/app_element_helper.rb +1 -1
- data/lib/testcentricity/version.rb +1 -1
- metadata +5 -150
- data/.gitignore +0 -40
- data/.rspec +0 -4
- data/.rubocop.yml +0 -38
- data/.ruby-version +0 -1
- data/.simplecov +0 -9
- data/CODE_OF_CONDUCT.md +0 -13
- data/Gemfile +0 -6
- data/Rakefile +0 -63
- data/config/cucumber.yml +0 -146
- data/config/locales/en-US.yml +0 -56
- data/config/test_data/data.yml +0 -76
- data/features/deep_links.feature +0 -38
- data/features/login.feature +0 -30
- data/features/navigation.feature +0 -43
- data/features/step_definitions/generic_steps.rb +0 -67
- data/features/support/android/screens/about_screen.rb +0 -11
- data/features/support/android/screens/base_app_screen.rb +0 -31
- data/features/support/android/screens/biometrics_screen.rb +0 -17
- data/features/support/android/screens/checkout_address_screen.rb +0 -17
- data/features/support/android/screens/checkout_payment_screen.rb +0 -22
- data/features/support/android/screens/geo_location_screen.rb +0 -28
- data/features/support/android/screens/login_screen.rb +0 -18
- data/features/support/android/screens/product_item_screen.rb +0 -39
- data/features/support/android/screens/products_screen.rb +0 -27
- data/features/support/android/screens/qr_code_scanner_screen.rb +0 -15
- data/features/support/android/screens/saucebot_screen.rb +0 -16
- data/features/support/android/screens/webview_screen.rb +0 -13
- data/features/support/android/sections/list_items/product_list_item.rb +0 -13
- data/features/support/android/sections/nav_widgets/nav_menu.rb +0 -39
- data/features/support/data/product_data.rb +0 -27
- data/features/support/data/user_data.rb +0 -17
- data/features/support/env.rb +0 -62
- data/features/support/hooks.rb +0 -135
- data/features/support/ios/screens/about_screen.rb +0 -11
- data/features/support/ios/screens/base_app_screen.rb +0 -20
- data/features/support/ios/screens/biometrics_screen.rb +0 -17
- data/features/support/ios/screens/checkout_address_screen.rb +0 -17
- data/features/support/ios/screens/checkout_payment_screen.rb +0 -22
- data/features/support/ios/screens/geo_location_screen.rb +0 -32
- data/features/support/ios/screens/login_screen.rb +0 -18
- data/features/support/ios/screens/product_item_screen.rb +0 -39
- data/features/support/ios/screens/products_screen.rb +0 -27
- data/features/support/ios/screens/qr_code_scanner_screen.rb +0 -11
- data/features/support/ios/screens/saucebot_screen.rb +0 -16
- data/features/support/ios/screens/webview_screen.rb +0 -13
- data/features/support/ios/sections/list_items/product_list_item.rb +0 -13
- data/features/support/ios/sections/nav_widgets/nav_bar.rb +0 -31
- data/features/support/ios/sections/nav_widgets/nav_menu.rb +0 -41
- data/features/support/shared_components/screens/base_app_screen.rb +0 -35
- data/features/support/shared_components/screens/checkout_address_screen.rb +0 -17
- data/features/support/shared_components/screens/checkout_payment_screen.rb +0 -22
- data/features/support/shared_components/screens/login_screen.rb +0 -39
- data/features/support/shared_components/screens/saucebot_screen.rb +0 -17
- data/features/support/shared_components/screens/webview_screen.rb +0 -12
- data/features/support/shared_components/sections/nav_menu.rb +0 -58
- data/features/support/world_data.rb +0 -15
- data/features/support/world_pages.rb +0 -30
- data/reports/.keep +0 -1
- data/spec/fixtures/page_object.rb +0 -22
- data/spec/fixtures/page_section_object.rb +0 -21
- data/spec/fixtures/screen_object.rb +0 -16
- data/spec/fixtures/screen_section_object.rb +0 -16
- data/spec/spec_helper.rb +0 -33
- data/spec/testcentricity/elements/button_spec.rb +0 -18
- data/spec/testcentricity/elements/checkbox_spec.rb +0 -28
- data/spec/testcentricity/elements/image_spec.rb +0 -13
- data/spec/testcentricity/elements/label_spec.rb +0 -18
- data/spec/testcentricity/elements/list_spec.rb +0 -13
- data/spec/testcentricity/elements/ui_element_spec.rb +0 -72
- data/spec/testcentricity/mobile/appium_connect_spec.rb +0 -117
- data/spec/testcentricity/mobile/screen_object_spec.rb +0 -63
- data/spec/testcentricity/mobile/screen_section_object_spec.rb +0 -56
- data/spec/testcentricity/version_spec.rb +0 -7
- data/spec/testcentricity/web/browser_spec.rb +0 -41
- data/spec/testcentricity/web/local_webdriver_spec.rb +0 -86
- data/spec/testcentricity/web/mobile_webdriver_spec.rb +0 -123
- data/spec/testcentricity/web/page_object_spec.rb +0 -85
- data/spec/testcentricity/web/page_section_object_spec.rb +0 -72
- data/testcentricity.gemspec +0 -48
data/features/support/env.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'capybara/cucumber'
|
4
|
-
require 'parallel_tests'
|
5
|
-
require 'require_all'
|
6
|
-
require 'simplecov'
|
7
|
-
require 'testcentricity_web'
|
8
|
-
require 'testcentricity'
|
9
|
-
|
10
|
-
include TestCentricity
|
11
|
-
|
12
|
-
SimpleCov.command_name("Features-#{ENV['PLATFORM']}-#{Time.now.strftime('%Y%m%d%H%M%S%L')}")
|
13
|
-
|
14
|
-
require_relative 'world_data'
|
15
|
-
require_relative 'world_pages'
|
16
|
-
|
17
|
-
require_rel 'data'
|
18
|
-
require_rel 'shared_components'
|
19
|
-
|
20
|
-
# conditionally require page and section objects based on target platform
|
21
|
-
case ENV['PLATFORM'].downcase.to_sym
|
22
|
-
when :ios
|
23
|
-
require_rel 'ios'
|
24
|
-
when :android
|
25
|
-
require_rel 'android'
|
26
|
-
when :web
|
27
|
-
require_rel 'web'
|
28
|
-
else
|
29
|
-
raise "Platform unknown. Please specify the target test platform using '-p ios', '-p android', or '-p web' in the command line"
|
30
|
-
end
|
31
|
-
|
32
|
-
$LOAD_PATH << './lib'
|
33
|
-
|
34
|
-
# set the default locale and auto load all translations from config/locales/*.rb,yml.
|
35
|
-
ENV['LOCALE'] = 'en-US' unless ENV['LOCALE']
|
36
|
-
ENV['LANGUAGE'] = 'en' unless ENV['LANGUAGE']
|
37
|
-
I18n.load_path += Dir['config/locales/*.{rb,yml}']
|
38
|
-
I18n.default_locale = ENV['LOCALE']
|
39
|
-
I18n.locale = ENV['LOCALE']
|
40
|
-
Faker::Config.locale = ENV['LOCALE']
|
41
|
-
|
42
|
-
# instantiate all data objects and target test environment
|
43
|
-
include WorldData
|
44
|
-
environs.find_environ(ENV['TEST_ENVIRONMENT'], :yaml)
|
45
|
-
WorldData.instantiate_data_objects
|
46
|
-
|
47
|
-
# instantiate all page objects
|
48
|
-
include WorldPages
|
49
|
-
WorldPages.instantiate_page_objects
|
50
|
-
|
51
|
-
# connect to appropriate driver (WebDriver or Appium) based on target platform
|
52
|
-
case ENV['PLATFORM'].downcase.to_sym
|
53
|
-
when :web
|
54
|
-
# establish connection to WebDriver and target web browser
|
55
|
-
Webdrivers.cache_time = 86_400
|
56
|
-
WebDriverConnect.initialize_web_driver
|
57
|
-
when :ios, :android
|
58
|
-
AppiumConnect.initialize_appium
|
59
|
-
end
|
60
|
-
|
61
|
-
# set TestCentricity's default max wait time to 20 seconds
|
62
|
-
Environ.default_max_wait_time = 20
|
data/features/support/hooks.rb
DELETED
@@ -1,135 +0,0 @@
|
|
1
|
-
|
2
|
-
BeforeAll do
|
3
|
-
# start Appium Server if command line option was specified and target browser is mobile simulator or device
|
4
|
-
if ENV['APPIUM_SERVER'] == 'run' && Environ.driver == :appium
|
5
|
-
$server = TestCentricity::AppiumServer.new
|
6
|
-
$server.start
|
7
|
-
end
|
8
|
-
# connect to sim/device and install app
|
9
|
-
AppiumConnect.start_driver
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
AfterAll do
|
14
|
-
# quit Appium driver
|
15
|
-
TestCentricity::AppiumConnect.quit_driver
|
16
|
-
# terminate Appium Server if command line option was specified and target browser is mobile simulator or device
|
17
|
-
if ENV['APPIUM_SERVER'] == 'run' && Environ.driver == :appium && $server.running?
|
18
|
-
$server.stop
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
|
23
|
-
Before do |scenario|
|
24
|
-
# if executing tests in parallel concurrent threads, print thread number with scenario name
|
25
|
-
message = Environ.parallel ? "Thread ##{Environ.process_num} | Scenario: #{scenario.name}" : "Scenario: #{scenario.name}"
|
26
|
-
log message
|
27
|
-
$initialized ||= false
|
28
|
-
unless $initialized
|
29
|
-
$initialized = true
|
30
|
-
$test_start_time = Time.now
|
31
|
-
# HTML report header information if reporting is enabled
|
32
|
-
log Environ.report_header if ENV['REPORTING']
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
After do |scenario|
|
38
|
-
# process and embed any screenshots recorded during execution of scenario
|
39
|
-
process_embed_screenshots(scenario)
|
40
|
-
# clear out any queued screenshots
|
41
|
-
Environ.reset_contexts
|
42
|
-
# close app
|
43
|
-
TestCentricity::AppiumConnect.close_app
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
|
-
# exclusionary Around hooks to prevent running feature/scenario on unsupported browsers, devices, or
|
48
|
-
# cloud remote browser hosting platforms. Use the following tags to block test execution:
|
49
|
-
# mobile devices: @!ipad, @!iphone
|
50
|
-
|
51
|
-
|
52
|
-
# block feature/scenario execution if running against iPad mobile browser
|
53
|
-
Around('@!ipad') do |scenario, block|
|
54
|
-
qualify_device('ipad', scenario, block)
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
# block feature/scenario execution if running against iPhone mobile browser
|
59
|
-
Around('@!iphone') do |scenario, block|
|
60
|
-
qualify_device('iphone', scenario, block)
|
61
|
-
end
|
62
|
-
|
63
|
-
|
64
|
-
# block feature/scenario execution if running against a physical or emulated mobile device
|
65
|
-
Around('@!device') do |scenario, block|
|
66
|
-
if Environ.is_device?
|
67
|
-
log "Scenario '#{scenario.name}' cannot be executed on physical or emulated devices."
|
68
|
-
skip_this_scenario
|
69
|
-
else
|
70
|
-
block.call
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
|
75
|
-
Around('@!ios') do |scenario, block|
|
76
|
-
if Environ.device_os == :android
|
77
|
-
block.call
|
78
|
-
else
|
79
|
-
log "Scenario '#{scenario.name}' can not be executed on iOS devices."
|
80
|
-
skip_this_scenario
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
Around('@!android') do |scenario, block|
|
86
|
-
if Environ.device_os == :ios
|
87
|
-
block.call
|
88
|
-
else
|
89
|
-
log "Scenario '#{scenario.name}' can not be executed on Android devices."
|
90
|
-
skip_this_scenario
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
|
95
|
-
# supporting methods
|
96
|
-
|
97
|
-
def qualify_device(device, scenario, block)
|
98
|
-
if Environ.is_device?
|
99
|
-
if Environ.device_type.include? device
|
100
|
-
log "Scenario '#{scenario.name}' cannot be executed on #{device} devices."
|
101
|
-
skip_this_scenario
|
102
|
-
else
|
103
|
-
block.call
|
104
|
-
end
|
105
|
-
else
|
106
|
-
block.call
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def screen_shot_and_save_page(scenario)
|
111
|
-
timestamp = Time.now.strftime('%Y%m%d%H%M%S%L')
|
112
|
-
filename = scenario.nil? ? "Screenshot-#{timestamp}.png" : "Screenshot-#{scenario.__id__}-#{timestamp}.png"
|
113
|
-
path = File.join Dir.pwd, 'reports/screenshots/', filename
|
114
|
-
if Environ.driver == :appium
|
115
|
-
TestCentricity::AppiumConnect.take_screenshot(path)
|
116
|
-
else
|
117
|
-
save_screenshot path
|
118
|
-
end
|
119
|
-
log "Screenshot saved at #{path}"
|
120
|
-
screen_shot = { path: path, filename: filename }
|
121
|
-
Environ.save_screen_shot(screen_shot)
|
122
|
-
attach(path, 'image/png') unless scenario.nil?
|
123
|
-
end
|
124
|
-
|
125
|
-
def process_embed_screenshots(scenario)
|
126
|
-
screen_shots = Environ.get_screen_shots
|
127
|
-
if screen_shots.count > 0
|
128
|
-
screen_shots.each do |row|
|
129
|
-
path = row[:path]
|
130
|
-
attach(path, 'image/png')
|
131
|
-
end
|
132
|
-
else
|
133
|
-
screen_shot_and_save_page(scenario) if scenario.failed?
|
134
|
-
end
|
135
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
class AboutScreen < BaseAppScreen
|
2
|
-
trait(:page_name) { 'About' }
|
3
|
-
trait(:page_locator) { { accessibility_id: 'about screen' } }
|
4
|
-
trait(:page_url) { 'about' }
|
5
|
-
trait(:navigator) { nav_menu.open_about }
|
6
|
-
|
7
|
-
def verify_page_ui
|
8
|
-
super
|
9
|
-
verify_ui_states(header_label => { visible: true, caption: 'About' })
|
10
|
-
end
|
11
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
class BaseAppScreen < TestCentricity::ScreenObject
|
2
|
-
include SharedBaseAppScreen
|
3
|
-
|
4
|
-
trait(:page_name) { 'Base App Screen' }
|
5
|
-
|
6
|
-
# Base App screen UI elements
|
7
|
-
label :header_label, { accessibility_id: 'container header' }
|
8
|
-
alert :alert_modal, { class: 'XCUIElementTypeAlert' }
|
9
|
-
sections nav_bar: NavBar,
|
10
|
-
nav_menu: NavMenu
|
11
|
-
|
12
|
-
def verify_page_ui
|
13
|
-
nav_bar.verify_ui
|
14
|
-
end
|
15
|
-
|
16
|
-
def invoke_nav_menu
|
17
|
-
nav_bar.open_menu
|
18
|
-
nav_menu.wait_until_visible(3)
|
19
|
-
end
|
20
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class BiometricsScreen < BaseAppScreen
|
2
|
-
trait(:page_name) { 'Biometrics' }
|
3
|
-
trait(:page_locator) { { accessibility_id: 'biometrics screen' } }
|
4
|
-
trait(:navigator) { nav_menu.open_biometrics }
|
5
|
-
|
6
|
-
# Biometrics screen UI elements
|
7
|
-
switch :face_id_switch, { accessibility_id: 'biometrics switch'}
|
8
|
-
|
9
|
-
def verify_page_ui
|
10
|
-
super
|
11
|
-
ui = {
|
12
|
-
header_label => { visible: true, caption: 'FaceID' },
|
13
|
-
face_id_switch => { visible: true, enabled: false, value: '0' }
|
14
|
-
}
|
15
|
-
verify_ui_states(ui)
|
16
|
-
end
|
17
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class CheckoutAddressScreen < BaseAppScreen
|
2
|
-
include SharedCheckoutAddressScreen
|
3
|
-
|
4
|
-
trait(:page_name) { 'Checkout - Address' }
|
5
|
-
trait(:page_locator) { { accessibility_id: 'checkout address screen' } }
|
6
|
-
trait(:page_url) { 'checkout-address' }
|
7
|
-
|
8
|
-
# Checkout Address screen UI elements
|
9
|
-
textfields fullname_field: { accessibility_id: 'Full Name* input field' },
|
10
|
-
address1_field: { accessibility_id: 'Address Line 1* input field' },
|
11
|
-
address2_field: { accessibility_id: 'Address Line 2 input field' },
|
12
|
-
city_field: { accessibility_id: 'City* input field' },
|
13
|
-
state_region_field: { accessibility_id: 'State/Region input field' },
|
14
|
-
zip_code_field: { accessibility_id: 'Zip Code* input field' },
|
15
|
-
country_field: { accessibility_id: 'Country* input field' }
|
16
|
-
button :to_payment_button, { accessibility_id: 'To Payment button' }
|
17
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
class CheckoutPaymentScreen < BaseAppScreen
|
2
|
-
include SharedCheckoutPaymentScreen
|
3
|
-
|
4
|
-
trait(:page_name) { 'Checkout - Payment' }
|
5
|
-
trait(:page_locator) { { accessibility_id: 'checkout payment screen' } }
|
6
|
-
trait(:page_url) { 'checkout-payment' }
|
7
|
-
|
8
|
-
# Checkout Payment screen UI elements
|
9
|
-
textfields payee_name_field: { xpath: '(//XCUIElementTypeTextField[@name="Full Name* input field"])[1]' },
|
10
|
-
card_number_field: { accessibility_id: 'Card Number* input field' },
|
11
|
-
expiration_field: { accessibility_id: 'Expiration Date* input field' },
|
12
|
-
security_code_field: { accessibility_id: 'Security Code* input field' },
|
13
|
-
recipient_name_field: { xpath: '(//XCUIElementTypeTextField[@name="Full Name* input field"])[2]' },
|
14
|
-
address1_field: { accessibility_id: 'Address Line 1* input field' },
|
15
|
-
address2_field: { accessibility_id: 'Address Line 2 input field' },
|
16
|
-
city_field: { accessibility_id: 'City* input field' },
|
17
|
-
state_region_field: { accessibility_id: 'State/Region input field' },
|
18
|
-
zip_code_field: { accessibility_id: 'Zip Code* input field' },
|
19
|
-
country_field: { accessibility_id: 'Country* input field' }
|
20
|
-
checkbox :bill_address_check, { xpath: '//XCUIElementTypeOther[contains(@name, "checkbox")]'}
|
21
|
-
button :review_order_button, { accessibility_id: 'Review Order button' }
|
22
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
class GeoLocationScreen < BaseAppScreen
|
2
|
-
trait(:page_name) { 'Geo Location' }
|
3
|
-
trait(:page_locator) { { accessibility_id: 'geo location screen' } }
|
4
|
-
trait(:page_url) { 'geo-locations' }
|
5
|
-
trait(:navigator) { nav_menu.open_geo_location }
|
6
|
-
|
7
|
-
# Geo Location screen UI elements
|
8
|
-
buttons start_observing_button: { accessibility_id: 'Start Observing button'},
|
9
|
-
stop_observing_button: { accessibility_id: 'Stop Observing button'}
|
10
|
-
labels latitude_label: { accessibility_id: 'Latitude:' },
|
11
|
-
latitude_data: { accessibility_id: 'latitude data' },
|
12
|
-
longitude_label: { accessibility_id: 'Longitude:' },
|
13
|
-
longitude_data: { accessibility_id: 'longitude data' }
|
14
|
-
|
15
|
-
def verify_page_ui
|
16
|
-
super
|
17
|
-
ui = {
|
18
|
-
header_label => { visible: true, caption: 'Geo Location' },
|
19
|
-
start_observing_button => { visible: true, enabled: false, caption: 'Start Observing' },
|
20
|
-
stop_observing_button => { visible: true, enabled: true, caption: 'Stop Observing' },
|
21
|
-
latitude_label => { visible: true, caption: 'Latitude:' },
|
22
|
-
latitude_data => { visible: true, caption: { not_equal: '0' } },
|
23
|
-
longitude_label => { visible: true, caption: 'Longitude:' },
|
24
|
-
longitude_data => { visible: true, caption: { not_equal: '0' } }
|
25
|
-
}
|
26
|
-
verify_ui_states(ui)
|
27
|
-
end
|
28
|
-
|
29
|
-
def modal_action(action)
|
30
|
-
alert_modal.await_and_respond(action.downcase.to_sym, timeout = 1, button_name = 'Allow Once')
|
31
|
-
end
|
32
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class LoginScreen < BaseAppScreen
|
2
|
-
include SharedLoginScreen
|
3
|
-
|
4
|
-
trait(:page_name) { 'Login' }
|
5
|
-
trait(:page_locator) { { accessibility_id: 'login screen' } }
|
6
|
-
trait(:page_url) { 'login' }
|
7
|
-
trait(:navigator) { nav_menu.open_log_in }
|
8
|
-
|
9
|
-
# Login screen UI elements
|
10
|
-
labels username_label: { accessibility_id: 'Username'},
|
11
|
-
password_label: { xpath: '(//XCUIElementTypeStaticText[@name="Password"])[1]'},
|
12
|
-
username_error: { accessibility_id: 'Username-error-message' },
|
13
|
-
password_error: { accessibility_id: 'Password-error-message' },
|
14
|
-
generic_error: { accessibility_id: 'generic-error-message' }
|
15
|
-
textfields username_field: { accessibility_id: 'Username input field' },
|
16
|
-
password_field: { accessibility_id: 'Password input field' }
|
17
|
-
button :login_button, { accessibility_id: 'Login button' }
|
18
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
class ProductItemScreen < BaseAppScreen
|
2
|
-
trait(:page_name) { 'Product Item' }
|
3
|
-
trait(:page_locator) { { accessibility_id: 'product screen' } }
|
4
|
-
trait(:page_url) { "product-details/#{ProductData.current.id.to_s}" }
|
5
|
-
|
6
|
-
# Product Item screen UI elements
|
7
|
-
labels price_value: { accessibility_id: 'product price' },
|
8
|
-
description_value: { accessibility_id: 'product description' },
|
9
|
-
quantity_value: { accessibility_id: 'counter amount' },
|
10
|
-
highlights_label: { accessibility_id: 'Product Highlights' }
|
11
|
-
image :product_image, { xpath: '//XCUIElementTypeImage' }
|
12
|
-
buttons add_to_cart_button: { accessibility_id: 'Add To Cart button' },
|
13
|
-
minus_qty_button: { accessibility_id: 'counter minus button' },
|
14
|
-
plus_qty_button: { accessibility_id: 'counter plus button' },
|
15
|
-
black_color_button: { accessibility_id: 'black circle' },
|
16
|
-
blue_color_button: { accessibility_id: 'blue circle' },
|
17
|
-
gray_color_button: { accessibility_id: 'gray circle' },
|
18
|
-
red_color_button: { accessibility_id: 'red circle' }
|
19
|
-
|
20
|
-
def verify_page_ui
|
21
|
-
super
|
22
|
-
ui = {
|
23
|
-
header_label => { visible: true, caption: ProductData.current.name },
|
24
|
-
price_value => { visible: true, caption: ProductData.current.price },
|
25
|
-
highlights_label => { visible: true, caption: 'Product Highlights' },
|
26
|
-
description_value => { visible: true, caption: ProductData.current.description },
|
27
|
-
product_image => { visible: true, enabled: true },
|
28
|
-
black_color_button => { visible: ProductData.current.colors.include?('BLACK') },
|
29
|
-
blue_color_button => { visible: ProductData.current.colors.include?('BLUE') },
|
30
|
-
gray_color_button => { visible: ProductData.current.colors.include?('GRAY') },
|
31
|
-
red_color_button => { visible: ProductData.current.colors.include?('RED') },
|
32
|
-
minus_qty_button => { visible: true, enabled: true },
|
33
|
-
quantity_value => { visible: true, enabled: true, caption: '1' },
|
34
|
-
plus_qty_button => { visible: true, enabled: true },
|
35
|
-
add_to_cart_button => { visible: true, enabled: true, caption: 'Add To Cart' }
|
36
|
-
}
|
37
|
-
verify_ui_states(ui)
|
38
|
-
end
|
39
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
class ProductsScreen < BaseAppScreen
|
2
|
-
trait(:page_name) { 'Products' }
|
3
|
-
trait(:page_locator) { { accessibility_id: 'products screen' } }
|
4
|
-
trait(:page_url) { 'store-overview' }
|
5
|
-
|
6
|
-
# Products screen UI elements
|
7
|
-
list :product_list, { xpath: '//XCUIElementTypeScrollView/XCUIElementTypeOther[1]' }
|
8
|
-
section :product_list_item, ProductListItem
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
super
|
12
|
-
# define the list item element for the Product list object
|
13
|
-
list_elements = { list_item: { xpath: '//XCUIElementTypeOther[@name="store item"]' } }
|
14
|
-
product_list.define_list_elements(list_elements)
|
15
|
-
# associate the Product List Item indexed section object with the Product list object
|
16
|
-
product_list_item.set_list_index(product_list)
|
17
|
-
end
|
18
|
-
|
19
|
-
def verify_page_ui
|
20
|
-
super
|
21
|
-
ui = {
|
22
|
-
header_label => { visible: true, caption: 'Products' },
|
23
|
-
# product_list => { visible: true, itemcount: 6 }
|
24
|
-
}
|
25
|
-
verify_ui_states(ui)
|
26
|
-
end
|
27
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
class QRCodeScannerScreen < BaseAppScreen
|
2
|
-
trait(:page_name) { 'QR Code Scanner' }
|
3
|
-
trait(:page_locator) { { accessibility_id: 'qr code screen' } }
|
4
|
-
trait(:page_url) { 'qr-code-scanner' }
|
5
|
-
trait(:navigator) { nav_menu.open_qr_code_scanner }
|
6
|
-
|
7
|
-
def verify_page_ui
|
8
|
-
super
|
9
|
-
verify_ui_states(header_label => { visible: true, caption: 'QR Code Scanner' })
|
10
|
-
end
|
11
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class SauceBotScreen < BaseAppScreen
|
2
|
-
include SharedSauceBotScreen
|
3
|
-
|
4
|
-
trait(:page_name) { 'SauceBot Video' }
|
5
|
-
trait(:page_locator) { { accessibility_id: 'SauceBot screen' } }
|
6
|
-
trait(:navigator) { nav_menu.open_saucebot_video }
|
7
|
-
|
8
|
-
# SauceBot Video screen UI elements
|
9
|
-
element :video_player, { accessibility_id: 'YouTube Video Player' }
|
10
|
-
buttons video_back: { accessibility_id: 'video icon backward' },
|
11
|
-
video_play: { accessibility_id: 'video icon play' },
|
12
|
-
video_pause: { accessibility_id: 'video icon stop' },
|
13
|
-
video_forward: { accessibility_id: 'video icon forward' },
|
14
|
-
video_volume: { accessibility_id: 'video icon volume-up' },
|
15
|
-
video_mute: { accessibility_id: 'video icon volume-mute' }
|
16
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
class WebViewScreen < BaseAppScreen
|
2
|
-
include SharedWebViewScreen
|
3
|
-
|
4
|
-
trait(:page_name) { 'Webview' }
|
5
|
-
trait(:page_locator) { { accessibility_id: 'webview selection screen' } }
|
6
|
-
trait(:page_url) { 'webview' }
|
7
|
-
trait(:navigator) { nav_menu.open_webview }
|
8
|
-
|
9
|
-
# Webview screen UI elements
|
10
|
-
label :url_label, { accessibility_id: 'URL' }
|
11
|
-
textfield :url_field, { accessibility_id: 'URL input field' }
|
12
|
-
button :go_to_site_button, { accessibility_id: 'Go To Site button' }
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
class ProductListItem < TestCentricity::ScreenSection
|
2
|
-
trait(:section_name) { 'Product List Item' }
|
3
|
-
trait(:section_locator) { { xpath: '//XCUIElementTypeOther[@name="store item"]' } }
|
4
|
-
|
5
|
-
# Product Cell Item UI elements
|
6
|
-
labels product_name: { xpath: '//XCUIElementTypeStaticText[@name="store item text"]' },
|
7
|
-
product_price: { xpath: '//XCUIElementTypeStaticText[@name="store item price"]' }
|
8
|
-
buttons review_star_1: { xpath: '//XCUIElementTypeOther[@name="review star 1"]' },
|
9
|
-
review_star_2: { xpath: '//XCUIElementTypeOther[@name="review star 2"]' },
|
10
|
-
review_star_3: { xpath: '//XCUIElementTypeOther[@name="review star 3"]' },
|
11
|
-
review_star_4: { xpath: '//XCUIElementTypeOther[@name="review star 4"]' },
|
12
|
-
review_star_5: { xpath: '//XCUIElementTypeOther[@name="review star 5"]' }
|
13
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
class NavBar < TestCentricity::ScreenSection
|
2
|
-
trait(:section_name) { 'Nav Bar' }
|
3
|
-
trait(:section_locator) { { xpath: '(//XCUIElementTypeOther[@name="Catalog, tab, 1 of 3 0 Menu, tab, 3 of 3"])[1]' } }
|
4
|
-
|
5
|
-
# Nav Bar UI elements
|
6
|
-
buttons catalog_tab: { accessibility_id: 'tab bar option catalog' },
|
7
|
-
cart_tab: { accessibility_id: 'tab bar option cart' },
|
8
|
-
menu_tab: { accessibility_id: 'tab bar option menu' }
|
9
|
-
label :cart_quantity, {}
|
10
|
-
|
11
|
-
def verify_ui
|
12
|
-
ui = {
|
13
|
-
catalog_tab => { visible: true, enabled: true, caption: 'Catalog, tab, 1 of 3' },
|
14
|
-
cart_tab => { visible: true, enabled: true },
|
15
|
-
menu_tab => { visible: true, enabled: true, caption: 'Menu, tab, 3 of 3' }
|
16
|
-
}
|
17
|
-
verify_ui_states(ui)
|
18
|
-
end
|
19
|
-
|
20
|
-
def open_catalog
|
21
|
-
catalog_tab.click
|
22
|
-
end
|
23
|
-
|
24
|
-
def open_cart
|
25
|
-
cart_tab.click
|
26
|
-
end
|
27
|
-
|
28
|
-
def open_menu
|
29
|
-
menu_tab.click
|
30
|
-
end
|
31
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
class NavMenu < TestCentricity::ScreenSection
|
2
|
-
include SharedNavMenu
|
3
|
-
|
4
|
-
trait(:section_name) { 'Nav Menu' }
|
5
|
-
trait(:section_locator) { { xpath: '//XCUIElementTypeScrollView' } }
|
6
|
-
|
7
|
-
# Nav Menu UI elements
|
8
|
-
buttons close_button: { accessibility_id: 'close menu' },
|
9
|
-
webview_button: { accessibility_id: 'menu item webview' },
|
10
|
-
qr_code_button: { accessibility_id: 'menu item qr code scanner' },
|
11
|
-
geo_location_button: { accessibility_id: 'menu item geo location' },
|
12
|
-
drawing_button: { accessibility_id: 'menu item drawing' },
|
13
|
-
report_a_bug_button: { accessibility_id: 'menu item report a bug' },
|
14
|
-
about_button: { accessibility_id: 'menu item about' },
|
15
|
-
reset_app_button: { accessibility_id: 'menu item reset app' },
|
16
|
-
biometrics_button: { accessibility_id: 'menu item biometrics' },
|
17
|
-
log_in_button: { accessibility_id: 'menu item log in' },
|
18
|
-
log_out_button: { accessibility_id: 'menu item log out' },
|
19
|
-
api_calls_button: { accessibility_id: 'menu item api calls' },
|
20
|
-
sauce_video_button: { accessibility_id: 'menu item sauce bot video' }
|
21
|
-
|
22
|
-
def verify_ui
|
23
|
-
ui = {
|
24
|
-
self => { visible: true },
|
25
|
-
close_button => { visible: true, enabled: true },
|
26
|
-
webview_button => { visible: true, enabled: true, caption: 'Webview' },
|
27
|
-
qr_code_button => { visible: true, enabled: true, caption: 'QR Code Scanner' },
|
28
|
-
geo_location_button => { visible: true, enabled: true, caption: 'Geo Location' },
|
29
|
-
drawing_button => { visible: true, enabled: true, caption: 'Drawing' },
|
30
|
-
report_a_bug_button => { visible: true, enabled: true, caption: 'Report A Bug' },
|
31
|
-
about_button => { visible: true, enabled: true, caption: 'About' },
|
32
|
-
reset_app_button => { visible: true, enabled: true, caption: 'Reset App State' },
|
33
|
-
biometrics_button => { visible: true, enabled: true, caption: 'FaceID' },
|
34
|
-
log_in_button => { visible: true, enabled: true, caption: 'Log In' },
|
35
|
-
log_out_button => { visible: true, enabled: true, caption: 'Log Out' },
|
36
|
-
api_calls_button => { visible: true, enabled: true, caption: 'Api Calls' },
|
37
|
-
sauce_video_button => { visible: true, enabled: true, caption: 'Sauce Bot Video' }
|
38
|
-
}
|
39
|
-
verify_ui_states(ui)
|
40
|
-
end
|
41
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module SharedBaseAppScreen
|
2
|
-
include WorldData
|
3
|
-
include WorldPages
|
4
|
-
|
5
|
-
def nav_menu_action(action)
|
6
|
-
case action.downcase.to_sym
|
7
|
-
when :open
|
8
|
-
invoke_nav_menu
|
9
|
-
when :close
|
10
|
-
nav_menu.close if nav_menu.visible?
|
11
|
-
else
|
12
|
-
raise "#{action} is not a valid selector"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def navigate_to
|
17
|
-
invoke_nav_menu
|
18
|
-
navigator
|
19
|
-
end
|
20
|
-
|
21
|
-
def verify_nav_menu(state)
|
22
|
-
case state.downcase.to_sym
|
23
|
-
when :closed
|
24
|
-
nav_menu.verify_closed
|
25
|
-
when :displayed
|
26
|
-
nav_menu.verify_ui
|
27
|
-
else
|
28
|
-
raise "#{action} is not a valid selector"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def modal_action(action)
|
33
|
-
alert_modal.await_and_respond(action.downcase.to_sym, timeout = 1)
|
34
|
-
end
|
35
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module SharedCheckoutAddressScreen
|
2
|
-
def verify_page_ui
|
3
|
-
super
|
4
|
-
ui = {
|
5
|
-
header_label => { visible: true, caption: 'Checkout' },
|
6
|
-
fullname_field => { visible: true, enabled: true, placeholder: 'Rebecca Winter' },
|
7
|
-
address1_field => { visible: true, enabled: true, placeholder: 'Mandorley 112' },
|
8
|
-
address2_field => { visible: true, enabled: true, placeholder: 'Entrance 1' },
|
9
|
-
city_field => { visible: true, enabled: true, placeholder: 'Truro' },
|
10
|
-
state_region_field => { visible: true, enabled: true, placeholder: 'Cornwall' },
|
11
|
-
zip_code_field => { visible: true, enabled: true, placeholder: '89750' },
|
12
|
-
country_field => { visible: true, enabled: true, placeholder: 'United Kingdom' },
|
13
|
-
to_payment_button => { visible: true, enabled: true, caption: 'To Payment' }
|
14
|
-
}
|
15
|
-
verify_ui_states(ui)
|
16
|
-
end
|
17
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module SharedCheckoutPaymentScreen
|
2
|
-
def verify_page_ui
|
3
|
-
super
|
4
|
-
ui = {
|
5
|
-
header_label => { visible: true, caption: 'Checkout' },
|
6
|
-
payee_name_field => { visible: true, enabled: true, placeholder: 'Rebecca Winter' },
|
7
|
-
card_number_field => { visible: true, enabled: true, placeholder: '3258 1265 7568 789' },
|
8
|
-
expiration_field => { visible: true, enabled: true, placeholder: '03/25' },
|
9
|
-
security_code_field => { visible: true, enabled: true, placeholder: '123' },
|
10
|
-
bill_address_check => { visible: true, enabled: true },
|
11
|
-
recipient_name_field => { visible: false },
|
12
|
-
address1_field => { visible: false },
|
13
|
-
address2_field => { visible: false },
|
14
|
-
city_field => { visible: false },
|
15
|
-
state_region_field => { visible: false },
|
16
|
-
zip_code_field => { visible: false },
|
17
|
-
country_field => { visible: false },
|
18
|
-
review_order_button => { visible: true, enabled: true, caption: 'Review Order' }
|
19
|
-
}
|
20
|
-
verify_ui_states(ui)
|
21
|
-
end
|
22
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module SharedLoginScreen
|
2
|
-
def verify_page_ui
|
3
|
-
super
|
4
|
-
ui = {
|
5
|
-
header_label => { visible: true, caption: 'Login' },
|
6
|
-
username_label => { visible: true, caption: 'Username' },
|
7
|
-
username_field => { visible: true, enabled: true },
|
8
|
-
password_label => { visible: true, caption: 'Password' },
|
9
|
-
password_field => { visible: true, enabled: true },
|
10
|
-
login_button => { visible: true, enabled: true, caption: 'Login' }
|
11
|
-
}
|
12
|
-
verify_ui_states(ui)
|
13
|
-
end
|
14
|
-
|
15
|
-
def login(username, password)
|
16
|
-
fields = {
|
17
|
-
username_field => username,
|
18
|
-
password_field => password
|
19
|
-
}
|
20
|
-
populate_data_fields(fields)
|
21
|
-
login_button.tap
|
22
|
-
end
|
23
|
-
|
24
|
-
def verify_entry_error(reason)
|
25
|
-
ui = case reason.gsub(/\s+/, '_').downcase.to_sym
|
26
|
-
when :invalid_password, :invalid_user
|
27
|
-
{ generic_error => { visible: true, caption: 'Provided credentials do not match any user in this service.' } }
|
28
|
-
when :locked_account
|
29
|
-
{ generic_error => { visible: true, caption: 'Sorry, this user has been locked out.' } }
|
30
|
-
when :no_username
|
31
|
-
{ username_error => { visible: true, caption: 'Username is required' } }
|
32
|
-
when :no_password
|
33
|
-
{ password_error => { visible: true, caption: 'Password is required' } }
|
34
|
-
else
|
35
|
-
raise "#{reason} is not a valid selector"
|
36
|
-
end
|
37
|
-
verify_ui_states(ui)
|
38
|
-
end
|
39
|
-
end
|