testcentricity 2.3.13

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.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +93 -0
  8. data/LICENSE.txt +28 -0
  9. data/README.md +1634 -0
  10. data/Rakefile +1 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/lib/devices/devices.yml +344 -0
  14. data/lib/testcentricity.rb +144 -0
  15. data/lib/testcentricity/app_core/appium_connect_helper.rb +154 -0
  16. data/lib/testcentricity/app_core/appium_server.rb +69 -0
  17. data/lib/testcentricity/app_core/screen_objects_helper.rb +180 -0
  18. data/lib/testcentricity/app_core/screen_sections_helper.rb +332 -0
  19. data/lib/testcentricity/app_elements/app_element_helper.rb +293 -0
  20. data/lib/testcentricity/app_elements/button.rb +8 -0
  21. data/lib/testcentricity/app_elements/checkbox.rb +20 -0
  22. data/lib/testcentricity/app_elements/label.rb +8 -0
  23. data/lib/testcentricity/app_elements/list.rb +25 -0
  24. data/lib/testcentricity/app_elements/switch.rb +20 -0
  25. data/lib/testcentricity/app_elements/textfield.rb +12 -0
  26. data/lib/testcentricity/browser_helper.rb +174 -0
  27. data/lib/testcentricity/data_objects/data_objects_helper.rb +78 -0
  28. data/lib/testcentricity/data_objects/environment.rb +281 -0
  29. data/lib/testcentricity/data_objects/excel_helper.rb +242 -0
  30. data/lib/testcentricity/exception_queue_helper.rb +51 -0
  31. data/lib/testcentricity/utility_helpers.rb +28 -0
  32. data/lib/testcentricity/version.rb +3 -0
  33. data/lib/testcentricity/web_core/drag_drop_helper.rb +15 -0
  34. data/lib/testcentricity/web_core/page_objects_helper.rb +669 -0
  35. data/lib/testcentricity/web_core/page_sections_helper.rb +866 -0
  36. data/lib/testcentricity/web_core/webdriver_helper.rb +579 -0
  37. data/lib/testcentricity/web_elements/button.rb +8 -0
  38. data/lib/testcentricity/web_elements/cell_button.rb +8 -0
  39. data/lib/testcentricity/web_elements/cell_checkbox.rb +38 -0
  40. data/lib/testcentricity/web_elements/cell_element.rb +69 -0
  41. data/lib/testcentricity/web_elements/cell_image.rb +8 -0
  42. data/lib/testcentricity/web_elements/cell_radio.rb +31 -0
  43. data/lib/testcentricity/web_elements/checkbox.rb +100 -0
  44. data/lib/testcentricity/web_elements/file_field.rb +45 -0
  45. data/lib/testcentricity/web_elements/image.rb +34 -0
  46. data/lib/testcentricity/web_elements/label.rb +8 -0
  47. data/lib/testcentricity/web_elements/link.rb +8 -0
  48. data/lib/testcentricity/web_elements/list.rb +73 -0
  49. data/lib/testcentricity/web_elements/list_button.rb +8 -0
  50. data/lib/testcentricity/web_elements/list_checkbox.rb +38 -0
  51. data/lib/testcentricity/web_elements/list_element.rb +61 -0
  52. data/lib/testcentricity/web_elements/list_radio.rb +31 -0
  53. data/lib/testcentricity/web_elements/radio.rb +74 -0
  54. data/lib/testcentricity/web_elements/select_list.rb +197 -0
  55. data/lib/testcentricity/web_elements/siebel_open_ui_helper.rb +15 -0
  56. data/lib/testcentricity/web_elements/table.rb +612 -0
  57. data/lib/testcentricity/web_elements/textfield.rb +114 -0
  58. data/lib/testcentricity/web_elements/ui_elements_helper.rb +502 -0
  59. data/lib/testcentricity/world_extensions.rb +26 -0
  60. data/my_templates/default/method_details/setup.rb +3 -0
  61. data/spec/spec_helper.rb +14 -0
  62. data/spec/testcentricity_spec.rb +9 -0
  63. data/testcentricity.gemspec +47 -0
  64. metadata +328 -0
@@ -0,0 +1,114 @@
1
+ module TestCentricity
2
+ class TextField < UIElement
3
+ def initialize(name, parent, locator, context)
4
+ super
5
+ @type = :textfield
6
+ end
7
+
8
+ # Is text field set to read-only?
9
+ #
10
+ # @return [Boolean]
11
+ # @example
12
+ # comments_field.read_only?
13
+ #
14
+ def read_only?
15
+ obj, = find_element
16
+ object_not_found_exception(obj, nil)
17
+ !!obj.native.attribute('readonly')
18
+ end
19
+
20
+ # Return maxlength character count of a text field.
21
+ #
22
+ # @return [Integer]
23
+ # @example
24
+ # max_num_chars = comments_field.get_max_length
25
+ #
26
+ def get_max_length
27
+ obj, = find_element
28
+ object_not_found_exception(obj, nil)
29
+ max_length = obj.native.attribute('maxlength')
30
+ max_length.to_i unless max_length.blank?
31
+ end
32
+
33
+ # Return placeholder text of a text field.
34
+ #
35
+ # @return [String]
36
+ # @example
37
+ # placeholder_message = username_field.get_placeholder
38
+ #
39
+ def get_placeholder
40
+ obj, = find_element
41
+ object_not_found_exception(obj, nil)
42
+ obj.native.attribute('placeholder')
43
+ end
44
+
45
+ # Return min attribute of a number type text field.
46
+ #
47
+ # @return [Integer]
48
+ # @example
49
+ # min_points_value = points_field.get_min
50
+ #
51
+ def get_min
52
+ obj, = find_element
53
+ object_not_found_exception(obj, nil)
54
+ min = obj.native.attribute('min')
55
+ min.to_i unless min.blank?
56
+ end
57
+
58
+ # Return max attribute of a number type text field.
59
+ #
60
+ # @return [Integer]
61
+ # @example
62
+ # max_points_value = points_field.get_max
63
+ #
64
+ def get_max
65
+ obj, = find_element
66
+ object_not_found_exception(obj, nil)
67
+ max = obj.native.attribute('max')
68
+ max.to_i unless max.blank?
69
+ end
70
+
71
+ # Return step attribute of a number type text field.
72
+ #
73
+ # @return [Integer]
74
+ # @example
75
+ # points_step = points_field.get_step
76
+ #
77
+ def get_step
78
+ obj, = find_element
79
+ object_not_found_exception(obj, nil)
80
+ step = obj.native.attribute('step')
81
+ step.to_i unless step.blank?
82
+ end
83
+
84
+ # Clear the contents of a text field
85
+ #
86
+ # @example
87
+ # first_name_field.clear
88
+ #
89
+ def clear
90
+ case get_native_attribute('tagName').downcase.to_sym
91
+ when :textarea
92
+ set('')
93
+ sleep(0.5)
94
+ send_keys(:tab)
95
+ when :div
96
+ set('')
97
+ else
98
+ length = get_value.length
99
+ length.times do
100
+ send_keys(:backspace)
101
+ end
102
+ sleep(0.5)
103
+ send_keys(:tab)
104
+ sleep(0.5)
105
+ length = get_value.length
106
+ if length > 0
107
+ set('')
108
+ sleep(0.5)
109
+ send_keys(:tab)
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,502 @@
1
+ require 'test/unit'
2
+
3
+ Capybara::Node::Element.class_eval do
4
+ def click_at(x, y)
5
+ right = x - (native.size.width / 2)
6
+ top = y - (native.size.height / 2)
7
+ driver.browser.action.move_to(native).move_by(right.to_i, top.to_i).click.perform
8
+ end
9
+
10
+ def get_width
11
+ native.size.width
12
+ end
13
+
14
+ def get_height
15
+ native.size.height
16
+ end
17
+
18
+ def get_x
19
+ native.location.x
20
+ end
21
+
22
+ def get_y
23
+ native.location.y
24
+ end
25
+
26
+ def displayed?
27
+ native.displayed?
28
+ end
29
+ end
30
+
31
+
32
+ module TestCentricity
33
+ class UIElement
34
+ include Capybara::DSL
35
+ include Test::Unit::Assertions
36
+
37
+ attr_reader :parent, :locator, :context, :type, :name
38
+ attr_accessor :alt_locator, :locator_type
39
+
40
+ XPATH_SELECTORS = ['//', '[@', '[contains(@']
41
+ CSS_SELECTORS = ['#', ':nth-child(', ':nth-of-type(', '^=', '$=', '*=']
42
+
43
+ def initialize(name, parent, locator, context)
44
+ @name = name
45
+ @parent = parent
46
+ @locator = locator
47
+ @context = context
48
+ @type = nil
49
+ @alt_locator = nil
50
+ set_locator_type
51
+ end
52
+
53
+ def set_locator_type(locator = nil)
54
+ locator = @locator if locator.nil?
55
+ is_xpath = XPATH_SELECTORS.any? { |selector| locator.include?(selector) }
56
+ is_css = CSS_SELECTORS.any? { |selector| locator.include?(selector) }
57
+ if is_xpath && !is_css
58
+ @locator_type = :xpath
59
+ elsif is_css && !is_xpath
60
+ @locator_type = :css
61
+ elsif !is_css && !is_xpath
62
+ @locator_type = :css
63
+ else
64
+ raise "Cannot determine type of locator for UIElement '#{@name}' - locator = #{locator}"
65
+ end
66
+ end
67
+
68
+ def get_object_type
69
+ if @type
70
+ @type
71
+ elsif obj.tag_name
72
+ obj.tag_name
73
+ elsif obj.native.attribute('type')
74
+ obj.native.attribute('type')
75
+ end
76
+ end
77
+
78
+ def get_locator
79
+ @locator
80
+ end
81
+
82
+ def get_name
83
+ @name
84
+ end
85
+
86
+ def set_alt_locator(temp_locator)
87
+ @alt_locator = temp_locator
88
+ end
89
+
90
+ def clear_alt_locator
91
+ @alt_locator = nil
92
+ end
93
+
94
+ # Click on an object
95
+ #
96
+ # @example
97
+ # basket_link.click
98
+ #
99
+ def click
100
+ obj, type = find_element
101
+ object_not_found_exception(obj, type)
102
+ begin
103
+ obj.click
104
+ rescue
105
+ obj.click_at(10, 10) unless Capybara.current_driver == :poltergeist
106
+ end
107
+ end
108
+
109
+ # Double-click on an object
110
+ #
111
+ # @example
112
+ # file_image.double_click
113
+ #
114
+ def double_click
115
+ obj, type = find_element
116
+ object_not_found_exception(obj, type)
117
+ page.driver.browser.action.double_click(obj.native).perform
118
+ end
119
+
120
+ # Right-click on an object
121
+ #
122
+ # @example
123
+ # basket_item_image.right_click
124
+ #
125
+ def right_click
126
+ obj, type = find_element
127
+ object_not_found_exception(obj, type)
128
+ page.driver.browser.action.context_click(obj.native).perform
129
+ end
130
+
131
+ # Click at a specific location within an object
132
+ #
133
+ # @param x [Integer] X offset
134
+ # @param y [Integer] Y offset
135
+ # @example
136
+ # basket_item_image.click_at(10, 10)
137
+ #
138
+ def click_at(x, y)
139
+ obj, = find_element
140
+ raise "UI #{object_ref_message} not found" unless obj
141
+ obj.click_at(x, y)
142
+ end
143
+
144
+ def set(value)
145
+ obj, type = find_element
146
+ object_not_found_exception(obj, type)
147
+ obj.set(value)
148
+ end
149
+
150
+ # Send keystrokes to this object.
151
+ #
152
+ # @param keys [String] keys
153
+ # @example
154
+ # comment_field.send_keys(:enter)
155
+ #
156
+ def send_keys(*keys)
157
+ obj, type = find_element
158
+ object_not_found_exception(obj, type)
159
+ obj.send_keys(*keys)
160
+ end
161
+
162
+ # Does UI object exists?
163
+ #
164
+ # @return [Boolean]
165
+ # @example
166
+ # basket_link.exists?
167
+ #
168
+ def exists?(visible = true)
169
+ obj, = find_object(visible)
170
+ obj != nil
171
+ end
172
+
173
+ # Is UI object visible?
174
+ #
175
+ # @return [Boolean]
176
+ # @example
177
+ # remember_me_checkbox.visible?
178
+ #
179
+ def visible?
180
+ obj, type = find_object
181
+ exists = obj
182
+ invisible = false
183
+ if type == :css
184
+ Capybara.using_wait_time 0.1 do
185
+ # is object itself hidden with .ui-helper-hidden class?
186
+ self_hidden = page.has_css?("#{@locator}.ui-helper-hidden")
187
+ # is parent of object hidden, thus hiding the object?
188
+ parent_hidden = page.has_css?(".ui-helper-hidden > #{@locator}")
189
+ # is grandparent of object, or any other ancestor, hidden?
190
+ other_ancestor_hidden = page.has_css?(".ui-helper-hidden * #{@locator}")
191
+ # if any of the above conditions are true, then object is invisible
192
+ invisible = self_hidden || parent_hidden || other_ancestor_hidden
193
+ end
194
+ else
195
+ invisible = !obj.visible? if exists
196
+ end
197
+ # the object is visible if it exists and it is not invisible
198
+ if exists && !invisible
199
+ true
200
+ else
201
+ false
202
+ end
203
+ end
204
+
205
+ # Is UI object hidden (not visible)?
206
+ #
207
+ # @return [Boolean]
208
+ # @example
209
+ # remember_me_checkbox.hidden?
210
+ #
211
+ def hidden?
212
+ !visible?
213
+ end
214
+
215
+ # Is UI object enabled?
216
+ #
217
+ # @return [Boolean]
218
+ # @example
219
+ # login_button.enabled?
220
+ #
221
+ def enabled?
222
+ !disabled?
223
+ end
224
+
225
+ # Is UI object disabled (not enabled)?
226
+ #
227
+ # @return [Boolean]
228
+ # @example
229
+ # login_button.disabled?
230
+ #
231
+ def disabled?
232
+ obj, type = find_element
233
+ object_not_found_exception(obj, type)
234
+ obj.disabled?
235
+ end
236
+
237
+ # Wait until the object exists, or until the specified wait time has expired. If the wait time is nil, then the wait
238
+ # time will be Capybara.default_max_wait_time.
239
+ #
240
+ # @param seconds [Integer or Float] wait time in seconds
241
+ # @example
242
+ # run_button.wait_until_exists(0.5)
243
+ #
244
+ def wait_until_exists(seconds = nil)
245
+ timeout = seconds.nil? ? Capybara.default_max_wait_time : seconds
246
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
247
+ wait.until { exists? }
248
+ rescue
249
+ raise "Could not find UI #{object_ref_message} after #{timeout} seconds" unless exists?
250
+ end
251
+
252
+ # Wait until the object no longer exists, or until the specified wait time has expired. If the wait time is nil, then
253
+ # the wait time will be Capybara.default_max_wait_time.
254
+ #
255
+ # @param seconds [Integer or Float] wait time in seconds
256
+ # @example
257
+ # logout_button.wait_until_gone(5)
258
+ #
259
+ def wait_until_gone(seconds = nil)
260
+ timeout = seconds.nil? ? Capybara.default_max_wait_time : seconds
261
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
262
+ wait.until { !exists? }
263
+ rescue
264
+ raise "UI #{object_ref_message} remained visible after #{timeout} seconds" if exists?
265
+ end
266
+
267
+ # Wait until the object is visible, or until the specified wait time has expired. If the wait time is nil, then the
268
+ # wait time will be Capybara.default_max_wait_time.
269
+ #
270
+ # @param seconds [Integer or Float] wait time in seconds
271
+ # @example
272
+ # run_button.wait_until_visible(0.5)
273
+ #
274
+ def wait_until_visible(seconds = nil)
275
+ timeout = seconds.nil? ? Capybara.default_max_wait_time : seconds
276
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
277
+ wait.until { visible? }
278
+ rescue
279
+ raise "Could not find UI #{object_ref_message} after #{timeout} seconds" unless visible?
280
+ end
281
+
282
+ # Wait until the object is hidden, or until the specified wait time has expired. If the wait time is nil, then the
283
+ # wait time will be Capybara.default_max_wait_time.
284
+ #
285
+ # @param seconds [Integer or Float] wait time in seconds
286
+ # @example
287
+ # run_button.wait_until_hidden(10)
288
+ #
289
+ def wait_until_hidden(seconds = nil)
290
+ timeout = seconds.nil? ? Capybara.default_max_wait_time : seconds
291
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
292
+ wait.until { hidden? }
293
+ rescue
294
+ raise "UI #{object_ref_message} remained visible after #{timeout} seconds" if visible?
295
+ end
296
+
297
+ # Wait until the object's value equals the specified value, or until the specified wait time has expired. If the wait
298
+ # time is nil, then the wait time will be Capybara.default_max_wait_time.
299
+ #
300
+ # @param seconds [Integer or Float] wait time in seconds
301
+ # @example
302
+ # card_authorized_label.wait_until_value_is(5, 'Card authorized')
303
+ #
304
+ def wait_until_value_is(value, seconds = nil)
305
+ timeout = seconds.nil? ? Capybara.default_max_wait_time : seconds
306
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
307
+ wait.until { get_value == value }
308
+ rescue
309
+ raise "Value of UI #{object_ref_message} failed to equal '#{value}' after #{timeout} seconds" unless get_value == value
310
+ end
311
+
312
+ # Wait until the object's value changes to a different value, or until the specified wait time has expired. If the
313
+ # wait time is nil, then the wait time will be Capybara.default_max_wait_time.
314
+ #
315
+ # @param seconds [Integer or Float] wait time in seconds
316
+ # @example
317
+ # basket_grand_total_label.wait_until_value_changes(5)
318
+ #
319
+ def wait_until_value_changes(seconds = nil)
320
+ value = get_value
321
+ timeout = seconds.nil? ? Capybara.default_max_wait_time : seconds
322
+ wait = Selenium::WebDriver::Wait.new(timeout: timeout)
323
+ wait.until { get_value != value }
324
+ rescue
325
+ raise "Value of UI #{object_ref_message} failed to change from '#{value}' after #{timeout} seconds" if get_value == value
326
+ end
327
+
328
+ # Return width of object.
329
+ #
330
+ # @return [Integer]
331
+ # @example
332
+ # button_width = my_button.width
333
+ #
334
+ def width
335
+ obj, type = find_element(false)
336
+ object_not_found_exception(obj, type)
337
+ obj.get_width
338
+ end
339
+
340
+ # Return height of object.
341
+ #
342
+ # @return [Integer]
343
+ # @example
344
+ # button_height = my_button.height
345
+ #
346
+ def height
347
+ obj, type = find_element(false)
348
+ object_not_found_exception(obj, type)
349
+ obj.get_height
350
+ end
351
+
352
+ # Return x coordinate of object's location.
353
+ #
354
+ # @return [Integer]
355
+ # @example
356
+ # button_x = my_button.x
357
+ #
358
+ def x
359
+ obj, type = find_element(false)
360
+ object_not_found_exception(obj, type)
361
+ obj.get_x
362
+ end
363
+
364
+ # Return y coordinate of object's location.
365
+ #
366
+ # @return [Integer]
367
+ # @example
368
+ # button_y = my_button.y
369
+ #
370
+ def y
371
+ obj, type = find_element(false)
372
+ object_not_found_exception(obj, type)
373
+ obj.get_y
374
+ end
375
+
376
+ # Is UI object displayed in browser window?
377
+ #
378
+ # @return [Boolean]
379
+ # @example
380
+ # basket_link.displayed??
381
+ #
382
+ def displayed?
383
+ obj, type = find_element(false)
384
+ object_not_found_exception(obj, type)
385
+ obj.displayed?
386
+ end
387
+
388
+ def get_value(visible = true)
389
+ obj, type = find_element(visible)
390
+ object_not_found_exception(obj, type)
391
+ case obj.tag_name.downcase
392
+ when 'input', 'select', 'textarea'
393
+ obj.value
394
+ else
395
+ obj.text
396
+ end
397
+ end
398
+
399
+ alias get_caption get_value
400
+
401
+ def verify_value(expected, enqueue = false)
402
+ actual = get_value
403
+ enqueue ?
404
+ ExceptionQueue.enqueue_assert_equal(expected.strip, actual.strip, "Expected UI #{object_ref_message}") :
405
+ assert_equal(expected.strip, actual.strip, "Expected UI #{object_ref_message} to display '#{expected}' but found '#{actual}'")
406
+ end
407
+
408
+ alias verify_caption verify_value
409
+
410
+ # Hover the cursor over an object
411
+ #
412
+ # @example
413
+ # basket_link.hover
414
+ #
415
+ def hover
416
+ obj, type = find_element
417
+ object_not_found_exception(obj, type)
418
+ obj.hover
419
+ end
420
+
421
+ def drag_by(right_offset, down_offset)
422
+ obj, type = find_element
423
+ object_not_found_exception(obj, type)
424
+ page.driver.browser.action.click_and_hold(obj.native).perform
425
+ sleep(1)
426
+ obj.drag_by(right_offset, down_offset)
427
+ end
428
+
429
+ def drag_and_drop(target, right_offset = nil, down_offset = nil)
430
+ source, type = find_element
431
+ object_not_found_exception(source, type)
432
+ page.driver.browser.action.click_and_hold(source.native).perform
433
+ sleep(1)
434
+ target_drop, = target.find_element
435
+ page.driver.browser.action.move_to(target_drop.native, right_offset.to_i, down_offset.to_i).release.perform
436
+ end
437
+
438
+ def get_attribute(attrib)
439
+ obj, type = find_element(false)
440
+ object_not_found_exception(obj, type)
441
+ obj[attrib]
442
+ end
443
+
444
+ def get_native_attribute(attrib)
445
+ obj, type = find_element(false)
446
+ object_not_found_exception(obj, type)
447
+ obj.native.attribute(attrib)
448
+ end
449
+
450
+ private
451
+
452
+ def find_element(visible = true)
453
+ wait = Selenium::WebDriver::Wait.new(timeout: Capybara.default_max_wait_time)
454
+ wait.until { find_object(visible) }
455
+ end
456
+
457
+ def find_object(visible = true)
458
+ @alt_locator.nil? ? obj_locator = @locator : obj_locator = @alt_locator
459
+ parent_section = @context == :section && !@parent.get_locator.nil?
460
+ parent_section ? tries ||= 2 : tries ||= 1
461
+
462
+ if parent_section && tries > 1
463
+ parent_locator = @parent.get_locator
464
+ parent_locator = parent_locator.gsub('|', ' ')
465
+ parent_locator_type = @parent.get_locator_type
466
+ obj = page.find(parent_locator_type, parent_locator, :wait => 0.01).find(@locator_type, obj_locator, :wait => 0.01, :visible => visible)
467
+ else
468
+ obj = page.find(@locator_type, obj_locator, :wait => 0.01, :visible => visible)
469
+ end
470
+ [obj, @locator_type]
471
+ rescue
472
+ retry if (tries -= 1) > 0
473
+ [nil, nil]
474
+ end
475
+
476
+ def object_not_found_exception(obj, obj_type)
477
+ @alt_locator.nil? ? locator = @locator : locator = @alt_locator
478
+ obj_type.nil? ? object_type = 'Object' : object_type = obj_type
479
+ raise "#{object_type} named '#{@name}' (#{locator}) not found" unless obj
480
+ end
481
+
482
+ def invalid_object_type_exception(obj, obj_type)
483
+ unless obj.tag_name == obj_type || obj.native.attribute('type') == obj_type
484
+ @alt_locator.nil? ? locator = @locator : locator = @alt_locator
485
+ raise "#{locator} is not a #{obj_type} element"
486
+ end
487
+ end
488
+
489
+ def invoke_siebel_popup
490
+ obj, = find_element
491
+ object_not_found_exception(obj, 'Siebel object')
492
+ trigger_name = obj.native.attribute('aria-describedby').strip
493
+ trigger = "span##{trigger_name}"
494
+ trigger = "#{@parent.get_locator} #{trigger}" if @context == :section && !@parent.get_locator.nil?
495
+ first(trigger).click
496
+ end
497
+
498
+ def object_ref_message
499
+ "object '#{get_name}' (#{get_locator})"
500
+ end
501
+ end
502
+ end