testcentricity_apps 4.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -0
  3. data/CHANGELOG.md +193 -0
  4. data/LICENSE.md +27 -0
  5. data/README.md +2297 -0
  6. data/lib/testcentricity_apps/app_core/appium_connect_helper.rb +667 -0
  7. data/lib/testcentricity_apps/app_core/screen_object.rb +494 -0
  8. data/lib/testcentricity_apps/app_core/screen_objects_helper.rb +211 -0
  9. data/lib/testcentricity_apps/app_core/screen_section.rb +669 -0
  10. data/lib/testcentricity_apps/app_elements/alert.rb +152 -0
  11. data/lib/testcentricity_apps/app_elements/app_element.rb +728 -0
  12. data/lib/testcentricity_apps/app_elements/button.rb +10 -0
  13. data/lib/testcentricity_apps/app_elements/checkbox.rb +61 -0
  14. data/lib/testcentricity_apps/app_elements/image.rb +10 -0
  15. data/lib/testcentricity_apps/app_elements/label.rb +10 -0
  16. data/lib/testcentricity_apps/app_elements/list.rb +188 -0
  17. data/lib/testcentricity_apps/app_elements/menu.rb +159 -0
  18. data/lib/testcentricity_apps/app_elements/menubar.rb +78 -0
  19. data/lib/testcentricity_apps/app_elements/radio.rb +61 -0
  20. data/lib/testcentricity_apps/app_elements/selectlist.rb +126 -0
  21. data/lib/testcentricity_apps/app_elements/switch.rb +66 -0
  22. data/lib/testcentricity_apps/app_elements/textfield.rb +51 -0
  23. data/lib/testcentricity_apps/appium_server.rb +76 -0
  24. data/lib/testcentricity_apps/data_objects/data_objects_helper.rb +100 -0
  25. data/lib/testcentricity_apps/data_objects/environment.rb +423 -0
  26. data/lib/testcentricity_apps/exception_queue_helper.rb +160 -0
  27. data/lib/testcentricity_apps/utility_helpers.rb +48 -0
  28. data/lib/testcentricity_apps/version.rb +3 -0
  29. data/lib/testcentricity_apps/world_extensions.rb +61 -0
  30. data/lib/testcentricity_apps.rb +103 -0
  31. metadata +322 -0
@@ -0,0 +1,10 @@
1
+ module TestCentricity
2
+ module AppElements
3
+ class AppButton < AppUIElement
4
+ def initialize(name, parent, locator, context)
5
+ super
6
+ @type = :button
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,61 @@
1
+ module TestCentricity
2
+ module AppElements
3
+ class AppCheckBox < AppUIElement
4
+ def initialize(name, parent, locator, context)
5
+ super
6
+ @type = :checkbox
7
+ end
8
+
9
+ # Is checkbox checked?
10
+ #
11
+ # @return [Boolean]
12
+ # @example
13
+ # remember_me_checkbox.checked?
14
+ #
15
+ def checked?
16
+ obj = element
17
+ object_not_found_exception(obj)
18
+ if Environ.is_macos?
19
+ state = obj.value
20
+ state.to_bool
21
+ else
22
+ obj.selected?
23
+ end
24
+ end
25
+
26
+ # Set the check state of a checkbox object.
27
+ #
28
+ # @example
29
+ # remember_me_checkbox.check
30
+ #
31
+ def check
32
+ set_checkbox_state(true)
33
+ end
34
+
35
+ # Uncheck a checkbox object.
36
+ #
37
+ # @example
38
+ # remember_me_checkbox.uncheck
39
+ #
40
+ def uncheck
41
+ set_checkbox_state(false)
42
+ end
43
+
44
+ # Set the check state of a checkbox object.
45
+ #
46
+ # @param state [Boolean] true = checked / false = unchecked
47
+ # @example
48
+ # remember_me_checkbox.set_checkbox_state(true)
49
+ #
50
+ def set_checkbox_state(state)
51
+ obj = element
52
+ object_not_found_exception(obj)
53
+ if state
54
+ obj.click unless obj.selected?
55
+ else
56
+ obj.click if obj.selected?
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,10 @@
1
+ module TestCentricity
2
+ module AppElements
3
+ class AppImage < AppUIElement
4
+ def initialize(name, parent, locator, context)
5
+ super
6
+ @type = :image
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module TestCentricity
2
+ module AppElements
3
+ class AppLabel < AppUIElement
4
+ def initialize(name, parent, locator, context)
5
+ super
6
+ @type = :label
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,188 @@
1
+ module TestCentricity
2
+ module AppElements
3
+ class AppList < AppUIElement
4
+ attr_accessor :list_item
5
+ attr_accessor :scrolling
6
+ attr_accessor :item_objects
7
+
8
+ def initialize(name, parent, locator, context)
9
+ super
10
+ @type = :list
11
+ @item_objects = nil
12
+ @scrolling = :vertical
13
+ @list_item = case Environ.device_os
14
+ when :ios, :mac
15
+ { class: 'XCUIElementTypeOther' }
16
+ when :android
17
+ { class: 'android.view.ViewGroup' }
18
+ else
19
+ nil
20
+ end
21
+ end
22
+
23
+ def define_list_elements(element_spec)
24
+ element_spec.each do |element, value|
25
+ case element
26
+ when :list_item
27
+ @list_item = value
28
+ when :scrolling
29
+ @scrolling = value
30
+ else
31
+ raise "#{element} is not a recognized list element"
32
+ end
33
+ end
34
+ end
35
+
36
+ def scroll_mode
37
+ obj = element
38
+ object_not_found_exception(obj)
39
+ @scrolling
40
+ end
41
+
42
+ def item_refs
43
+ obj = element
44
+ object_not_found_exception(obj)
45
+ @item_objects
46
+ end
47
+
48
+ # Return the number of items in a list object.
49
+ #
50
+ # @return [Integer]
51
+ # @example
52
+ # num_nav_items = nav_list.get_item_count
53
+ #
54
+ def get_item_count
55
+ obj = element
56
+ object_not_found_exception(obj)
57
+ if Environ.is_ios? && obj.attribute(:type) == 'XCUIElementTypePickerWheel'
58
+ raise 'This method is not supported for XCUIElementTypePickerWheel controls'
59
+ end
60
+ list_loc = get_list_item_locator
61
+ items = obj.find_elements(list_loc.keys[0], list_loc.values[0])
62
+ if items.size > 0 && Environ.is_android?
63
+ start_count = items.count
64
+ direction = @scrolling == :horizontal ? :right : :down
65
+ scroll_count = 0
66
+ loop do
67
+ save_count = items.count
68
+ swipe_gesture(direction)
69
+ scroll_count += 1
70
+ obj.find_elements(list_loc.keys[0], list_loc.values[0]).each do |item|
71
+ items.push(item) unless items.include?(item)
72
+ end
73
+ break if items.count == save_count
74
+ end
75
+ direction = @scrolling == :horizontal ? :left : :up
76
+ scroll_count.times do
77
+ swipe_gesture(direction)
78
+ end
79
+ end
80
+ @item_objects = items if Environ.is_android? && start_count < items.count
81
+ items.count
82
+ end
83
+
84
+ # Return array of strings of all items in a list object.
85
+ #
86
+ # @return [Array]
87
+ # @example
88
+ # nav_items = nav_list.get_options
89
+ #
90
+ def get_list_items
91
+ list_items = []
92
+ obj = element
93
+ object_not_found_exception(obj)
94
+ if Environ.is_ios? && obj.attribute(:type) == 'XCUIElementTypePickerWheel'
95
+ raise 'This method is not supported for XCUIElementTypePickerWheel controls'
96
+ end
97
+ list_loc = get_list_item_locator
98
+ items = obj.find_elements(list_loc.keys[0], list_loc.values[0])
99
+ items.each do |item|
100
+ list_items.push(item.text)
101
+ end
102
+ list_items
103
+ end
104
+
105
+ def get_list_item(index)
106
+ items = get_list_items
107
+ items[index - 1]
108
+ end
109
+
110
+ # Select the specified item in a list object. Accepts a String or Integer.
111
+ #
112
+ # @param item [String, Integer] text or index of item to select
113
+ #
114
+ # @example
115
+ # province_list.choose_item(2)
116
+ # province_list.choose_item('Manitoba')
117
+ #
118
+ def choose_item(item)
119
+ obj = element
120
+ object_not_found_exception(obj)
121
+ if Environ.is_ios? && obj.attribute(:type) == 'XCUIElementTypePickerWheel'
122
+ obj.send_keys(item)
123
+ else
124
+ list_loc = get_list_item_locator
125
+ items = obj.find_elements(list_loc.keys[0], list_loc.values[0])
126
+ if item.is_a?(Integer)
127
+ items[item - 1].click
128
+ else
129
+ items.each do |list_item|
130
+ if list_item.text == item
131
+ list_item.click
132
+ break
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ # Wait until the list's item_count equals the specified value, or until the specified wait time has expired. If the
140
+ # wait time is nil, then the wait time will be Environ.default_max_wait_time.
141
+ #
142
+ # @param value [Integer or Hash] value expected or comparison hash
143
+ # @param seconds [Integer or Float] wait time in seconds
144
+ # @example
145
+ # search_results_list.wait_until_item_count_is(10, 15)
146
+ # or
147
+ # search_results_list.wait_until_item_count_is({ :greater_than_or_equal => 1 }, 5)
148
+ #
149
+ def wait_until_item_count_is(value, seconds = nil)
150
+ timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
151
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
152
+ wait.until { compare(value, get_item_count) }
153
+ rescue
154
+ raise "Value of List #{object_ref_message} failed to equal '#{value}' after #{timeout} seconds" unless get_item_count == value
155
+ end
156
+
157
+ # Wait until the list's item_count changes, or until the specified wait time has expired. If the wait time is nil,
158
+ # then the wait time will be Environ.default_max_wait_time.
159
+ #
160
+ # @param seconds [Integer or Float] wait time in seconds
161
+ # @example
162
+ # search_results_list.wait_until_item_count_changes(10)
163
+ #
164
+ def wait_until_item_count_changes(seconds = nil)
165
+ value = get_item_count
166
+ timeout = seconds.nil? ? Environ.default_max_wait_time : seconds
167
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
168
+ wait.until { get_item_count != value }
169
+ rescue
170
+ raise "Value of List #{object_ref_message} failed to change from '#{value}' after #{timeout} seconds" if get_item_count == value
171
+ end
172
+
173
+ private
174
+
175
+ def get_list_item_locator
176
+ if @list_item.nil?
177
+ case Environ.device_os
178
+ when :ios, :mac
179
+ define_list_elements({ :list_item => { class: 'XCUIElementTypeOther' } } )
180
+ when :android
181
+ define_list_elements({ :list_item => { class: 'android.view.ViewGroup' } } )
182
+ end
183
+ end
184
+ @list_item
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,159 @@
1
+ module TestCentricity
2
+ module AppElements
3
+ class AppMenu < AppUIElement
4
+ attr_accessor :menu_item
5
+ attr_accessor :key_map
6
+
7
+ def initialize(name, parent, locator, context)
8
+ super
9
+ @type = :menu
10
+ @menu_item = { class: 'XCUIElementTypeMenuItem' }
11
+ @key_map = nil
12
+ end
13
+
14
+ def define_menu_elements(element_spec)
15
+ element_spec.each do |element, value|
16
+ case element
17
+ when :menu_item
18
+ @menu_item = value
19
+ when :key_map
20
+ @key_map = value
21
+ else
22
+ raise "#{element} is not a recognized menu element"
23
+ end
24
+ end
25
+ end
26
+
27
+ # Return the number of menu items in a menu object.
28
+ #
29
+ # @return [Integer]
30
+ # @example
31
+ # num_menu_items = view_menu.get_item_count
32
+ #
33
+ def get_item_count
34
+ obj = element
35
+ object_not_found_exception(obj)
36
+ menu_loc = get_menu_item_locator
37
+ items = obj.find_elements(menu_loc.keys[0], menu_loc.values[0])
38
+ items.count
39
+ end
40
+
41
+ # Return array of strings of all menu item captions in a menu object.
42
+ #
43
+ # @return [Array]
44
+ # @example
45
+ # view_items = view_menu.get_menu_items
46
+ #
47
+ def get_menu_items
48
+ menu_items = []
49
+ obj = element
50
+ object_not_found_exception(obj)
51
+ menu_loc = get_menu_item_locator
52
+ items = obj.find_elements(menu_loc.keys[0], menu_loc.values[0])
53
+ items.each do |item|
54
+ menu_items.push(item.text)
55
+ end
56
+ menu_items
57
+ end
58
+
59
+ alias get_list_items get_menu_items
60
+
61
+ # Return text caption of menu item at specified index.
62
+ #
63
+ # @return [String]
64
+ # @example
65
+ # menu_item_text = view_menu.get_menu_item(3)
66
+ #
67
+ def get_menu_item(index)
68
+ items = get_menu_items
69
+ items[index - 1]
70
+ end
71
+
72
+ alias get_list_item get_menu_item
73
+
74
+ def get_item_data(index = nil)
75
+ menu_items = []
76
+ obj = element
77
+ object_not_found_exception(obj)
78
+ menu_loc = get_menu_item_locator
79
+ items = obj.find_elements(menu_loc.keys[0], menu_loc.values[0])
80
+ items.each do |item|
81
+ caption = item.text
82
+ state = item.enabled?
83
+ menu_items.push(
84
+ {
85
+ caption: caption,
86
+ enabled: state
87
+ }
88
+ )
89
+ end
90
+ if index.nil?
91
+ menu_items
92
+ else
93
+ menu_items[index - 1]
94
+ end
95
+ end
96
+
97
+ # Return enabled state of menu item at specified index.
98
+ #
99
+ # @return [Boolean]
100
+ # @example
101
+ # menu_item_status = view_menu.get_item_enabled(3)
102
+ #
103
+ def get_item_enabled(index)
104
+ obj = element
105
+ object_not_found_exception(obj)
106
+ menu_loc = get_menu_item_locator
107
+ items = obj.find_elements(menu_loc.keys[0], menu_loc.values[0])
108
+ items[index - 1].enabled?
109
+ end
110
+
111
+ # Select the specified menu item in a menu object using the specified selection method (mouse or keyboard shortcut).
112
+ # Accepts a String or Integer representing either the menu item caption or item index.
113
+ #
114
+ # @param item [String, Integer] menu item text or index of menu item to select
115
+ # @param method [Symbol] valid selectors are :mouse, :keys, or :keyboard (default = :mouse)
116
+ #
117
+ # @example
118
+ # view_menu.choose_menu_item(2)
119
+ # view_menu.choose_menu_item('Programmer')
120
+ #
121
+ def choose_menu_item(item, method = :mouse)
122
+ obj = element
123
+ object_not_found_exception(obj)
124
+ case method
125
+ when :mouse
126
+ self.click unless self.visible?
127
+ menu_loc = get_menu_item_locator
128
+ items = obj.find_elements(menu_loc.keys[0], menu_loc.values[0])
129
+ case
130
+ when item == :last
131
+ items.last.click
132
+ when item.is_a?(Integer)
133
+ items[item - 1].click
134
+ else
135
+ items.each do |list_item|
136
+ if list_item.text == item
137
+ list_item.click
138
+ break
139
+ end
140
+ end
141
+ end
142
+ when :keys, :keyboard
143
+ keys = @key_map[item]
144
+ raise "No key map found for item #{item}" if keys.empty?
145
+ Environ.appium_driver.execute_script('macos: keys', { keys: keys })
146
+ else
147
+ raise "#{method} is not a valid selector"
148
+ end
149
+ end
150
+
151
+ private
152
+
153
+ def get_menu_item_locator
154
+ define_menu_elements({ :menu_item => { class: 'XCUIElementTypeMenuItem' } }) if @menu_item.nil?
155
+ @menu_item
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,78 @@
1
+ module TestCentricity
2
+ class MenuBar < TestCentricity::ScreenSection
3
+ trait(:section_name) { 'Menu Bar' }
4
+ trait(:section_locator) { { class_chain: '**/XCUIElementTypeMenuBar' } }
5
+
6
+ # Menu Bar UI elements
7
+ list :menu_list, { xpath: '//XCUIElementTypeMenuBar' }
8
+
9
+ def initialize(name, parent, locator, context)
10
+ super
11
+ @parent = nil
12
+ # define the menu bar item element for the menu bar list object
13
+ list_elements = { list_item: { xpath: '(//XCUIElementTypeMenuBarItem)' } }
14
+ menu_list.define_list_elements(list_elements)
15
+ end
16
+
17
+ def get_object_type
18
+ :menubar
19
+ end
20
+
21
+ # Declare and instantiate a single menu UI Element for this MenuBar object.
22
+ #
23
+ # @param element_name [Symbol] name of menu object (as a symbol)
24
+ # @param locator [Hash] { locator_strategy: locator_identifier }
25
+ # @example
26
+ # menu :convert_menu, { xpath: '//XCUIElementTypeMenuBarItem[6]' }
27
+ #
28
+ def self.menu(element_name, locator)
29
+ define_section_element(element_name, TestCentricity::AppElements::AppMenu, locator)
30
+ end
31
+
32
+ # Declare and instantiate a collection of menus for this MenuBar object.
33
+ #
34
+ # @param element_hash [Hash] names of menus (as symbol) and locator Hash
35
+ # @example
36
+ # menus convert_menu: { xpath: '//XCUIElementTypeMenuBarItem[6]' },
37
+ # view_menu: { xpath: '//XCUIElementTypeMenuBarItem[5]' }
38
+ #
39
+ def self.menus(element_hash)
40
+ element_hash.each_pair { |element_name, locator| menu(element_name, locator) }
41
+ end
42
+
43
+ # Return the number of menus in a MenuBar object.
44
+ #
45
+ # @return [Integer]
46
+ # @example
47
+ # num_menus = menu_bar.get_item_count
48
+ #
49
+ def get_item_count
50
+ menu_list.get_item_count
51
+ end
52
+
53
+ # Return array of strings of all menus in a MenuBar object.
54
+ #
55
+ # @return [Array]
56
+ # @example
57
+ # menu_items = menu_bar.get_menubar_items
58
+ #
59
+ def get_menubar_items
60
+ menu_list.get_list_items
61
+ end
62
+
63
+ alias get_list_items get_menubar_items
64
+
65
+ # Return text caption of menu item at specified index.
66
+ #
67
+ # @return [String]
68
+ # @example
69
+ # menubar_item_text = menu_bar.get_menubar_item(3)
70
+ #
71
+ def get_menubar_item(index)
72
+ items = get_list_items
73
+ items[index - 1]
74
+ end
75
+
76
+ alias get_list_item get_menubar_item
77
+ end
78
+ end
@@ -0,0 +1,61 @@
1
+ module TestCentricity
2
+ module AppElements
3
+ class AppRadio < AppUIElement
4
+ def initialize(name, parent, locator, context)
5
+ super
6
+ @type = :radio
7
+ end
8
+
9
+ # Is radio selected?
10
+ #
11
+ # @return [Boolean]
12
+ # @example
13
+ # unicode_radio.selected?
14
+ #
15
+ def selected?
16
+ obj = element
17
+ object_not_found_exception(obj)
18
+ if Environ.is_macos?
19
+ state = obj.value
20
+ state.to_bool
21
+ else
22
+ obj.selected?
23
+ end
24
+ end
25
+
26
+ # Set the selected state of a radio button object.
27
+ #
28
+ # @example
29
+ # unicode_radio.select
30
+ #
31
+ def select
32
+ set_selected_state(true)
33
+ end
34
+
35
+ # Unselect a radio button object.
36
+ #
37
+ # @example
38
+ # unicode_radio.unselect
39
+ #
40
+ def unselect
41
+ set_selected_state(false)
42
+ end
43
+
44
+ # Set the selected state of a radio button object.
45
+ #
46
+ # @param state [Boolean] true = selected / false = unselected
47
+ # @example
48
+ # ascii_radio.set_selected_state(true)
49
+ #
50
+ def set_selected_state(state)
51
+ obj = element
52
+ object_not_found_exception(obj)
53
+ if state
54
+ obj.click unless obj.selected?
55
+ else
56
+ obj.click if obj.selected?
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,126 @@
1
+ module TestCentricity
2
+ module AppElements
3
+ class AppSelectList < AppUIElement
4
+ attr_accessor :list_item
5
+
6
+ def initialize(name, parent, locator, context)
7
+ super
8
+ @type = :selectlist
9
+ @list_item = case Environ.device_os
10
+ when :mac
11
+ { class: 'XCUIElementTypeMenuItem' }
12
+ when :ios
13
+ { class: 'XCUIElementTypeOther' }
14
+ when :android
15
+ { class: 'android.view.ViewGroup' }
16
+ else
17
+ nil
18
+ end
19
+ end
20
+
21
+ def define_list_elements(element_spec)
22
+ element_spec.each do |element, value|
23
+ case element
24
+ when :list_item
25
+ @list_item = value
26
+ else
27
+ raise "#{element} is not a recognized selectlist element"
28
+ end
29
+ end
30
+ end
31
+
32
+ # Return the number of items in a list object.
33
+ #
34
+ # @return [Integer]
35
+ # @example
36
+ # num_convert_items = convert_list.get_list_items
37
+ #
38
+ def get_item_count
39
+ obj = element
40
+ object_not_found_exception(obj)
41
+ if Environ.is_ios? && obj.attribute(:type) == 'XCUIElementTypePickerWheel'
42
+ raise 'This method is not supported for XCUIElementTypePickerWheel controls'
43
+ end
44
+ list_loc = get_list_item_locator
45
+ self.click if Environ.is_macos?
46
+ items = obj.find_elements(list_loc.keys[0], list_loc.values[0])
47
+ self.click if Environ.is_macos?
48
+ items.count
49
+ end
50
+
51
+ # Return array of strings of all items in a selectlist object.
52
+ #
53
+ # @return [Array]
54
+ # @example
55
+ # convert_items = convert_list.get_list_items
56
+ #
57
+ def get_list_items
58
+ list_items = []
59
+ obj = element
60
+ object_not_found_exception(obj)
61
+ if Environ.is_ios? && obj.attribute(:type) == 'XCUIElementTypePickerWheel'
62
+ raise 'This method is not supported for XCUIElementTypePickerWheel controls'
63
+ end
64
+ list_loc = get_list_item_locator
65
+ self.click if Environ.is_macos?
66
+ items = obj.find_elements(list_loc.keys[0], list_loc.values[0])
67
+ items.each do |item|
68
+ list_items.push(item.text)
69
+ end
70
+ self.click if Environ.is_macos?
71
+ list_items
72
+ end
73
+
74
+ def get_list_item(index)
75
+ items = get_list_items
76
+ items[index - 1]
77
+ end
78
+
79
+ # Select the specified item in a selectlist object. Accepts a String or Integer.
80
+ #
81
+ # @param item [String, Integer] text or index of item to select
82
+ #
83
+ # @example
84
+ # convert_list.choose_item(2)
85
+ # convert_list.choose_item('Power')
86
+ #
87
+ def choose_item(item)
88
+ obj = element
89
+ object_not_found_exception(obj)
90
+ if Environ.is_ios? && obj.attribute(:type) == 'XCUIElementTypePickerWheel'
91
+ obj.send_keys(item)
92
+ else
93
+ list_loc = get_list_item_locator
94
+ self.click if Environ.is_macos?
95
+ items = obj.find_elements(list_loc.keys[0], list_loc.values[0])
96
+ if item.is_a?(Integer)
97
+ items[item - 1].click
98
+ else
99
+ items.each do |list_item|
100
+ if list_item.text == item
101
+ list_item.click
102
+ break
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ private
110
+
111
+ def get_list_item_locator
112
+ if @list_item.nil?
113
+ case Environ.device_os
114
+ when :mac
115
+ define_list_elements({ :list_item => { class: 'XCUIElementTypeMenuItem' } } )
116
+ when :ios
117
+ define_list_elements({ :list_item => { class: 'XCUIElementTypeOther' } } )
118
+ when :android
119
+ define_list_elements({ :list_item => { class: 'android.view.ViewGroup' } } )
120
+ end
121
+ end
122
+ @list_item
123
+ end
124
+ end
125
+ end
126
+ end