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/config/test_data/data.yml
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
# This section is populated with Environment data required to execute automated test suites on all supported environments
|
2
|
-
Environments:
|
3
|
-
LOCAL:
|
4
|
-
DEEP_LINK_PREFIX: 'mydemoapprn'
|
5
|
-
IOS_BUNDLE_ID: 'com.saucelabs.mydemoapp.rn'
|
6
|
-
ANDROID_APP_ID: 'com.saucelabs.mydemoapp.rn'
|
7
|
-
IOS_APP_PATH: '/Users/Shared/Test_Apps/iOS/MyRNDemoApp.app'
|
8
|
-
IOS_IPA_PATH: '/Users/Shared/Test_Apps/iOS/iOS-Real-Device-MyRNDemoApp.1.3.0-162.ipa'
|
9
|
-
ANDROID_APK_PATH: '/Users/Shared/Test_Apps/Android/Android-MyDemoAppRN.1.2.0.build-231.apk'
|
10
|
-
|
11
|
-
# This section is populated with user credential data required to test the Login screen features
|
12
|
-
User_creds:
|
13
|
-
valid_data:
|
14
|
-
username: 'bob@example.com'
|
15
|
-
password: '10203040'
|
16
|
-
invalid_user:
|
17
|
-
username: 'iggy.snicklefritz@example.com'
|
18
|
-
password: '10203040'
|
19
|
-
locked_account:
|
20
|
-
username: 'alice@example.com'
|
21
|
-
password: '10203040'
|
22
|
-
no_username:
|
23
|
-
password: '10203040'
|
24
|
-
no_password:
|
25
|
-
username: 'bob@example.com'
|
26
|
-
|
27
|
-
# This section is populated with Product data required for testing the Shopping features
|
28
|
-
Products:
|
29
|
-
1:
|
30
|
-
id: 1
|
31
|
-
name: 'Sauce Labs Backpack'
|
32
|
-
description: 'carry.allTheThings() with the sleek, streamlined Sly Pack that melds uncompromising style with unequaled laptop and tablet protection.'
|
33
|
-
price: '$29.99'
|
34
|
-
review: 4
|
35
|
-
colors: ['BLACK', 'BLUE', 'GRAY', 'RED']
|
36
|
-
defaultColor: 'BLACK'
|
37
|
-
2:
|
38
|
-
id: 2
|
39
|
-
name: 'Sauce Labs Bike Light'
|
40
|
-
description: "A red light isn't the desired state in testing but it sure helps when riding your bike at night. Water-resistant with 3 lighting modes, 1 AAA battery included."
|
41
|
-
price: '$9.99'
|
42
|
-
review: 4
|
43
|
-
colors: ['BLACK']
|
44
|
-
defaultColor: 'BLACK'
|
45
|
-
3:
|
46
|
-
id: 3
|
47
|
-
name: 'Sauce Labs Bolt T-Shirt'
|
48
|
-
description: 'Get your testing superhero on with the Sauce Labs bolt T-shirt. From American Apparel, 100% ringspun combed cotton, heather gray with red bolt.'
|
49
|
-
price: '$15.99'
|
50
|
-
review: 4
|
51
|
-
colors: ['BLACK']
|
52
|
-
defaultColor: 'BLACK'
|
53
|
-
4:
|
54
|
-
id: 4
|
55
|
-
name: 'Sauce Labs Fleece Jacket'
|
56
|
-
description: "It's not every day that you come across a midweight quarter-zip fleece jacket capable of handling everything from a relaxing day outdoors to a busy day at the office."
|
57
|
-
price: '$49.99'
|
58
|
-
review: 4
|
59
|
-
colors: ['GRAY']
|
60
|
-
defaultColor: 'GRAY'
|
61
|
-
5:
|
62
|
-
id: 5
|
63
|
-
name: 'Sauce Labs Onesie'
|
64
|
-
description: "Rib snap infant onesie for the junior automation engineer in development. Reinforced 3-snap bottom closure, two-needle hemmed sleeved and bottom won't unravel."
|
65
|
-
price: '$7.99'
|
66
|
-
review: 4
|
67
|
-
colors: ['BLACK', 'GRAY', 'RED']
|
68
|
-
defaultColor: 'RED'
|
69
|
-
6:
|
70
|
-
id: 6
|
71
|
-
name: 'Test.allTheThings() T-Shirt'
|
72
|
-
description: 'This classic Sauce Labs t-shirt is perfect to wear when cozying up to your keyboard to automate a few tests. Super-soft and comfy ringspun combed cotton.'
|
73
|
-
price: '$15.99'
|
74
|
-
review: 4
|
75
|
-
colors: ['BLACK', 'GRAY', 'RED']
|
76
|
-
defaultColor: 'RED'
|
data/features/deep_links.feature
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
@mobile @ios @android @regression
|
2
|
-
|
3
|
-
|
4
|
-
Feature: App screen deep links
|
5
|
-
In order to ensure comprehensive support for native app deep links
|
6
|
-
As a developer of the TestCentricity gem
|
7
|
-
I expect to validate that app screens can be directly accessed with minimal UI interactions
|
8
|
-
|
9
|
-
|
10
|
-
Background:
|
11
|
-
Given I have launched the SauceLabs My Demo app
|
12
|
-
|
13
|
-
|
14
|
-
Scenario Outline: Verify screens can be directly accessed via deep links
|
15
|
-
Given I am on the <start> screen
|
16
|
-
When I load the <destination> screen
|
17
|
-
Then I expect the <destination> screen to be correctly displayed
|
18
|
-
|
19
|
-
Examples:
|
20
|
-
|start |destination |
|
21
|
-
|Products |About |
|
22
|
-
|Products |Login |
|
23
|
-
|Products |Webview |
|
24
|
-
|Products |Checkout - Address |
|
25
|
-
|Products |Checkout - Payment |
|
26
|
-
|About |Products |
|
27
|
-
|
28
|
-
|
29
|
-
Scenario Outline: Verify Product Item screen can be directly accessed via deep links
|
30
|
-
Given I am on the Products screen
|
31
|
-
And I access the data for product id <product_id>
|
32
|
-
When I load the Product Item screen
|
33
|
-
Then I expect the Product Item screen to be correctly displayed
|
34
|
-
|
35
|
-
Examples:
|
36
|
-
|product_id |
|
37
|
-
|1 |
|
38
|
-
|5 |
|
data/features/login.feature
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
@mobile @ios @android @regression
|
2
|
-
|
3
|
-
|
4
|
-
Feature: Login page
|
5
|
-
In order to ensure comprehensive support for native app login features
|
6
|
-
As a developer of the TestCentricity gem
|
7
|
-
I expect users to access the app only with valid login credentials
|
8
|
-
|
9
|
-
|
10
|
-
Background:
|
11
|
-
Given I have launched the SauceLabs My Demo app
|
12
|
-
|
13
|
-
|
14
|
-
Scenario: Verify login with valid credentials
|
15
|
-
Given I am on the Login screen
|
16
|
-
When I enter user credentials with valid data
|
17
|
-
Then I expect the Checkout - Address screen to be correctly displayed
|
18
|
-
|
19
|
-
|
20
|
-
Scenario Outline: Verify correct error states when using invalid credentials
|
21
|
-
Given I am on the Login screen
|
22
|
-
When I enter user credentials with <reason>
|
23
|
-
Then I expect an error to be displayed due to <reason>
|
24
|
-
|
25
|
-
Examples:
|
26
|
-
|reason |
|
27
|
-
|no username |
|
28
|
-
|no password |
|
29
|
-
|locked account |
|
30
|
-
|invalid user |
|
data/features/navigation.feature
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
@mobile @ios @android @regression
|
2
|
-
|
3
|
-
|
4
|
-
Feature: Screen Navigation
|
5
|
-
In order to ensure comprehensive support for native app navigation features
|
6
|
-
As a developer of the TestCentricity gem
|
7
|
-
I expect to validate that app screens can be accessed via navigation controls
|
8
|
-
|
9
|
-
|
10
|
-
Background:
|
11
|
-
Given I have launched the SauceLabs My Demo app
|
12
|
-
And I am on the Products screen
|
13
|
-
|
14
|
-
|
15
|
-
Scenario: Verify navigation menu can be invoked and is properly displayed
|
16
|
-
When I open the navigation menu
|
17
|
-
Then I expect the navigation menu to be correctly displayed
|
18
|
-
When I close the navigation menu
|
19
|
-
Then I expect the navigation menu to be hidden
|
20
|
-
|
21
|
-
|
22
|
-
Scenario Outline: Verify screen navigation features
|
23
|
-
When I tap the <screen_name> navigation menu item
|
24
|
-
Then I expect the <screen_name> screen to be correctly displayed
|
25
|
-
|
26
|
-
Examples:
|
27
|
-
|screen_name |
|
28
|
-
|About |
|
29
|
-
|Login |
|
30
|
-
|Webview |
|
31
|
-
|SauceBot Video |
|
32
|
-
|
33
|
-
|
34
|
-
Scenario Outline: Verify screen navigation features with popup modals
|
35
|
-
When I tap the <screen_name> navigation menu item
|
36
|
-
And I accept the popup request modal
|
37
|
-
Then I expect the <screen_name> screen to be correctly displayed
|
38
|
-
|
39
|
-
Examples:
|
40
|
-
|screen_name |
|
41
|
-
|QR Code Scanner |
|
42
|
-
|Geo Location |
|
43
|
-
|Biometrics |
|
@@ -1,67 +0,0 @@
|
|
1
|
-
include TestCentricity
|
2
|
-
|
3
|
-
|
4
|
-
Given(/^I have launched the SauceLabs My Demo app$/) do
|
5
|
-
# activate the app
|
6
|
-
AppiumConnect.launch_app
|
7
|
-
end
|
8
|
-
|
9
|
-
|
10
|
-
When(/^I (?:load|am on) the (.*) (?:page|screen)$/) do |screen_name|
|
11
|
-
# find and load the specified target page/screen
|
12
|
-
target_page = PageManager.find_page(screen_name)
|
13
|
-
target_page.load_page
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
When(/^I (?:click|tap) the ([^\"]*) navigation menu item$/) do |screen_name|
|
18
|
-
# find and navigate to the specified target page/screen
|
19
|
-
target_page = PageManager.find_page(screen_name)
|
20
|
-
target_page.navigate_to
|
21
|
-
PageManager.current_page = target_page
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
Then(/^I expect the (.*) (?:page|screen) to be correctly displayed$/) do |screen_name|
|
26
|
-
# find and verify that the specified target page/screen is loaded
|
27
|
-
target_page = PageManager.find_page(screen_name)
|
28
|
-
target_page.verify_page_exists
|
29
|
-
# verify that target page/screen is correctly displayed
|
30
|
-
target_page.verify_page_ui
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
When(/^I enter user credentials with (.*)$/) do |creds|
|
35
|
-
cred_data = user_data_source.find_user_creds(creds.gsub(/\s+/, '_').downcase)
|
36
|
-
login_screen.login(cred_data.username, cred_data.password)
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
Then(/^I expect an error to be displayed due to (.*)$/) do |reason|
|
41
|
-
PageManager.current_page.verify_entry_error(reason)
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
When(/^I (.*) the navigation menu$/) do |action|
|
46
|
-
PageManager.current_page.nav_menu_action(action)
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
Then(/^I expect the navigation menu to be correctly displayed$/) do
|
51
|
-
PageManager.current_page.verify_nav_menu(state = :displayed)
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
Then(/^I expect the navigation menu to be hidden$/) do
|
56
|
-
PageManager.current_page.verify_nav_menu(state = :closed)
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
When(/^I (.*) the popup request modal$/) do |action|
|
61
|
-
PageManager.current_page.modal_action(action)
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
When(/^I access the data for product id (.*)$/) do |product_id|
|
66
|
-
product_data_source.find_product(product_id)
|
67
|
-
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,31 +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
|
-
buttons menu_button: { accessibility_id: 'open menu' },
|
8
|
-
cart_button: { accessibility_id: 'cart badge' }
|
9
|
-
labels header_label: { xpath: '//android.view.ViewGroup[@content-desc="container header"]/android.widget.TextView' },
|
10
|
-
cart_quantity: { xpath: '//android.view.ViewGroup[@content-desc="cart badge"]/android.widget.TextView' }
|
11
|
-
alerts grant_modal: { id: 'com.android.permissioncontroller:id/grant_dialog' },
|
12
|
-
alert_modal: { id: 'android:id/parentPanel' }
|
13
|
-
section :nav_menu, NavMenu
|
14
|
-
|
15
|
-
def verify_page_ui
|
16
|
-
ui = {
|
17
|
-
menu_button => { visible: true, enabled: true },
|
18
|
-
cart_button => { visible: true, enabled: true }
|
19
|
-
}
|
20
|
-
verify_ui_states(ui)
|
21
|
-
end
|
22
|
-
|
23
|
-
def invoke_nav_menu
|
24
|
-
menu_button.click
|
25
|
-
nav_menu.wait_until_visible(3)
|
26
|
-
end
|
27
|
-
|
28
|
-
def open_cart
|
29
|
-
cart_button.click
|
30
|
-
end
|
31
|
-
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 :fingerprint_switch, { accessibility_id: 'biometrics switch'}
|
8
|
-
|
9
|
-
def verify_page_ui
|
10
|
-
super
|
11
|
-
ui = {
|
12
|
-
header_label => { visible: true, caption: 'FingerPrint' },
|
13
|
-
fingerprint_switch => { visible: true, enabled: false }
|
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: '(//android.widget.EditText[@content-desc="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: '(//android.widget.EditText[@content-desc="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: '//android.view.ViewGroup[contains(@content-desc, "checkbox")]/android.view.ViewGroup'}
|
21
|
-
button :review_order_button, { accessibility_id: 'Review Order button' }
|
22
|
-
end
|
@@ -1,28 +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_data: { accessibility_id: 'latitude data' },
|
11
|
-
longitude_data: { accessibility_id: 'longitude data' }
|
12
|
-
|
13
|
-
def verify_page_ui
|
14
|
-
super
|
15
|
-
ui = {
|
16
|
-
header_label => { visible: true, caption: 'Geo Location' },
|
17
|
-
start_observing_button => { visible: true, enabled: false, caption: 'Start Observing' },
|
18
|
-
stop_observing_button => { visible: true, enabled: true, caption: 'Stop Observing' },
|
19
|
-
latitude_data => { visible: true, caption: { not_equal: '0' } },
|
20
|
-
longitude_data => { visible: true, caption: { not_equal: '0' } }
|
21
|
-
}
|
22
|
-
verify_ui_states(ui)
|
23
|
-
end
|
24
|
-
|
25
|
-
def modal_action(action)
|
26
|
-
grant_modal.await_and_respond(action.downcase.to_sym, timeout = 1, button_name = 'Only this time')
|
27
|
-
end
|
28
|
-
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: { xpath: '//android.view.ViewGroup[@content-desc="login screen"]/android.widget.ScrollView/android.view.ViewGroup/android.widget.TextView[2]'},
|
11
|
-
password_label: { xpath: '//android.view.ViewGroup[@content-desc="login screen"]/android.widget.ScrollView/android.view.ViewGroup/android.widget.TextView[3]'},
|
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: { xpath: '//android.view.ViewGroup/android.widget.TextView[2]' }
|
11
|
-
image :product_image, { xpath: '//android.view.ViewGroup/android.widget.ImageView' }
|
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: '//android.widget.ScrollView' }
|
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: '//android.view.ViewGroup[@content-desc="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,15 +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
|
-
|
12
|
-
def modal_action(action)
|
13
|
-
grant_modal.await_and_respond(action.downcase.to_sym, timeout = 1, button_name = 'Only this time')
|
14
|
-
end
|
15
|
-
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, { xpath: '//android.view.View[@resource-id="movie_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, { xpath: '//android.view.ViewGroup[@content-desc="webview selection screen"]/android.widget.ScrollView/android.view.ViewGroup/android.widget.TextView[1]' }
|
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: '//android.view.ViewGroup[@content-desc="store item"]' } }
|
4
|
-
|
5
|
-
# Product Cell Item UI elements
|
6
|
-
labels product_name: { xpath: '//android.widget.TextView[@content-desc="store item text"]' },
|
7
|
-
product_price: { xpath: '//android.widget.TextView[@content-desc="store item price"]' }
|
8
|
-
buttons review_star_1: { xpath: '//android.view.ViewGroup[@content-desc="review star 1"]' },
|
9
|
-
review_star_2: { xpath: '//android.view.ViewGroup[@content-desc="review star 2"]' },
|
10
|
-
review_star_3: { xpath: '//android.view.ViewGroup[@content-desc="review star 3"]' },
|
11
|
-
review_star_4: { xpath: '//android.view.ViewGroup[@content-desc="review star 4"]' },
|
12
|
-
review_star_5: { xpath: '//android.view.ViewGroup[@content-desc="review star 5"]' }
|
13
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
class NavMenu < TestCentricity::ScreenSection
|
2
|
-
include SharedNavMenu
|
3
|
-
|
4
|
-
trait(:section_name) { 'Nav Menu' }
|
5
|
-
trait(:section_locator) { { xpath: '//android.widget.ScrollView/android.view.ViewGroup' } }
|
6
|
-
|
7
|
-
# Nav Menu UI elements
|
8
|
-
buttons close_button: { accessibility_id: 'menu item catalog' },
|
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
|
-
about_button: { accessibility_id: 'menu item about' },
|
14
|
-
reset_app_button: { accessibility_id: 'menu item reset app' },
|
15
|
-
biometrics_button: { accessibility_id: 'menu item biometrics' },
|
16
|
-
log_in_button: { accessibility_id: 'menu item log in' },
|
17
|
-
log_out_button: { accessibility_id: 'menu item log out' },
|
18
|
-
api_calls_button: { accessibility_id: 'menu item api calls' },
|
19
|
-
sauce_video_button: { accessibility_id: 'menu item sauce bot video' }
|
20
|
-
|
21
|
-
def verify_ui
|
22
|
-
ui = {
|
23
|
-
self => { visible: true },
|
24
|
-
close_button => { visible: true, enabled: true },
|
25
|
-
webview_button => { visible: true, enabled: true, caption: 'Webview' },
|
26
|
-
qr_code_button => { visible: true, enabled: true, caption: 'QR Code Scanner' },
|
27
|
-
geo_location_button => { visible: true, enabled: true, caption: 'Geo Location' },
|
28
|
-
drawing_button => { visible: true, enabled: true, caption: 'Drawing' },
|
29
|
-
about_button => { visible: true, enabled: true, caption: 'About' },
|
30
|
-
reset_app_button => { visible: true, enabled: true, caption: 'Reset App State' },
|
31
|
-
biometrics_button => { visible: true, enabled: true, caption: 'FingerPrint' },
|
32
|
-
log_in_button => { visible: true, enabled: true, caption: 'Log In' },
|
33
|
-
log_out_button => { visible: true, enabled: true, caption: 'Log Out' },
|
34
|
-
api_calls_button => { visible: true, enabled: true, caption: 'Api Calls' },
|
35
|
-
sauce_video_button => { visible: true, enabled: true, caption: 'Sauce Bot Video' }
|
36
|
-
}
|
37
|
-
verify_ui_states(ui)
|
38
|
-
end
|
39
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
class ProductDataSource < TestCentricity::DataSource
|
2
|
-
def find_product(product_id)
|
3
|
-
ProductData.current = ProductData.new(environs.read('Products', product_id.to_i))
|
4
|
-
end
|
5
|
-
end
|
6
|
-
|
7
|
-
|
8
|
-
class ProductData < TestCentricity::DataPresenter
|
9
|
-
attribute :id, Integer
|
10
|
-
attribute :name, String
|
11
|
-
attribute :description, String
|
12
|
-
attribute :price, String
|
13
|
-
attribute :review, Integer
|
14
|
-
attribute :colors, Array
|
15
|
-
attribute :default_color, String
|
16
|
-
|
17
|
-
def initialize(data)
|
18
|
-
@id = data[:id]
|
19
|
-
@name = data[:name]
|
20
|
-
@description = data[:description]
|
21
|
-
@price = data[:price]
|
22
|
-
@review = data[:review]
|
23
|
-
@colors = data[:colors]
|
24
|
-
@default_color = data[:defaultColor]
|
25
|
-
super
|
26
|
-
end
|
27
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class UserDataSource < TestCentricity::DataSource
|
2
|
-
def find_user_creds(node_name)
|
3
|
-
UserData.current = UserData.new(environs.read('User_creds', node_name))
|
4
|
-
end
|
5
|
-
end
|
6
|
-
|
7
|
-
|
8
|
-
class UserData < TestCentricity::DataPresenter
|
9
|
-
attribute :username, String
|
10
|
-
attribute :password, String
|
11
|
-
|
12
|
-
def initialize(data)
|
13
|
-
@username = data[:username]
|
14
|
-
@password = data[:password]
|
15
|
-
super
|
16
|
-
end
|
17
|
-
end
|