bewildr 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,64 +1,64 @@
1
- #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
-
3
- module Bewildr
4
- module ControlTypeAdditions
5
- module MenuAdditions
6
- def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
- base.extend Bewildr::ControlPatterns::SelectionPattern
9
- base.extend Bewildr::ControlPatterns::SelectionItemPattern
10
-
11
- base.instance_eval do
12
- def root_menu_items
13
- get(:type =>:menu_item, :scope => :children)
14
- end
15
-
16
- def root_menu_item_names
17
- root_menu_items.collect {|menu_item| menu_item.name}
18
- end
19
-
20
- def select_menu(path)
21
- menu_item(path).click
22
- end
23
-
24
- def select_node(path)
25
- node(path).select
26
- end
27
-
28
- def menu_item(path)
29
- current_menu_items = root_menu_items
30
- matching_menu_item = nil
31
- path.each_with_index do |target_menu_item, index|
32
- case current_menu_items
33
- when Array
34
- matching_menu_item = current_menu_items.find {|node| node.name == target_menu_item} #TODO: make this work with regexes as well as strings...
35
- raise ElementDoesntExist if matching_menu_item.nil?
36
- when Bewildr::Element
37
- if current_menu_items.name == target_menu_item #TODO: make this work with regexes as well as strings...
38
- matching_menu_item = current_menu_items
39
- else
40
- raise ElementDoesntExist
41
- end
42
- end
43
- raise ElementDoesntExist if matching_menu_item.nil?
44
- if path.size != index + 1
45
- matching_menu_item.expand
46
- current_menu_items = matching_menu_item.sub_menus
47
- end
48
- end
49
- return matching_menu_item
50
- end
51
-
52
- def contains_menu_item?(path)
53
- begin
54
- menu_item(path)
55
- return true
56
- rescue ElementDoesntExist => e
57
- return false
58
- end
59
- end
60
- end
61
- end
62
- end
63
- end
64
- end
1
+ #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
+
3
+ module Bewildr
4
+ module ControlTypeAdditions
5
+ module MenuAdditions
6
+ def self.extended(base)
7
+ base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
+ base.extend Bewildr::ControlPatterns::SelectionPattern
9
+ base.extend Bewildr::ControlPatterns::SelectionItemPattern
10
+
11
+ base.instance_eval do
12
+ def root_menu_items
13
+ get(:type => :menu_item, :scope => :children, :how_many => :all)
14
+ end
15
+
16
+ def root_menu_item_names
17
+ root_menu_items.collect {|menu_item| menu_item.name}
18
+ end
19
+
20
+ def select_menu(path)
21
+ menu_item(path).click
22
+ end
23
+
24
+ def select_node(path)
25
+ node(path).select
26
+ end
27
+
28
+ def menu_item(path)
29
+ current_menu_items = root_menu_items
30
+ matching_menu_item = nil
31
+ path.each_with_index do |target_menu_item, index|
32
+ case current_menu_items
33
+ when Array
34
+ matching_menu_item = current_menu_items.find {|node| node.name == target_menu_item} #TODO: make this work with regexes as well as strings...
35
+ raise Bewildr::ElementDoesntExist if matching_menu_item.nil?
36
+ when Bewildr::Element
37
+ if current_menu_items.name == target_menu_item #TODO: make this work with regexes as well as strings...
38
+ matching_menu_item = current_menu_items
39
+ else
40
+ raise Bewildr::ElementDoesntExist
41
+ end
42
+ end
43
+ raise Bewildr::ElementDoesntExist if matching_menu_item.nil?
44
+ if path.size != index + 1
45
+ matching_menu_item.expand
46
+ current_menu_items = matching_menu_item.sub_menus
47
+ end
48
+ end
49
+ return matching_menu_item
50
+ end
51
+
52
+ def contains_menu_item?(path)
53
+ begin
54
+ menu_item(path)
55
+ return true
56
+ rescue ElementDoesntExist => e
57
+ return false
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,18 +1,18 @@
1
- #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
-
3
- module Bewildr
4
- module ControlTypeAdditions
5
- module MenuItemAdditions
6
- def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
- base.extend Bewildr::ControlPatterns::InvokePattern
9
-
10
- base.instance_eval do
11
- def sub_menus
12
- get(:type => :menu_item, :scope => :children)
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
1
+ #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
+
3
+ module Bewildr
4
+ module ControlTypeAdditions
5
+ module MenuItemAdditions
6
+ def self.extended(base)
7
+ base.extend Bewildr::ControlPatterns::ExpandCollapsePattern
8
+ base.extend Bewildr::ControlPatterns::InvokePattern
9
+
10
+ base.instance_eval do
11
+ def sub_menus
12
+ get(:type => :menu_item, :scope => :children, :how_many => :all)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,31 +1,31 @@
1
- #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
-
3
- module Bewildr
4
- module ControlTypeAdditions
5
- module TabAdditions
6
- def self.extended(base)
7
- base.extend Bewildr::ControlPatterns::SelectionPattern
8
-
9
- base.instance_eval do
10
- def select(input)
11
- raise NoSuchTab unless tab_names.include?(input)
12
- selectable_elements = tabs
13
- selectable_elements.find {|selectable_element| selectable_element.name == input}.select
14
- end
15
-
16
- def tabs
17
- get(:type => :tab_item, :scope => :children)
18
- end
19
-
20
- def tab_names
21
- tabs.collect {|tab| tab.name}
22
- end
23
-
24
- def selected
25
- tabs.find {|tab| tab.selected?}
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
1
+ #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
+
3
+ module Bewildr
4
+ module ControlTypeAdditions
5
+ module TabAdditions
6
+ def self.extended(base)
7
+ base.extend Bewildr::ControlPatterns::SelectionPattern
8
+
9
+ base.instance_eval do
10
+ def select(input)
11
+ raise Bewildr::NoSuchTab unless tab_names.include?(input)
12
+ selectable_elements = tabs
13
+ selectable_elements.find {|selectable_element| selectable_element.name == input}.select
14
+ end
15
+
16
+ def tabs
17
+ get(:type => :tab_item, :scope => :children, :how_many => :all)
18
+ end
19
+
20
+ def tab_names
21
+ tabs.collect {|tab| tab.name}
22
+ end
23
+
24
+ def selected
25
+ tabs.find {|tab| tab.selected?}
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -27,15 +27,15 @@ module Bewildr
27
27
  case current_nodes
28
28
  when Array
29
29
  matching_node = current_nodes.find {|node| node.name == target_node} #TODO: make this work with regexes as well as strings...
30
- raise ElementDoesntExist if matching_node.nil?
30
+ raise Bewildr::ElementDoesntExist if matching_node.nil?
31
31
  when Bewildr::Element
32
32
  if current_nodes.name == target_node #TODO: make this work with regexes as well as strings...
33
33
  matching_node = current_nodes
34
34
  else
35
- raise ElementDoesntExist
35
+ raise Bewildr::ElementDoesntExist
36
36
  end
37
37
  end
38
- raise ElementDoesntExist if matching_node.nil?
38
+ raise Bewildr::ElementDoesntExist if matching_node.nil?
39
39
  if path.size != index + 1
40
40
  matching_node.expand
41
41
  current_nodes = matching_node.child_nodes
@@ -1,190 +1,209 @@
1
- #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
-
3
- module Bewildr
4
- class Element
5
- attr_reader :automation_element
6
- attr_reader :control_type
7
-
8
- def initialize(input)
9
- @automation_element = input
10
- case input
11
- when System::Windows::Automation::AutomationElement
12
- set_control_type
13
- build_element
14
- when nil then @control_type = :non_existent
15
- else raise BewildrInternalError, "Can only initialize an element with a nil or a Sys::Win::Auto::AE[C], not a #{input.class}"
16
- end
17
- end
18
-
19
- def name
20
- existence_check
21
- @automation_element.current.name.to_s
22
- end
23
-
24
- def automation_id
25
- existence_check
26
- @automation_element.current.automation_id.to_s
27
- end
28
-
29
- def exists?
30
- return false if @control_type == :non_existent
31
- begin
32
- @automation_element.current.bounding_rectangle
33
- return true
34
- rescue System::Windows::Automation::ElementNotAvailableException, TypeError => e
35
- return false
36
- end
37
- end
38
- alias :exist? :exists?
39
-
40
- def contains?(condition_hash)
41
- get(condition_hash).exists?
42
- end
43
- alias :contain? :contains?
44
-
45
- def existence_check
46
- raise ElementDoesntExist unless exists?
47
- end
48
- private :existence_check
49
-
50
- def enabled?
51
- existence_check
52
- @automation_element.current.is_enabled
53
- end
54
-
55
- def wait_for_existence_of(condition_hash)
56
- Timeout.timeout(30) do
57
- sleep 0.1 until contains?(condition_hash)
58
- end
59
- get(condition_hash)
60
- end
61
-
62
- def wait_for_non_existence_of(condition_hash)
63
- Timeout.timeout(30) do
64
- sleep 0.1 unless contains?(condition_hash)
65
- end
66
- end
67
-
68
- def focus
69
- @automation_element.set_focus
70
- end
71
-
72
- #:id => "id"
73
- #:name => "bob"
74
- #:type => :button
75
- #:scope => :children / :descendants
76
- #:how_many => :first / :all
77
- def get(condition_hash)
78
- existence_check
79
- condition = Finder.condition_for(condition_hash)
80
- scope = Finder.scope_for(condition_hash)
81
- how_many = Finder.how_many_for(condition_hash)
82
-
83
- result = @automation_element.send how_many, scope, condition
84
- case result
85
- when System::Windows::Automation::AutomationElement, nil then return Bewildr::Element.new(result)
86
- when System::Windows::Automation::AutomationElementCollection
87
- c_array_list = System::Collections::ArrayList.new(result)
88
- element_array = c_array_list.to_array.to_a
89
- case
90
- when element_array.size == 0 then return Bewildr::Element.new(nil)
91
- when element_array.size == 1 then return Bewildr::Element.new(element_array.first)
92
- when element_array.size > 1 then return element_array.collect {|element| Bewildr::Element.new(element) }
93
- end
94
- end
95
- end
96
-
97
- #add "children/child" and "descendants/descendant" methods
98
-
99
- def children
100
- get({:scope => :children}).collect {|element| Bewildr::Element.new(element)}
101
- end
102
-
103
- def click
104
- CLICKR.click(clickable_point)
105
- end
106
-
107
- def double_click
108
- CLICKR.double_click(clickable_point)
109
- end
110
-
111
- def right_click
112
- CLICKR.right_click(clickable_point)
113
- end
114
-
115
- def clickable_point
116
- existence_check
117
- @automation_element.get_clickable_point
118
- end
119
-
120
- private
121
-
122
- def set_control_type
123
- @control_type = Bewildr::ControlType.symbol_for_enum(@automation_element.current.control_type)
124
- end
125
-
126
- #list of control types comes from http://msdn.microsoft.com/en-us/library/ms750574.aspx
127
- def build_element
128
- case @control_type
129
- when :button
130
- when :calendar
131
- when :check_box
132
- extend Bewildr::ControlPatterns::TogglePattern
133
- when :combo_box
134
- extend Bewildr::ControlTypeAdditions::ComboBoxAdditions
135
- when :custom
136
- when :data_grid
137
- extend Bewildr::ControlTypeAdditions::DataGridAdditions
138
- when :data_item
139
- when :document
140
- extend Bewildr::ControlTypeAdditions::DocumentAdditions
141
- when :edit
142
- extend Bewildr::ControlPatterns::ValuePattern
143
- when :group
144
- when :header
145
- when :header_item
146
- when :hyperlink
147
- extend Bewildr::ControlTypeAdditions::TextAdditions
148
- when :image
149
- when :list
150
- extend Bewildr::ControlTypeAdditions::ListAdditions
151
- when :list_item
152
- extend Bewildr::ControlPatterns::SelectionItemPattern
153
- when :menu
154
- extend Bewildr::ControlTypeAdditions::MenuAdditions
155
- when :menu_bar
156
- when :menu_item
157
- extend Bewildr::ControlTypeAdditions::MenuItemAdditions
158
- when :pane
159
- when :progress_bar
160
- extend Bewildr::ControlPatterns::RangeValuePattern
161
- when :radio_button
162
- extend Bewildr::ControlPatterns::SelectionItemPattern
163
- when :scroll_bar
164
- when :seperator
165
- when :slider
166
- extend Bewildr::ControlPatterns::RangeValuePattern
167
- when :spinner
168
- when :split_button
169
- when :status_bar
170
- when :tab
171
- extend Bewildr::ControlTypeAdditions::TabAdditions
172
- when :tab_item
173
- extend Bewildr::ControlPatterns::SelectionItemPattern
174
- when :table
175
- when :text
176
- extend Bewildr::ControlTypeAdditions::TextAdditions
177
- when :thumb
178
- when :title_bar
179
- when :tool_bar
180
- when :tool_tip
181
- when :tree
182
- extend Bewildr::ControlTypeAdditions::TreeAdditions
183
- when :tree_item
184
- extend Bewildr::ControlTypeAdditions::TreeItemAdditions
185
- when :window
186
- extend Bewildr::ControlTypeAdditions::WindowAdditions
187
- end
188
- end
189
- end
1
+ #Copyright (c) 2010, Nathaniel Ritmeyer. All rights reserved.
2
+
3
+ module Bewildr
4
+ class Element
5
+ attr_reader :automation_element
6
+ attr_reader :control_type
7
+
8
+ def initialize(input)
9
+ @automation_element = input
10
+ case input
11
+ when System::Windows::Automation::AutomationElement
12
+ set_control_type
13
+ build_element
14
+ when nil then @control_type = :non_existent
15
+ else raise Bewildr::BewildrInternalError, "Can only initialize an element with a nil or a Sys::Win::Auto::AE[C], not a #{input.class}"
16
+ end
17
+ end
18
+
19
+ def name
20
+ existence_check
21
+ @automation_element.current.name.to_s
22
+ end
23
+
24
+ def automation_id
25
+ existence_check
26
+ @automation_element.current.automation_id.to_s
27
+ end
28
+
29
+ def exists?
30
+ return false if @control_type == :non_existent
31
+ begin
32
+ @automation_element.current.bounding_rectangle
33
+ return true
34
+ rescue System::Windows::Automation::ElementNotAvailableException, TypeError => e
35
+ return false
36
+ end
37
+ end
38
+ alias :exist? :exists?
39
+
40
+ def contains?(condition_hash)
41
+ get(condition_hash).exists?
42
+ end
43
+ alias :contain? :contains?
44
+
45
+ def existence_check
46
+ raise Bewildr::ElementDoesntExist unless exists?
47
+ end
48
+ private :existence_check
49
+
50
+ def enabled?
51
+ existence_check
52
+ @automation_element.current.is_enabled
53
+ end
54
+
55
+ def wait_for_existence_of(condition_hash)
56
+ Timeout.timeout(30) do
57
+ sleep 0.1 until contains?(condition_hash)
58
+ end
59
+ get(condition_hash)
60
+ end
61
+
62
+ def wait_for_non_existence_of(condition_hash)
63
+ Timeout.timeout(30) do
64
+ sleep 0.1 unless contains?(condition_hash)
65
+ end
66
+ end
67
+
68
+ def focus
69
+ @automation_element.set_focus
70
+ end
71
+
72
+ #:id => "id"
73
+ #:name => "bob"
74
+ #:type => :button
75
+ #:scope => :children / :descendants
76
+ #:how_many => :first / :all
77
+ def get(condition_hash)
78
+ existence_check
79
+ condition = Finder.condition_for(condition_hash)
80
+ scope = Finder.scope_for(condition_hash)
81
+ how_many = Finder.how_many_for(condition_hash)
82
+
83
+ result = @automation_element.send how_many, scope, condition
84
+ case result
85
+ when System::Windows::Automation::AutomationElement, nil then return Bewildr::Element.new(result)
86
+ when System::Windows::Automation::AutomationElementCollection
87
+ c_array_list = System::Collections::ArrayList.new(result)
88
+ element_array = c_array_list.to_array.to_a
89
+ case
90
+ when element_array.size == 0 then return Bewildr::Element.new(nil)
91
+ #when element_array.size == 1 then return Bewildr::Element.new(element_array.first)
92
+ when element_array.size > 0 then return element_array.collect {|element| Bewildr::Element.new(element) }
93
+ end
94
+ end
95
+ end
96
+
97
+ #add "children/child" and "descendants/descendant" methods
98
+
99
+ def children
100
+ get({:scope => :children}).collect {|element| Bewildr::Element.new(element)}
101
+ end
102
+
103
+ def click
104
+ CLICKR.click(clickable_point)
105
+ end
106
+
107
+ def double_click
108
+ CLICKR.double_click(clickable_point)
109
+ end
110
+
111
+ def right_click
112
+ CLICKR.right_click(clickable_point)
113
+ end
114
+
115
+ def clickable_point
116
+ existence_check
117
+ Timeout.timeout(30) do
118
+ current_clickable_point = nil
119
+ begin
120
+ current_clickable_point = @automation_element.get_clickable_point
121
+ rescue System::Windows::Automation::NoClickablePointException
122
+ retry
123
+ end
124
+ return current_clickable_point
125
+ end
126
+ end
127
+
128
+ private
129
+
130
+ def set_control_type
131
+ @control_type = Bewildr::ControlType.symbol_for_enum(@automation_element.current.control_type)
132
+ end
133
+
134
+ #list of control types comes from http://msdn.microsoft.com/en-us/library/ms750574.aspx
135
+ def build_element
136
+ case @control_type
137
+ when :button
138
+ when :calendar
139
+ when :check_box
140
+ extend Bewildr::ControlPatterns::TogglePattern
141
+ when :combo_box
142
+ extend Bewildr::ControlTypeAdditions::ComboBoxAdditions
143
+ when :custom
144
+ build_custom_control_type
145
+ when :data_grid
146
+ extend Bewildr::ControlTypeAdditions::DataGridAdditions
147
+ when :data_item
148
+ when :document
149
+ extend Bewildr::ControlTypeAdditions::DocumentAdditions
150
+ when :edit
151
+ extend Bewildr::ControlPatterns::ValuePattern
152
+ when :group
153
+ when :header
154
+ when :header_item
155
+ when :hyperlink
156
+ extend Bewildr::ControlTypeAdditions::TextAdditions
157
+ when :image
158
+ when :list
159
+ extend Bewildr::ControlTypeAdditions::ListAdditions
160
+ when :list_item
161
+ extend Bewildr::ControlPatterns::SelectionItemPattern
162
+ when :menu
163
+ extend Bewildr::ControlTypeAdditions::MenuAdditions
164
+ when :menu_bar
165
+ when :menu_item
166
+ extend Bewildr::ControlTypeAdditions::MenuItemAdditions
167
+ when :pane
168
+ when :progress_bar
169
+ extend Bewildr::ControlPatterns::RangeValuePattern
170
+ when :radio_button
171
+ extend Bewildr::ControlPatterns::SelectionItemPattern
172
+ when :scroll_bar
173
+ when :seperator
174
+ when :slider
175
+ extend Bewildr::ControlPatterns::RangeValuePattern
176
+ when :spinner
177
+ when :split_button
178
+ when :status_bar
179
+ when :tab
180
+ extend Bewildr::ControlTypeAdditions::TabAdditions
181
+ when :tab_item
182
+ extend Bewildr::ControlPatterns::SelectionItemPattern
183
+ when :table
184
+ when :text
185
+ extend Bewildr::ControlTypeAdditions::TextAdditions
186
+ when :thumb
187
+ when :title_bar
188
+ when :tool_bar
189
+ when :tool_tip
190
+ when :tree
191
+ extend Bewildr::ControlTypeAdditions::TreeAdditions
192
+ when :tree_item
193
+ extend Bewildr::ControlTypeAdditions::TreeItemAdditions
194
+ when :window
195
+ extend Bewildr::ControlTypeAdditions::WindowAdditions
196
+ end
197
+ end
198
+
199
+ #TODO: this is horrible - fix it
200
+ def build_custom_control_type
201
+ @automation_element.get_supported_patterns.each do |supported_pattern|
202
+ case supported_pattern.programmatic_name.to_s
203
+ when "ValuePatternIdentifiers.Pattern" then extend Bewildr::ControlPatterns::ValuePattern
204
+ when "TableItemPatternIdentifiers.Pattern" then extend Bewildr::ControlPatterns::TableItemPattern
205
+ end
206
+ end
207
+ end
208
+ end
190
209
  end