lebowski 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/History.md +17 -1
  2. data/Manifest.txt +8 -0
  3. data/README.md +6 -0
  4. data/lib/lebowski/foundation/application.rb +340 -74
  5. data/lib/lebowski/foundation/core.rb +23 -0
  6. data/lib/lebowski/foundation/dom_element.rb +15 -0
  7. data/lib/lebowski/foundation/errors/timeout.rb +5 -0
  8. data/lib/lebowski/foundation/mixins/collection_item_view_support.rb +5 -0
  9. data/lib/lebowski/foundation/mixins/define_paths_support.rb +318 -0
  10. data/lib/lebowski/foundation/mixins/delegate_support.rb +5 -0
  11. data/lib/lebowski/foundation/mixins/frame_application_context_support.rb +37 -0
  12. data/lib/lebowski/foundation/mixins/inline_text_field_support.rb +5 -0
  13. data/lib/lebowski/foundation/mixins/key_check.rb +5 -0
  14. data/lib/lebowski/foundation/mixins/list_item_view_support.rb +5 -0
  15. data/lib/lebowski/foundation/mixins/positioned_element.rb +24 -0
  16. data/lib/lebowski/foundation/mixins/stall_support.rb +5 -0
  17. data/lib/lebowski/foundation/mixins/user_actions.rb +37 -8
  18. data/lib/lebowski/foundation/mixins/wait_actions.rb +5 -0
  19. data/lib/lebowski/foundation/object_array.rb +96 -1
  20. data/lib/lebowski/foundation/proxy_factory.rb +2 -0
  21. data/lib/lebowski/foundation/proxy_object.rb +128 -130
  22. data/lib/lebowski/foundation/views/select_button.rb +69 -0
  23. data/lib/lebowski/foundation/views/view.rb +10 -0
  24. data/lib/lebowski/foundation/views/web.rb +26 -0
  25. data/lib/lebowski/foundation.rb +10 -0
  26. data/lib/lebowski/runtime/errors/remote_control_command_execution_error.rb +5 -0
  27. data/lib/lebowski/runtime/errors/remote_control_command_timeout_error.rb +5 -0
  28. data/lib/lebowski/runtime/errors/remote_control_error.rb +5 -0
  29. data/lib/lebowski/runtime/errors/selenium_server_error.rb +5 -0
  30. data/lib/lebowski/runtime/object_encoder.rb +5 -0
  31. data/lib/lebowski/runtime/sprout_core_driver.rb +5 -0
  32. data/lib/lebowski/runtime/sprout_core_extensions.rb +114 -0
  33. data/lib/lebowski/runtime.rb +5 -0
  34. data/lib/lebowski/scui/mixins/link_support.rb +32 -0
  35. data/lib/lebowski/scui/mixins/node_item_view_support.rb +50 -13
  36. data/lib/lebowski/scui/mixins/terminal_view_support.rb +30 -0
  37. data/lib/lebowski/scui/views/color_well.rb +48 -0
  38. data/lib/lebowski/scui/views/combo_box.rb +90 -87
  39. data/lib/lebowski/scui/views/content_editable.rb +422 -0
  40. data/lib/lebowski/scui/views/date_picker.rb +70 -58
  41. data/lib/lebowski/scui/views/linkit.rb +8 -0
  42. data/lib/lebowski/scui/views/select_field_tab.rb +30 -0
  43. data/lib/lebowski/scui.rb +18 -0
  44. data/lib/lebowski/version.rb +2 -2
  45. data/resources/user-extensions.js +293 -11
  46. metadata +69 -25
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Runtime
3
8
 
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Runtime
3
8
 
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Runtime
3
8
 
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Runtime
3
8
 
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Runtime
3
8
 
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Runtime
3
8
  class SproutCoreDriver
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module Runtime
3
8
 
@@ -21,6 +26,10 @@ module Lebowski
21
26
  def open_sc_application(app_root_path, timeout=nil)
22
27
  __remote_control_command("openScApplication", [app_root_path, timeout])
23
28
  end
29
+
30
+ def update_sc_application_context(app_name, timeout=nil)
31
+ __remote_control_command("updateScApplicationContext", [app_name, timeout])
32
+ end
24
33
 
25
34
  # SC Object Foundation Selenium Calls
26
35
 
@@ -132,6 +141,14 @@ module Lebowski
132
141
  return Coords.new(value[0], value[1])
133
142
  end
134
143
 
144
+ def get_sc_element_width(type, *params)
145
+ return get_element_width(__locator(type, *params))
146
+ end
147
+
148
+ def get_sc_element_height(type, *params)
149
+ return get_element_height(__locator(type, *params))
150
+ end
151
+
135
152
  def get_sc_view_child_view_count(scpath)
136
153
  full_path = "#{scpath}.childViews.length"
137
154
  return __number_command("getScPropertyValue", [full_path, ])
@@ -383,6 +400,103 @@ module Lebowski
383
400
  __remote_control_command("scWindowMaximize")
384
401
  end
385
402
 
403
+ def sc_select_main_window()
404
+ sc_select_window('top', '')
405
+ end
406
+
407
+ def sc_select_window(locator_type, locator_value)
408
+ hash = {
409
+ :locatorType => locator_type,
410
+ :locatorValue => locator_value
411
+ }
412
+
413
+ encoded_hash = ObjectEncoder.encode_hash(hash)
414
+
415
+ __remote_control_command("scSelectWindow", [encoded_hash])
416
+ end
417
+
418
+ def is_sc_opened_window?(locator_type, locator_value)
419
+ hash = {
420
+ :locatorType => locator_type,
421
+ :locatorValue => locator_value
422
+ }
423
+
424
+ encoded_hash = ObjectEncoder.encode_hash(hash)
425
+
426
+ return __boolean_command("isScOpenedWindow", [encoded_hash])
427
+ end
428
+
429
+ def sc_close_opened_window(locator_type, locator_value)
430
+ hash = {
431
+ :locatorType => locator_type,
432
+ :locatorValue => locator_value
433
+ }
434
+
435
+ encoded_hash = ObjectEncoder.encode_hash(hash)
436
+
437
+ return __boolean_command("scCloseOpenedWindow", [encoded_hash])
438
+ end
439
+
440
+ def get_css_selector_count(selector)
441
+ return __number_command("getCssSelectorCount", [selector, ])
442
+ end
443
+
444
+ def select_range(*params)
445
+ hash = nil
446
+
447
+ if params.length == 0
448
+ raise ArgumentError.new "no parameters were supplied"
449
+ end
450
+
451
+ if params[0].kind_of? Hash
452
+ hash = params[0]
453
+ end
454
+
455
+ encoded_hash = ObjectEncoder.encode_hash(hash)
456
+
457
+ __remote_control_command("selectRange", [encoded_hash])
458
+ end
459
+
460
+ def range_delete_content(*params)
461
+ hash = nil
462
+
463
+ if params.length == 0
464
+ raise ArgumentError.new "no parameters were supplied"
465
+ end
466
+
467
+ if params[0].kind_of? Hash
468
+ hash = params[0]
469
+ end
470
+
471
+ encoded_hash = ObjectEncoder.encode_hash(hash)
472
+
473
+ __remote_control_command("rangeDeleteContent", [encoded_hash])
474
+ end
475
+
476
+ def range_insert_content(*params)
477
+ hash = nil
478
+
479
+ if params.length == 0
480
+ raise ArgumentError.new "no parameters were supplied"
481
+ end
482
+
483
+ if params[0].kind_of? Hash
484
+ hash = params[0]
485
+ end
486
+
487
+ encoded_hash = ObjectEncoder.encode_hash(hash)
488
+
489
+ __remote_control_command("rangeInsertContent", [encoded_hash])
490
+ end
491
+
492
+ def get_element_tag_name(selector, index)
493
+ return __string_command("getElementTagName", [selector, index,])
494
+ end
495
+
496
+ def get_element_child_nodes_count(selector, index)
497
+ return __number_command("getElementChildNodesCount", [selector, index])
498
+ end
499
+
386
500
  # Selenium User Extensions Testing/Debugging Calls
387
501
 
388
502
  def __sc_test_computing_property_path(key, path)
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  require File.expand_path(File.dirname(__FILE__) + '/runtime/errors/remote_control_error')
2
7
  require File.expand_path(File.dirname(__FILE__) + '/runtime/errors/remote_control_command_execution_error')
3
8
  require File.expand_path(File.dirname(__FILE__) + '/runtime/errors/remote_control_command_timeout_error')
@@ -0,0 +1,32 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
6
+ module Lebowski
7
+ module SCUI
8
+ module Mixins
9
+
10
+ module LinkSupport
11
+
12
+ def start_node
13
+ return self['startNode']
14
+ end
15
+
16
+ def end_node
17
+ return self['endNode']
18
+ end
19
+
20
+ def start_terminal
21
+ return self['startTerminal']
22
+ end
23
+
24
+ def end_terminal
25
+ return self['endTerminal']
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module SCUI
3
8
  module Mixins
@@ -20,36 +25,59 @@ module Lebowski
20
25
  return @terminals
21
26
  end
22
27
 
23
- def drag_to_coordinates(x, y)
24
- coord_x = -1*(self.position.x) + self.frame.width + x
25
- coord_y = -1*(self.position.y) + self.frame.height + y
28
+ def links
29
+ return Support::LinksArray.new self
30
+ end
31
+
32
+ def linked_to?(item)
33
+ node_item_view = get_node_item_view(item)
34
+ comparison_node = node_item_view['content']
35
+ my_node = self['content']
26
36
 
27
- self.drag(coord_x, coord_y)
37
+ links.each { |link| return true if (link.start_node == comparison_node) || (link.end_node == comparison_node) }
38
+ node_item_view.links.each { |link| return true if (link.start_node == my_node) || (link.end_node == my_node) }
39
+
40
+ return false
41
+ end
42
+
43
+ def positioned_left_of?(item)
44
+ verify_positioning(item, true, -1)
45
+ end
46
+
47
+ def positioned_right_of?(item)
48
+ verify_positioning(item, true)
28
49
  end
29
50
 
30
- def drag_to_node(item)
31
- fixed_node = get_fixed_node(item)
32
- self.drag_on_to(fixed_node)
51
+ def positioned_above?(item)
52
+ verify_positioning(item, false, -1)
33
53
  end
34
54
 
35
- def drag_before_node(item)
55
+ def positioned_below?(item)
56
+ verify_positioning(item, false)
57
+ end
58
+
59
+ def drag_in_canvas(x, y)
60
+ self.drag_to(@parent, x, y)
61
+ end
62
+
63
+ def drag_left_of(item)
36
64
  drag_relative_to_node(item, true, -1)
37
65
  end
38
66
 
39
- def drag_after_node(item)
67
+ def drag_right_of(item)
40
68
  drag_relative_to_node(item, true)
41
69
  end
42
70
 
43
- def drag_above_node(item)
71
+ def drag_above(item)
44
72
  drag_relative_to_node(item, false, -1)
45
73
  end
46
74
 
47
- def drag_below_node(item)
75
+ def drag_below(item)
48
76
  drag_relative_to_node(item, false)
49
77
  end
50
78
 
51
79
  private
52
- def get_fixed_node(item)
80
+ def get_node_item_view(item)
53
81
  if item.kind_of? Integer
54
82
  fixed_node = @parent.item_views[item]
55
83
  raise ArgumentError.new "There is no node at index #{item}" if fixed_node.nil?
@@ -61,7 +89,7 @@ module Lebowski
61
89
  end
62
90
 
63
91
  def drag_relative_to_node(item, horizontal_drag, multiplier = 1)
64
- fixed_node = get_fixed_node(item)
92
+ fixed_node = get_node_item_view(item)
65
93
 
66
94
  x = horizontal_drag ? (fixed_node.frame.width + 50) * multiplier : 0
67
95
  y = horizontal_drag ? 0 : (fixed_node.frame.height + 50) * multiplier
@@ -69,6 +97,15 @@ module Lebowski
69
97
  self.drag_to(fixed_node, x, y)
70
98
  end
71
99
 
100
+ def verify_positioning(item, horizontal_drag, multiplier = 1)
101
+ fixed_node = get_node_item_view(item)
102
+ x = horizontal_drag ? (fixed_node.position.x + (50 + fixed_node.frame.width) * multiplier) : fixed_node.position.x
103
+ y = horizontal_drag ? fixed_node.position.y : (fixed_node.position.y + (50 + fixed_node.frame.height) * multiplier)
104
+
105
+ return true if (self.position.x == x) && (self.position.y == y)
106
+ return false
107
+ end
108
+
72
109
  def assert_item_has_node_item_view_support(item)
73
110
  if not item.respond_to? :has_node_item_view_support
74
111
  raise ArgumentError.new "The item passed in must have node item view support (#{NodeItemViewSupport})"
@@ -1,3 +1,8 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module SCUI
3
8
  module Mixins
@@ -7,11 +12,36 @@ module Lebowski
7
12
  return true
8
13
  end
9
14
 
15
+ def terminal_name
16
+ @terminal_name = self['terminal'] if @terminal_name.nil?
17
+ return @terminal_name
18
+ end
19
+
10
20
  def link_to(end_term, x = 0, y = 0)
11
21
  assert_item_has_terminal_view_support(end_term)
12
22
  self.drag_to(end_term, x, y)
13
23
  end
14
24
 
25
+ def linked_to?(terminal)
26
+ assert_item_has_terminal_view_support(terminal)
27
+
28
+ terminal_parent_node = terminal.parent['content']
29
+ my_parent_node = self.parent['content']
30
+
31
+ self.parent.links.each do |link|
32
+ return true if (link.start_node == terminal_parent_node) && (link.start_terminal == terminal.terminal_name) && (link.end_terminal == self.terminal_name)
33
+ return true if (link.end_node == terminal_parent_node) && (link.end_terminal == terminal.terminal_name) && (link.start_terminal == self.terminal_name)
34
+ end
35
+
36
+ terminal.parent.links.each do |link|
37
+ return true if (link.start_node == my_parent_node) && (link.start_terminal == self.terminal_name) && (link.end_terminal == terminal.terminal_name)
38
+ return true if (link.end_node == my_parent_node) && (link.end_terminal == self.terminal_name) && (link.start_terminal == terminal.terminal_name)
39
+ end
40
+
41
+ return false
42
+ end
43
+
44
+
15
45
  private
16
46
  def assert_item_has_terminal_view_support(item)
17
47
  if not item.respond_to? :has_terminal_view_support
@@ -0,0 +1,48 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
6
+ module Lebowski
7
+ module SCUI
8
+ module Views
9
+
10
+ #
11
+ # Represents a proxy to a SCUI color well view (SCUI.ColorWell)
12
+ #
13
+ class ColorWellView < Lebowski::Foundation::Views::View
14
+ representing_sc_class 'SCUI.ColorWell'
15
+
16
+ COLORS = { :red => '#ff0000', :green => '#00ff00', :blue => '#0000ff', :orange => '#ff6600',
17
+ :yellow => '#ffff00', :violet => '#8f00ff', :gray => '#999999', :black => '#000000', :white => '#ffffff' }
18
+
19
+ def color_selected?
20
+ return (not (text_box.value.nil? || text_box.value =='#eee'))
21
+ end
22
+
23
+ def color?(value)
24
+ value = COLORS[value] if value.kind_of? Symbol
25
+ return (text_box.value == value)
26
+ end
27
+
28
+ def select_color(value)
29
+ value = COLORS[value] if value.kind_of? Symbol
30
+ raise ArgumentError.new "The color value must be either a symbol or a string." if not value.kind_of? String
31
+ text_box.type value
32
+ end
33
+
34
+ private
35
+ def text_box
36
+ @text_box = picker_pane['contentView.textBox'] if @text_box.nil?
37
+ return @text_box
38
+ end
39
+
40
+ def picker_pane
41
+ @picker_pane = self['_pickerPane'] if @picker_pane.nil?
42
+ return @picker_pane
43
+ end
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -1,86 +1,17 @@
1
+ # ==========================================================================
2
+ # Project: Lebowski Framework - The SproutCore Test Automation Framework
3
+ # License: Licensed under MIT license (see License.txt)
4
+ # ==========================================================================
5
+
1
6
  module Lebowski
2
7
  module SCUI
3
8
  module Views
4
9
 
5
- class ComboBoxList
6
- attr_reader :item_views
7
-
8
- def initialize(parent)
9
- @parent = parent
10
- @list_pane = parent['_listPane']
11
-
12
- list_view_path = 'contentView.listView.contentView'
13
- if not @list_pane.sc_path_defined?(list_view_path)
14
- # revert to the old path to access the list view
15
- list_view_path = 'contentView.contentView'
16
- end
17
-
18
- @value_key = @list_pane["#{list_view_path}.contentValueKey"]
19
- @item_views = @list_pane[list_view_path].item_views
20
- end
21
-
22
- def count?(expected_count, item)
23
- type(item)
24
- return (@item_views.count == expected_count)
25
- end
26
-
27
- def any?(item)
28
- type(item)
29
- return @item_views.any?({@value_key => item})
30
- end
31
-
32
- alias_method :some?, :any?
33
-
34
- def one?(item)
35
- type(item)
36
- return @item_views.one?({@value_key => item})
37
- end
38
-
39
- def none?(item)
40
- type(item)
41
- @item_views.none?({@value_key => item})
42
- end
43
-
44
- def list_displayed?
45
- return @list_pane.isPaneAttached
46
- end
47
-
48
- def select_item(item)
49
- @parent.display_list
50
- if item.kind_of? Integer
51
- select_item_by_index(item)
52
- elsif item.kind_of? String
53
- select_item_by_name(/^#{item}/i)
54
- elsif item.kind_of? Regexp
55
- select_item_by_name(item)
56
- end
57
- @parent.hide_list
58
- end
59
-
60
- private
61
- def select_item_by_index(index)
62
- raise ArgumentError.new "Index out of range. The item number must be greater than or equal to zero." if (index < 0)
63
- raise ArgumentError.new "Index out of range. There are fewer than #{index.to_s} items in the list." if (index >= @item_views.count)
64
- @item_views[index].select
65
- end
66
-
67
- def select_item_by_name(name)
68
- if one?(name)
69
- @item_views.find_first({@value_key => name}).select
70
- end
71
- end
72
-
73
- def type(text)
74
- field = @parent.child_views[0]
75
- if text.kind_of? Regexp
76
- field.type_keys(text.inspect.tr('/^', '').tr('/i', ''))
77
- else
78
- field.type_keys(text)
79
- end
80
- end
81
- end
82
-
10
+ #
11
+ # Represents a proxy to a SCUI combo box view (SCUI.ComboBoxView)
12
+ #
83
13
  class ComboBoxView < Lebowski::Foundation::Views::View
14
+
84
15
  representing_sc_class 'SCUI.ComboBoxView'
85
16
 
86
17
  def empty?
@@ -89,15 +20,15 @@ module Lebowski
89
20
  end
90
21
 
91
22
  def display_list
92
- click_button if !list.list_displayed?
23
+ click_button if !list_displayed?
93
24
  end
94
25
 
95
26
  def hide_list
96
- click_button if list.list_displayed?
27
+ click_button if list_displayed?
97
28
  end
98
-
29
+
99
30
  def list_displayed?
100
- return list.list_displayed?
31
+ return list_pane.isPaneAttached
101
32
  end
102
33
 
103
34
  def select_item(item)
@@ -105,15 +36,87 @@ module Lebowski
105
36
  end
106
37
 
107
38
  def list
108
- return ComboBoxList.new(self)
39
+ if @list.nil?
40
+ if sc_path_defined?('_listPane.contentView.listView.contentView')
41
+ @list = ComboBoxList.new(self, '_listPane.contentView.listView.contentView', @driver)
42
+ else
43
+ @list = ComboBoxList.new(self, '_listPane.contentView.contentView', @driver)
44
+ end
45
+ end
46
+ return @list
109
47
  end
110
48
 
111
- private
112
- def click_button
113
- self['dropDownButtonView'].click
114
- end
49
+ private
50
+ def list_pane
51
+ @list_pane = self['_listPane'] if @list_pane.nil?
52
+ return @list_pane
53
+ end
54
+
55
+ def click_button
56
+ self['dropDownButtonView'].click
57
+ end
58
+ end
59
+
60
+ end
61
+
62
+ class ComboBoxList < Lebowski::Foundation::Views::ListView
63
+
64
+ def count?(expected_count, item)
65
+ type(item)
66
+ return (item_views.count == expected_count)
67
+ end
68
+
69
+ def any?(item)
70
+ type(item)
71
+ return item_views.any?({value_key => /#{item}/i})
72
+ end
73
+
74
+ alias_method :some?, :any?
75
+
76
+ def one?(item)
77
+ type(item)
78
+ return item_views.one?({value_key => /#{item}/i})
79
+ end
80
+
81
+ def none?(item)
82
+ type(item)
83
+ item_views.none?({value_key => /#{item}/i})
84
+ end
85
+
86
+ def select_item(item)
87
+ @parent.display_list
88
+ if item.kind_of? Integer
89
+ select_item_by_index(item)
90
+ elsif item.kind_of? String
91
+ select_item_by_name(item)
92
+ else
93
+ raise ArgumentError.new "The argument must be either an integer or a string."
94
+ end
95
+ @parent.hide_list
115
96
  end
116
97
 
98
+ private
99
+ def value_key
100
+ @value_key = self['contentValueKey'] if @value_key.nil?
101
+ return @value_key
102
+ end
103
+
104
+ def select_item_by_index(index)
105
+ raise ArgumentError.new "Index out of range. The item number must be greater than or equal to zero." if (index < 0)
106
+ raise ArgumentError.new "Index out of range. There are fewer than #{index.to_s} items in the list." if (index >= item_views.count)
107
+ item_views[index].select
108
+ end
109
+
110
+ def select_item_by_name(name)
111
+ if any?(name)
112
+ item_views.find_first({value_key => /#{name}/i}).select
113
+ end
114
+ end
115
+
116
+ def type(text)
117
+ @parent.child_views[0].type_keys(text)
118
+ end
117
119
  end
120
+
118
121
  end
119
122
  end