testcentricity 3.0.4 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/README.md +48 -46
- data/lib/testcentricity/app_core/appium_connect_helper.rb +6 -8
- data/lib/testcentricity/app_core/screen_section.rb +0 -1
- data/lib/testcentricity/app_elements/app_element_helper.rb +14 -4
- data/lib/testcentricity/version.rb +1 -1
- metadata +13 -158
- 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
@@ -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
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module SharedSauceBotScreen
|
2
|
-
def verify_page_ui
|
3
|
-
super
|
4
|
-
video_player.wait_until_visible(10)
|
5
|
-
ui = {
|
6
|
-
header_label => { visible: true, caption: 'SauceBot - The Beginning' },
|
7
|
-
video_player => { visible: true, enabled: true },
|
8
|
-
video_back => { visible: true, enabled: true },
|
9
|
-
video_pause => { visible: true, enabled: true },
|
10
|
-
video_play => { visible: false },
|
11
|
-
video_forward => { visible: true, enabled: true },
|
12
|
-
video_volume => { visible: true, enabled: true },
|
13
|
-
video_mute => { visible: false }
|
14
|
-
}
|
15
|
-
verify_ui_states(ui)
|
16
|
-
end
|
17
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module SharedWebViewScreen
|
2
|
-
def verify_page_ui
|
3
|
-
super
|
4
|
-
ui = {
|
5
|
-
header_label => { visible: true, caption: 'Webview' },
|
6
|
-
url_label => { visible: true, caption: 'URL' },
|
7
|
-
url_field => { visible: true, enabled: true, placeholder: 'https://www.website.com' },
|
8
|
-
go_to_site_button => { visible: true, enabled: true, caption: 'Go To Site' }
|
9
|
-
}
|
10
|
-
verify_ui_states(ui)
|
11
|
-
end
|
12
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
module SharedNavMenu
|
2
|
-
def close
|
3
|
-
close_button.click
|
4
|
-
self.wait_until_hidden(3)
|
5
|
-
end
|
6
|
-
|
7
|
-
def verify_closed
|
8
|
-
verify_ui_states(close_button => { visible: false })
|
9
|
-
end
|
10
|
-
|
11
|
-
def open_webview
|
12
|
-
webview_button.click
|
13
|
-
end
|
14
|
-
|
15
|
-
def open_qr_code_scanner
|
16
|
-
qr_code_button.click
|
17
|
-
end
|
18
|
-
|
19
|
-
def open_geo_location
|
20
|
-
geo_location_button.click
|
21
|
-
end
|
22
|
-
|
23
|
-
def open_drawing
|
24
|
-
drawing_button.click
|
25
|
-
end
|
26
|
-
|
27
|
-
def open_report_a_bug
|
28
|
-
report_a_bug_button.click
|
29
|
-
end
|
30
|
-
|
31
|
-
def open_about
|
32
|
-
about_button.click
|
33
|
-
end
|
34
|
-
|
35
|
-
def open_reset_app
|
36
|
-
reset_app_button.click
|
37
|
-
end
|
38
|
-
|
39
|
-
def open_biometrics
|
40
|
-
biometrics_button.click
|
41
|
-
end
|
42
|
-
|
43
|
-
def open_log_in
|
44
|
-
log_in_button.click
|
45
|
-
end
|
46
|
-
|
47
|
-
def open_log_out
|
48
|
-
log_out_button.click
|
49
|
-
end
|
50
|
-
|
51
|
-
def open_api_calls
|
52
|
-
api_calls_button.click
|
53
|
-
end
|
54
|
-
|
55
|
-
def open_saucebot_video
|
56
|
-
sauce_video_button.click
|
57
|
-
end
|
58
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module WorldData
|
2
|
-
#
|
3
|
-
# data_objects method returns a hash table of your web app's data objects and associated data object classes to be instantiated
|
4
|
-
# by the TestCentricity™ DataManager. Data Object class definitions are contained in the features/support/data folder.
|
5
|
-
#
|
6
|
-
def data_objects
|
7
|
-
{
|
8
|
-
user_data_source: UserDataSource,
|
9
|
-
product_data_source: ProductDataSource
|
10
|
-
}
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
|
15
|
-
World(WorldData)
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module WorldPages
|
2
|
-
|
3
|
-
#
|
4
|
-
# The page_objects method returns a hash table of your web or native mobile app's page objects and associated page
|
5
|
-
# classes to be instantiated by the TestCentricity PageManager.
|
6
|
-
#
|
7
|
-
# Web Page Object class definitions are contained in the features/support/web/pages folder.
|
8
|
-
# iOS Screen Object class definitions are contained in the features/support/ios/screens folder.
|
9
|
-
# Android Screen Object class definitions are contained in the features/support/android/screens folder.
|
10
|
-
#
|
11
|
-
def page_objects
|
12
|
-
{
|
13
|
-
base_app_screen: BaseAppScreen,
|
14
|
-
about_screen: AboutScreen,
|
15
|
-
login_screen: LoginScreen,
|
16
|
-
webview_screen: WebViewScreen,
|
17
|
-
products_screen: ProductsScreen,
|
18
|
-
product_item_screen: ProductItemScreen,
|
19
|
-
checkout_address_screen: CheckoutAddressScreen,
|
20
|
-
checkout_payment_screen: CheckoutPaymentScreen,
|
21
|
-
qr_code_scanner_screen: QRCodeScannerScreen,
|
22
|
-
geo_location_screen: GeoLocationScreen,
|
23
|
-
biometrics_screen: BiometricsScreen,
|
24
|
-
saucebot_video_screen: SauceBotScreen
|
25
|
-
}
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
World(WorldPages)
|
data/reports/.keep
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
Placeholder file to allow the reports folder to be saved to repository. This folder is required for Jenkins test jobs using the Cucumber Reporting plug-in.
|
@@ -1,22 +0,0 @@
|
|
1
|
-
class TestPage < TestCentricity::PageObject
|
2
|
-
trait(:page_name) { 'Basic Test Page' }
|
3
|
-
trait(:page_url) { '/basic_test_page.html' }
|
4
|
-
trait(:page_locator) { 'form#HTMLFormElements' }
|
5
|
-
|
6
|
-
elements element1: 'div#element1'
|
7
|
-
buttons button1: 'button#button1'
|
8
|
-
textfields field1: 'input#field1'
|
9
|
-
links link1: 'a#link1'
|
10
|
-
ranges range1: 'input#range1'
|
11
|
-
images image1: 'img#image1'
|
12
|
-
radios radio1: 'input#radio1'
|
13
|
-
checkboxes check1: 'input#check1'
|
14
|
-
filefields file1: 'input#file1'
|
15
|
-
labels label1: 'label#label1'
|
16
|
-
tables table1: 'table#table1'
|
17
|
-
selectlists select1: 'select#select1'
|
18
|
-
lists list1: 'ul#list1'
|
19
|
-
videos video1: 'video#video1'
|
20
|
-
audios audio1: 'audio#audio1'
|
21
|
-
sections section1: TestPageSection
|
22
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class TestPageSection < TestCentricity::PageSection
|
2
|
-
trait(:section_locator) { 'div#section' }
|
3
|
-
trait(:section_name) { 'Basic Test Section' }
|
4
|
-
|
5
|
-
elements element1: 'div#element1'
|
6
|
-
buttons button1: 'button#button1'
|
7
|
-
textfields field1: 'input#field1'
|
8
|
-
links link1: 'a#link1'
|
9
|
-
ranges range1: 'input#range1'
|
10
|
-
images image1: 'img#image1'
|
11
|
-
radios radio1: 'input#radio1'
|
12
|
-
checkboxes check1: 'input#check1'
|
13
|
-
filefields file1: 'input#file1'
|
14
|
-
labels label1: 'label#label1'
|
15
|
-
tables table1: 'table#table1'
|
16
|
-
selectlists select1: 'select#select1'
|
17
|
-
lists list1: 'ul#list1'
|
18
|
-
videos video1: 'video#video1'
|
19
|
-
audios audio1: 'audio#audio1'
|
20
|
-
sections section2: TestPageSection
|
21
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class TestScreen < TestCentricity::ScreenObject
|
2
|
-
trait(:page_name) { 'Basic Test Screen' }
|
3
|
-
trait(:page_locator) { { accessibility_id: 'test screen' } }
|
4
|
-
|
5
|
-
elements element1: { accessibility_id: 'element 1' }
|
6
|
-
buttons button1: { accessibility_id: 'button 1' }
|
7
|
-
textfields field1: { accessibility_id: 'text input 1' }
|
8
|
-
checkboxes check1: { accessibility_id: 'checkbox 1' }
|
9
|
-
labels label1: { accessibility_id: 'label 1' }
|
10
|
-
images image1: { accessibility_id: 'image 1' }
|
11
|
-
switches switch1: { accessibility_id: 'switch 1' }
|
12
|
-
lists list1: { accessibility_id: 'list 1' }
|
13
|
-
selectlists selectlist1: { accessibility_id: 'selectlist 1' }
|
14
|
-
alerts alert1: { accessibility_id: 'alert 1' }
|
15
|
-
sections section1: TestScreenSection
|
16
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class TestScreenSection < TestCentricity::ScreenSection
|
2
|
-
trait(:section_locator) { { accessibility_id: 'test section' } }
|
3
|
-
trait(:section_name) { 'Basic Test Section' }
|
4
|
-
|
5
|
-
elements element1: { accessibility_id: 'element 1' }
|
6
|
-
buttons button1: { accessibility_id: 'button 1' }
|
7
|
-
textfields field1: { accessibility_id: 'text input 1' }
|
8
|
-
checkboxes check1: { accessibility_id: 'checkbox 1' }
|
9
|
-
labels label1: { accessibility_id: 'label 1' }
|
10
|
-
images image1: { accessibility_id: 'image 1' }
|
11
|
-
switches switch1: { accessibility_id: 'switch 1' }
|
12
|
-
lists list1: { accessibility_id: 'list 1' }
|
13
|
-
selectlists selectlist1: { accessibility_id: 'selectlist 1' }
|
14
|
-
alert :alert1, { accessibility_id: 'alert 1' }
|
15
|
-
sections section2: TestScreenSection
|
16
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'capybara/rspec'
|
4
|
-
require 'require_all'
|
5
|
-
require 'simplecov'
|
6
|
-
require 'testcentricity'
|
7
|
-
require 'testcentricity_web'
|
8
|
-
|
9
|
-
require_rel 'fixtures'
|
10
|
-
|
11
|
-
include TestCentricity
|
12
|
-
|
13
|
-
SimpleCov.command_name("RSpec-#{Time.now.strftime('%Y%m%d%H%M%S')}")
|
14
|
-
|
15
|
-
$LOAD_PATH << './lib'
|
16
|
-
|
17
|
-
# set the default locale and auto load all translations from config/locales/*.rb,yml.
|
18
|
-
ENV['LOCALE'] = 'en-US' unless ENV['LOCALE']
|
19
|
-
I18n.load_path += Dir['config/locales/*.{rb,yml}']
|
20
|
-
I18n.default_locale = 'en-US'
|
21
|
-
I18n.locale = ENV['LOCALE']
|
22
|
-
Faker::Config.locale = ENV['LOCALE']
|
23
|
-
|
24
|
-
# prevent Test::Unit's AutoRunner from executing during RSpec's rake task
|
25
|
-
Test::Unit.run = true if defined?(Test::Unit) && Test::Unit.respond_to?(:run=)
|
26
|
-
|
27
|
-
RSpec.configure do |config|
|
28
|
-
config.mock_with :rspec do |mocks|
|
29
|
-
mocks.allow_message_expectations_on_nil = true
|
30
|
-
mocks.verify_doubled_constant_names = true
|
31
|
-
mocks.verify_partial_doubles = true
|
32
|
-
end
|
33
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe TestCentricity::AppButton, required: true do
|
4
|
-
subject(:test_button) { described_class.new(:test_button, self, { accessibility_id: 'button 1' }, :page) }
|
5
|
-
|
6
|
-
it 'returns class' do
|
7
|
-
expect(test_button.class).to eql TestCentricity::AppButton
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'registers with type button' do
|
11
|
-
expect(test_button.get_object_type).to eql :button
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'should click the button' do
|
15
|
-
expect(test_button).to receive(:click)
|
16
|
-
test_button.click
|
17
|
-
end
|
18
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe TestCentricity::AppCheckBox, required: true do
|
4
|
-
subject(:test_check) { described_class.new(:test_check, self, { accessibility_id: 'check 1' }, :page) }
|
5
|
-
|
6
|
-
it 'returns class' do
|
7
|
-
expect(test_check.class).to eql TestCentricity::AppCheckBox
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'registers with type checkbox' do
|
11
|
-
expect(test_check.get_object_type).to eql :checkbox
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'should check the checkbox' do
|
15
|
-
expect(test_check).to receive(:check)
|
16
|
-
test_check.check
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should uncheck the checkbox' do
|
20
|
-
expect(test_check).to receive(:uncheck)
|
21
|
-
test_check.uncheck
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should know if checkbox is checked' do
|
25
|
-
allow(test_check).to receive(:checked?).and_return(true)
|
26
|
-
expect(test_check.checked?).to eq(true)
|
27
|
-
end
|
28
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe TestCentricity::AppImage, required: true do
|
4
|
-
subject(:test_image) { described_class.new(:test_image, self, { accessibility_id: 'image 1' }, :page) }
|
5
|
-
|
6
|
-
it 'returns class' do
|
7
|
-
expect(test_image.class).to eql TestCentricity::AppImage
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'registers with type image' do
|
11
|
-
expect(test_image.get_object_type).to eql :image
|
12
|
-
end
|
13
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe TestCentricity::AppLabel, required: true do
|
4
|
-
subject(:test_label) { described_class.new(:test_label, self, { accessibility_id: 'label 1' }, :page) }
|
5
|
-
|
6
|
-
it 'returns class' do
|
7
|
-
expect(test_label.class).to eql TestCentricity::AppLabel
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'registers with type label' do
|
11
|
-
expect(test_label.get_object_type).to eql :label
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'returns caption' do
|
15
|
-
allow(test_label).to receive(:caption).and_return('caption')
|
16
|
-
expect(test_label.caption).to eql 'caption'
|
17
|
-
end
|
18
|
-
end
|