testcentricity 3.0.3 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 653059007c2c5f64363dd2d44956b75609a84adffa34a8e9a9d1801b65686dd3
4
- data.tar.gz: 8913e34345d85bb0877a8a924b4acc8df39d690f320c72b25787cfa524fd7564
3
+ metadata.gz: e4c7b4120e8589701d29a850600108df295c1c199fa8c19e9f6f92bd76b49a47
4
+ data.tar.gz: 956e90ac6395ed32e69c2fd7558977398b8c42c075577d858090ce194da8c668
5
5
  SHA512:
6
- metadata.gz: 021c2b6c8e01f0909b55d8d99797c37b92d3c77fd08665b7760b4943568064cdfebbc167c194a078cb7a0e250f606c83475ac1329d8ac9c032873cbe3f175b38
7
- data.tar.gz: e448537732ba7b53f4dad239f9c9695031ac501bce2aff0f64eed50e459c573ae2af431ef73a1732a850a756d0a496436d26e9c3c7c766d08f14ea4933561616
6
+ metadata.gz: b389a6ce9b701bb380ae02d34b7dc2880617aa315738a59082dfabf3c00fc2411d4f7ab99b3102f048918c9cc77e2e02b3b475fae3836986bfcc2237d7495112
7
+ data.tar.gz: b8d6b8ce2cb4cf7f98d66b8fe7ea7a9e4a1db0a07d3410660d5e6c06d962dc0bb48ce761d8998b4ac1475165ae042f8116109f049b8241e6eda7f64eb7147430
data/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
4
 
5
+ ## [3.0.4] - 02-JUNE-2022
6
+
7
+ ### Added
8
+ * Added `AppUIElement.wait_until_enabled` method.
9
+
10
+ ### Updated
11
+ * Incorporated all changes from the [TestCentricity™ Web gem](https://rubygems.org/gems/testcentricity_web) version 4.2.4, which is
12
+ bundled with this gem.
13
+
14
+
5
15
  ## [3.0.3] - 30-MAY-2022
6
16
 
7
17
  ### Added
data/README.md CHANGED
@@ -536,6 +536,7 @@ With TestCentricity, all native app UI elements are based on the `AppUIElement`
536
536
  element.wait_until_gone(seconds)
537
537
  element.wait_until_visible(seconds)
538
538
  element.wait_until_hidden(seconds)
539
+ element.wait_until_enabled(seconds)
539
540
  element.wait_until_value_is(value, seconds)
540
541
  element.wait_until_value_changes(seconds)
541
542
 
data/Rakefile CHANGED
@@ -35,7 +35,7 @@ desc 'Run required specs and Cucumber features'
35
35
  task required: [:required_specs, :android_sim, :ios_sim]
36
36
 
37
37
 
38
- desc 'Run all specs and Cucumber features'
38
+ desc 'Run all specs'
39
39
  task all_specs: [:required_specs, :web_specs]
40
40
 
41
41
 
@@ -52,7 +52,7 @@ end
52
52
  desc 'Build and release new version'
53
53
  task :release do
54
54
  version = TestCentricity::VERSION
55
- puts "Releasing #{version}, y/n?"
55
+ puts "Releasing version #{version} of TestCentricity gem, y/n?"
56
56
  exit(1) unless $stdin.gets.chomp == 'y'
57
57
  sh 'gem build testcentricity.gemspec && ' \
58
58
  "gem push testcentricity-#{version}.gem"
@@ -7,3 +7,70 @@ Environments:
7
7
  IOS_APP_PATH: '/Users/Shared/Test_Apps/iOS/MyRNDemoApp.app'
8
8
  IOS_IPA_PATH: '/Users/Shared/Test_Apps/iOS/iOS-Real-Device-MyRNDemoApp.1.3.0-162.ipa'
9
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'
@@ -24,3 +24,15 @@ Feature: App screen deep links
24
24
  |Products |Checkout - Address |
25
25
  |Products |Checkout - Payment |
26
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 |
@@ -60,3 +60,8 @@ end
60
60
  When(/^I (.*) the popup request modal$/) do |action|
61
61
  PageManager.current_page.modal_action(action)
62
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
@@ -0,0 +1,39 @@
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
@@ -3,10 +3,24 @@ class ProductsScreen < BaseAppScreen
3
3
  trait(:page_locator) { { accessibility_id: 'products screen' } }
4
4
  trait(:page_url) { 'store-overview' }
5
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
+
6
19
  def verify_page_ui
7
20
  super
8
21
  ui = {
9
- header_label => { visible: true, caption: 'Products' }
22
+ header_label => { visible: true, caption: 'Products' },
23
+ product_list => { visible: true, itemcount: 6 }
10
24
  }
11
25
  verify_ui_states(ui)
12
26
  end
@@ -0,0 +1,13 @@
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
@@ -0,0 +1,27 @@
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
@@ -0,0 +1,39 @@
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
@@ -3,10 +3,24 @@ class ProductsScreen < BaseAppScreen
3
3
  trait(:page_locator) { { accessibility_id: 'products screen' } }
4
4
  trait(:page_url) { 'store-overview' }
5
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
+
6
19
  def verify_page_ui
7
20
  super
8
21
  ui = {
9
- header_label => { visible: true, caption: 'Products' }
22
+ header_label => { visible: true, caption: 'Products' },
23
+ # product_list => { visible: true, itemcount: 6 }
10
24
  }
11
25
  verify_ui_states(ui)
12
26
  end
@@ -0,0 +1,13 @@
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
@@ -4,7 +4,10 @@ module WorldData
4
4
  # by the TestCentricity™ DataManager. Data Object class definitions are contained in the features/support/data folder.
5
5
  #
6
6
  def data_objects
7
- { user_data_source: UserDataSource }
7
+ {
8
+ user_data_source: UserDataSource,
9
+ product_data_source: ProductDataSource
10
+ }
8
11
  end
9
12
  end
10
13
 
@@ -15,6 +15,7 @@ module WorldPages
15
15
  login_screen: LoginScreen,
16
16
  webview_screen: WebViewScreen,
17
17
  products_screen: ProductsScreen,
18
+ product_item_screen: ProductItemScreen,
18
19
  checkout_address_screen: CheckoutAddressScreen,
19
20
  checkout_payment_screen: CheckoutPaymentScreen,
20
21
  qr_code_scanner_screen: QRCodeScannerScreen,
@@ -174,12 +174,16 @@ module TestCentricity
174
174
  # @example
175
175
  # run_button.wait_until_exists(0.5)
176
176
  #
177
- def wait_until_exists(seconds = nil)
177
+ def wait_until_exists(seconds = nil, post_exception = true)
178
178
  timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
179
179
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
180
180
  wait.until { exists? }
181
181
  rescue
182
- raise "Could not find UI #{object_ref_message} after #{timeout} seconds" unless exists?
182
+ if post_exception
183
+ raise "Could not find UI #{object_ref_message} after #{timeout} seconds" unless exists?
184
+ else
185
+ exists?
186
+ end
183
187
  end
184
188
 
185
189
  # Wait until the object no longer exists, or until the specified wait time has expired. If the wait time is nil, then
@@ -189,12 +193,16 @@ module TestCentricity
189
193
  # @example
190
194
  # logout_button.wait_until_gone(5)
191
195
  #
192
- def wait_until_gone(seconds = nil)
196
+ def wait_until_gone(seconds = nil, post_exception = true)
193
197
  timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
194
198
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
195
199
  wait.until { !exists? }
196
200
  rescue
197
- raise "UI #{object_ref_message} remained visible after #{timeout} seconds" if exists?
201
+ if post_exception
202
+ raise "UI #{object_ref_message} remained visible after #{timeout} seconds" if exists?
203
+ else
204
+ exists?
205
+ end
198
206
  end
199
207
 
200
208
  # Wait until the object is visible, or until the specified wait time has expired. If the wait time is nil, then the
@@ -204,12 +212,16 @@ module TestCentricity
204
212
  # @example
205
213
  # run_button.wait_until_visible(0.5)
206
214
  #
207
- def wait_until_visible(seconds = nil)
215
+ def wait_until_visible(seconds = nil, post_exception = true)
208
216
  timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
209
217
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
210
218
  wait.until { visible? }
211
219
  rescue
212
- raise "Could not find UI #{object_ref_message} after #{timeout} seconds" unless visible?
220
+ if post_exception
221
+ raise "Could not find UI #{object_ref_message} after #{timeout} seconds" unless visible?
222
+ else
223
+ visible?
224
+ end
213
225
  end
214
226
 
215
227
  # Wait until the object is hidden, or until the specified wait time has expired. If the wait time is nil, then the
@@ -219,12 +231,35 @@ module TestCentricity
219
231
  # @example
220
232
  # run_button.wait_until_hidden(10)
221
233
  #
222
- def wait_until_hidden(seconds = nil)
234
+ def wait_until_hidden(seconds = nil, post_exception = true)
223
235
  timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
224
236
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
225
237
  wait.until { hidden? }
226
238
  rescue
227
- raise "UI #{object_ref_message} remained visible after #{timeout} seconds" if visible?
239
+ if post_exception
240
+ raise "UI #{object_ref_message} remained visible after #{timeout} seconds" if visible?
241
+ else
242
+ hidden?
243
+ end
244
+ end
245
+
246
+ # Wait until the object is enabled, or until the specified wait time has expired. If the wait time is nil, then the
247
+ # wait time will be Environ.default_max_wait_time.
248
+ #
249
+ # @param seconds [Integer or Float] wait time in seconds
250
+ # @example
251
+ # run_button.wait_until_enabled(10)
252
+ #
253
+ def wait_until_enabled(seconds = nil, post_exception = true)
254
+ timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
255
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
256
+ wait.until { enabled? }
257
+ rescue
258
+ if post_exception
259
+ raise "UI #{object_ref_message} remained disabled after #{timeout} seconds" unless enabled?
260
+ else
261
+ enabled?
262
+ end
228
263
  end
229
264
 
230
265
  # Wait until the object's value equals the specified value, or until the specified wait time has expired. If the wait
@@ -237,12 +272,16 @@ module TestCentricity
237
272
  # or
238
273
  # total_weight_field.wait_until_value_is({ :greater_than => '250' }, 5)
239
274
  #
240
- def wait_until_value_is(value, seconds = nil)
275
+ def wait_until_value_is(value, seconds = nil, post_exception = true)
241
276
  timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
242
277
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
243
278
  wait.until { compare(value, get_value) }
244
279
  rescue
245
- raise "Value of UI #{object_ref_message} failed to equal '#{value}' after #{timeout} seconds" unless get_value == value
280
+ if post_exception
281
+ raise "Value of UI #{object_ref_message} failed to equal '#{value}' after #{timeout} seconds" unless get_value == value
282
+ else
283
+ get_value == value
284
+ end
246
285
  end
247
286
 
248
287
  # Wait until the object's value changes to a different value, or until the specified wait time has expired. If the
@@ -252,13 +291,17 @@ module TestCentricity
252
291
  # @example
253
292
  # basket_grand_total_label.wait_until_value_changes(5)
254
293
  #
255
- def wait_until_value_changes(seconds = nil)
294
+ def wait_until_value_changes(seconds = nil, post_exception = true)
256
295
  value = get_value
257
296
  timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
258
297
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
259
298
  wait.until { get_value != value }
260
299
  rescue
261
- raise "Value of UI #{object_ref_message} failed to change from '#{value}' after #{timeout} seconds" if get_value == value
300
+ if post_exception
301
+ raise "Value of UI #{object_ref_message} failed to change from '#{value}' after #{timeout} seconds" if get_value == value
302
+ else
303
+ get_value == value
304
+ end
262
305
  end
263
306
 
264
307
  def width
@@ -1,3 +1,3 @@
1
1
  module TestCentricity
2
- VERSION = '3.0.3'
2
+ VERSION = '3.0.4'
3
3
  end
@@ -43,6 +43,6 @@ Gem::Specification.new do |spec|
43
43
  spec.add_runtime_dependency 'appium_lib'
44
44
  spec.add_runtime_dependency 'curb'
45
45
  spec.add_runtime_dependency 'json'
46
- spec.add_runtime_dependency 'testcentricity_web', '>= 4.2.2'
46
+ spec.add_runtime_dependency 'testcentricity_web', '>= 4.2.4'
47
47
  spec.add_runtime_dependency 'test-unit'
48
48
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: testcentricity
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.3
4
+ version: 3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - A.J. Mrozinski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-31 00:00:00.000000000 Z
11
+ date: 2022-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -184,14 +184,14 @@ dependencies:
184
184
  requirements:
185
185
  - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 4.2.2
187
+ version: 4.2.4
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
- version: 4.2.2
194
+ version: 4.2.4
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: test-unit
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -233,7 +233,6 @@ files:
233
233
  - Rakefile
234
234
  - config/cucumber.yml
235
235
  - config/locales/en-US.yml
236
- - config/test_data/LOCAL_data.yml
237
236
  - config/test_data/data.yml
238
237
  - features/deep_links.feature
239
238
  - features/login.feature
@@ -246,11 +245,14 @@ files:
246
245
  - features/support/android/screens/checkout_payment_screen.rb
247
246
  - features/support/android/screens/geo_location_screen.rb
248
247
  - features/support/android/screens/login_screen.rb
248
+ - features/support/android/screens/product_item_screen.rb
249
249
  - features/support/android/screens/products_screen.rb
250
250
  - features/support/android/screens/qr_code_scanner_screen.rb
251
251
  - features/support/android/screens/saucebot_screen.rb
252
252
  - features/support/android/screens/webview_screen.rb
253
+ - features/support/android/sections/list_items/product_list_item.rb
253
254
  - features/support/android/sections/nav_widgets/nav_menu.rb
255
+ - features/support/data/product_data.rb
254
256
  - features/support/data/user_data.rb
255
257
  - features/support/env.rb
256
258
  - features/support/hooks.rb
@@ -261,11 +263,12 @@ files:
261
263
  - features/support/ios/screens/checkout_payment_screen.rb
262
264
  - features/support/ios/screens/geo_location_screen.rb
263
265
  - features/support/ios/screens/login_screen.rb
266
+ - features/support/ios/screens/product_item_screen.rb
264
267
  - features/support/ios/screens/products_screen.rb
265
268
  - features/support/ios/screens/qr_code_scanner_screen.rb
266
269
  - features/support/ios/screens/saucebot_screen.rb
267
270
  - features/support/ios/screens/webview_screen.rb
268
- - features/support/ios/sections/list_items/product_cell_item.rb
271
+ - features/support/ios/sections/list_items/product_list_item.rb
269
272
  - features/support/ios/sections/nav_widgets/nav_bar.rb
270
273
  - features/support/ios/sections/nav_widgets/nav_menu.rb
271
274
  - features/support/shared_components/screens/base_app_screen.rb
@@ -355,11 +358,14 @@ test_files:
355
358
  - features/support/android/screens/checkout_payment_screen.rb
356
359
  - features/support/android/screens/geo_location_screen.rb
357
360
  - features/support/android/screens/login_screen.rb
361
+ - features/support/android/screens/product_item_screen.rb
358
362
  - features/support/android/screens/products_screen.rb
359
363
  - features/support/android/screens/qr_code_scanner_screen.rb
360
364
  - features/support/android/screens/saucebot_screen.rb
361
365
  - features/support/android/screens/webview_screen.rb
366
+ - features/support/android/sections/list_items/product_list_item.rb
362
367
  - features/support/android/sections/nav_widgets/nav_menu.rb
368
+ - features/support/data/product_data.rb
363
369
  - features/support/data/user_data.rb
364
370
  - features/support/env.rb
365
371
  - features/support/hooks.rb
@@ -370,11 +376,12 @@ test_files:
370
376
  - features/support/ios/screens/checkout_payment_screen.rb
371
377
  - features/support/ios/screens/geo_location_screen.rb
372
378
  - features/support/ios/screens/login_screen.rb
379
+ - features/support/ios/screens/product_item_screen.rb
373
380
  - features/support/ios/screens/products_screen.rb
374
381
  - features/support/ios/screens/qr_code_scanner_screen.rb
375
382
  - features/support/ios/screens/saucebot_screen.rb
376
383
  - features/support/ios/screens/webview_screen.rb
377
- - features/support/ios/sections/list_items/product_cell_item.rb
384
+ - features/support/ios/sections/list_items/product_list_item.rb
378
385
  - features/support/ios/sections/nav_widgets/nav_bar.rb
379
386
  - features/support/ios/sections/nav_widgets/nav_menu.rb
380
387
  - features/support/shared_components/screens/base_app_screen.rb
@@ -1,15 +0,0 @@
1
-
2
- User_creds:
3
- valid_data:
4
- username: 'bob@example.com'
5
- password: '10203040'
6
- invalid_user:
7
- username: 'iggy.snicklefritz@example.com'
8
- password: '10203040'
9
- locked_account:
10
- username: 'alice@example.com'
11
- password: '10203040'
12
- no_username:
13
- password: '10203040'
14
- no_password:
15
- username: 'bob@example.com'
@@ -1,13 +0,0 @@
1
- class ProductCellItem < TestCentricity::ScreenSection
2
- trait(:section_name) { 'Product Cell Item' }
3
- trait(:section_locator) { { xpath: "//XCUIElementTypeOther[@name='store item']" } }
4
-
5
- # Product Cell Item UI elements
6
- labels product_name: { xpath: '(//XCUIElementTypeOther)[1]' },
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