rautomation 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,17 +8,12 @@ module RAutomation
8
8
  # Default locators used for searching buttons.
9
9
  DEFAULT_LOCATORS = {:class => /button/i}
10
10
 
11
- #todo - replace with UIA version
12
- # @see RAutomation::Button#value
13
- def value
14
- Functions.control_value(Functions.control_hwnd(@window.hwnd, @locators))
15
- end
16
-
17
11
  def exist?
18
12
  super && matches_type?(Constants::UIA_BUTTON_CONTROL_TYPE)
19
13
  end
20
14
 
21
15
  alias_method :exists?, :exist?
16
+ alias_method :value, :control_name
22
17
 
23
18
  end
24
19
  end
@@ -3,12 +3,6 @@ module RAutomation
3
3
  module MsUia
4
4
  module ButtonHelper
5
5
 
6
- #todo - replace with UIA version
7
- def set?
8
- control_hwnd = Functions.control_hwnd(@window.hwnd, @locators)
9
- Functions.control_set? control_hwnd
10
- end
11
-
12
6
  # @todo call a windows function to do this without clicking
13
7
  def clear
14
8
  click {!set?} if set?
@@ -40,8 +40,7 @@ module RAutomation
40
40
  wait_until do
41
41
  @window.activate
42
42
  @window.active? &&
43
- Functions.set_control_focus(hwnd) &&
44
- Functions.control_click(hwnd) &&
43
+ UiaDll::control_click(search_information) &&
45
44
  clicked = true # is clicked at least once
46
45
 
47
46
  block_given? ? yield : clicked && !exist?
@@ -57,23 +56,21 @@ module RAutomation
57
56
  end
58
57
 
59
58
  def enabled?
60
- !disabled?
59
+ UiaDll::is_enabled(search_information)
61
60
  end
62
61
 
63
- #todo - replace with UIA version
64
62
  def disabled?
65
- Functions.unavailable?(hwnd)
63
+ !enabled?
66
64
  end
67
65
 
68
66
  #todo - replace with UIA version
69
67
  def focused?
70
- Functions.has_focus?(hwnd)
68
+ UiaDll::is_focused(search_information)
71
69
  end
72
70
 
73
71
  def focus
74
72
  assert_enabled
75
- uia_control = UiaDll::element_from_handle(hwnd)
76
- UiaDll::set_focus(uia_control)
73
+ UiaDll::set_focus(search_information)
77
74
  end
78
75
 
79
76
  def bounding_rectangle
@@ -123,13 +120,13 @@ module RAutomation
123
120
  end
124
121
 
125
122
  def expand(which_item)
126
- UiaDll::expand_by_value hwnd, which_item if which_item.is_a? String
127
- UiaDll::expand_by_index hwnd, which_item if which_item.is_a? Integer
123
+ UiaDll::expand_by_value search_information, which_item if which_item.is_a? String
124
+ UiaDll::expand_by_index search_information, which_item if which_item.is_a? Integer
128
125
  end
129
126
 
130
127
  def collapse(which_item)
131
- UiaDll::collapse_by_value hwnd, which_item if which_item.is_a? String
132
- UiaDll::collapse_by_index hwnd, which_item if which_item.is_a? Integer
128
+ UiaDll::collapse_by_value search_information, which_item if which_item.is_a? String
129
+ UiaDll::collapse_by_index search_information, which_item if which_item.is_a? Integer
133
130
  end
134
131
 
135
132
  end
@@ -208,22 +208,6 @@ module RAutomation
208
208
  end
209
209
  end
210
210
 
211
- def set_control_text(control_hwnd, text)
212
- send_message(control_hwnd, Constants::WM_SETTEXT, 0, text)
213
- end
214
-
215
- def control_set?(control_hwnd)
216
- get_button_state(control_hwnd) & Constants::STATE_SYSTEM_CHECKED != 0
217
- end
218
-
219
- def has_focus?(control_hwnd)
220
- get_button_state(control_hwnd) & Constants::STATE_SYSTEM_FOCUSED != 0
221
- end
222
-
223
- def unavailable?(control_hwnd)
224
- get_button_state(control_hwnd) & Constants::STATE_SYSTEM_UNAVAILABLE != 0
225
- end
226
-
227
211
  def retrieve_combobox_item_text(control_hwnd, item_no)
228
212
  text_len = 1024
229
213
  string_buffer = FFI::MemoryPointer.new :char, text_len
@@ -5,16 +5,12 @@ module RAutomation
5
5
  include WaitHelper
6
6
  include Locators
7
7
 
8
- #todo - replace with UIA version
9
- def value
10
- Functions.control_value(Functions.control_hwnd(@window.hwnd, @locators))
11
- end
12
-
13
8
  def exist?
14
9
  super && matches_type?(Constants::UIA_TEXT_CONTROL_TYPE)
15
10
  end
16
11
 
17
12
  alias_method :exists?, :exist?
13
+ alias_method :value, :control_name
18
14
 
19
15
  end
20
16
  end
@@ -17,7 +17,7 @@ module RAutomation
17
17
  end
18
18
 
19
19
  def strings
20
- items.collect { |item| item.value}
20
+ UiaDll::find_table_values(search_information)
21
21
  end
22
22
 
23
23
  def value
@@ -31,37 +31,14 @@ module RAutomation
31
31
  alias_method :exists?, :exist?
32
32
 
33
33
  def selected?(index)
34
- if items[index]
35
- return items[index].selected?
36
- end
37
-
38
- false
34
+ item = items[index]
35
+ return item && item.selected?
39
36
  end
40
37
 
41
38
  def select(index)
42
39
  UiaDll::select_list_select_index search_information, index
43
40
  end
44
41
 
45
- def list_boundary
46
- boundary = FFI::MemoryPointer.new :long, 4
47
-
48
- Functions.send_message(hwnd, Constants::LB_GETITEMRECT, 0 ,boundary)
49
-
50
- boundary.read_array_of_long(4)
51
- end
52
-
53
- def get_top_index
54
- Functions.send_message(hwnd, Constants::LB_GETTOPINDEX, 0 ,nil)
55
- end
56
-
57
- def list_item_height
58
- Functions.send_message(hwnd, Constants::LB_GETITEMHEIGHT, 0 ,nil)
59
- end
60
-
61
- def scroll_to_item(row)
62
- Functions.send_message(hwnd, Constants::LB_SETTOPINDEX, row ,nil)
63
- end
64
-
65
42
  end
66
43
  end
67
44
  end
@@ -7,7 +7,7 @@ module RAutomation
7
7
  include Locators
8
8
 
9
9
  class SelectListOption
10
- attr_accessor :text, :index, :control_hwnd
10
+ attr_accessor :text, :index
11
11
 
12
12
  def initialize(select_list, text, index)
13
13
  @select_list = select_list
@@ -16,7 +16,7 @@ module RAutomation
16
16
  end
17
17
 
18
18
  def selected?
19
- @index == UiaDll::select_list_selected_index(@select_list.control_hwnd)
19
+ @index == UiaDll::select_list_selected_index(@select_list.search_information)
20
20
  end
21
21
 
22
22
  def select
@@ -27,11 +27,6 @@ module RAutomation
27
27
  alias_method :set, :select
28
28
  end
29
29
 
30
- def initialize(window, locators)
31
- super
32
- @hwnd = Functions.control_hwnd(@window.hwnd, @locators)
33
- end
34
-
35
30
  def set(value)
36
31
  UiaDll::select_list_select_value(search_information, value)
37
32
  end
@@ -39,9 +34,8 @@ module RAutomation
39
34
  def options(options = {})
40
35
  items = []
41
36
 
42
- item_count.times do |item_no|
43
- item = Functions.retrieve_combobox_item_text(@hwnd, item_no)
44
-
37
+ select_options = UiaDll::select_options(search_information)
38
+ select_options.each_with_index do |item, item_no|
45
39
  if options[:text]
46
40
  items.push(SelectListOption.new(self, item, item_no)) if options[:text] == item
47
41
  else
@@ -53,47 +47,21 @@ module RAutomation
53
47
  end
54
48
 
55
49
  def value
56
- selected_option = options.find { |option| option.selected? }
57
- selected_option ? selected_option.text : ""
50
+ UiaDll::selection(search_information)
58
51
  end
59
52
 
60
53
  def option(options)
61
- item_count.times do |item_no|
62
- item = Functions.retrieve_combobox_item_text(@hwnd, item_no)
54
+ UiaDll::select_options(search_information).each_with_index do |item, item_no|
63
55
  return SelectListOption.new(self, item, item_no) if options[:text] == item
64
56
  end
65
57
 
66
58
  nil
67
59
  end
68
60
 
69
- def control_hwnd
70
- @hwnd
71
- end
72
-
73
61
  def select(index)
74
62
  UiaDll::select_list_select_index search_information, index
75
63
  end
76
64
 
77
- def list_item_height
78
- Functions.send_message(@hwnd, Constants::CB_GETITEMHEIGHT, 0 ,nil)
79
- end
80
-
81
- def dropbox_boundary
82
- boundary = FFI::MemoryPointer.new :long, 4
83
-
84
- Functions.send_message(@hwnd, Constants::CB_GETDROPPEDCONTROLRECT, 0 ,boundary)
85
-
86
- boundary.read_array_of_long(4)
87
- end
88
-
89
- def get_top_index
90
- Functions.send_message(@hwnd, Constants::CB_GETTOPINDEX, 0 ,nil)
91
- end
92
-
93
- def scroll_to_item(row)
94
- Functions.send_message(@hwnd, Constants::CB_SETTOPINDEX , row ,nil)
95
- end
96
-
97
65
  def exist?
98
66
  super && matches_type?(Constants::UIA_COMBOBOX_CONTROL_TYPE)
99
67
  end
@@ -3,21 +3,21 @@ module RAutomation
3
3
  module MsUia
4
4
  class Cell
5
5
  include Locators
6
- attr_reader :row, :column, :hwnd
6
+ attr_reader :row, :column, :search_information
7
7
 
8
8
  def initialize(window, locators)
9
- @hwnd = window.hwnd
9
+ @search_information = window.search_information
10
10
  @locators = extract(locators)
11
11
  @row = window.row
12
12
  @column = @locators[:index] || 0
13
13
  end
14
14
 
15
15
  def exists?
16
- UiaDll::table_coordinate_valid? hwnd, row, column
16
+ UiaDll::table_coordinate_valid? search_information, row, column
17
17
  end
18
18
 
19
19
  def value
20
- UiaDll::table_value_at hwnd, row, column
20
+ UiaDll::table_value_at search_information, row, column
21
21
  end
22
22
 
23
23
  alias_method :text, :value
@@ -27,7 +27,7 @@ module RAutomation
27
27
  class Row
28
28
  include Locators
29
29
  extend ElementCollections
30
- attr_reader :hwnd
30
+ attr_reader :search_information
31
31
 
32
32
  has_many :cells
33
33
 
@@ -42,7 +42,7 @@ module RAutomation
42
42
  end
43
43
 
44
44
  def initialize(window, locators)
45
- @hwnd = window.hwnd
45
+ @search_information = window.search_information
46
46
  @locators = extract(locators)
47
47
  end
48
48
 
@@ -51,11 +51,11 @@ module RAutomation
51
51
  end
52
52
 
53
53
  def value
54
- UiaDll::table_value_at @hwnd, @locators[:index]
54
+ UiaDll::table_value_at search_information, @locators[:index]
55
55
  end
56
56
 
57
57
  def exists?
58
- UiaDll::table_coordinate_valid?(@hwnd, @locators[:index])
58
+ UiaDll::table_coordinate_valid?(search_information, @locators[:index])
59
59
  end
60
60
 
61
61
  def self.locators_match?(locators, item)
@@ -87,8 +87,8 @@ module RAutomation
87
87
  end
88
88
 
89
89
  def strings
90
- headers = UiaDll.table_headers(hwnd)
91
- values = UiaDll.table_values(hwnd)
90
+ headers = UiaDll.table_headers(search_information)
91
+ values = UiaDll.table_values(search_information)
92
92
  return values if headers.empty?
93
93
 
94
94
  all_strings = [] << headers
@@ -97,15 +97,15 @@ module RAutomation
97
97
  end
98
98
 
99
99
  def select(which_item)
100
- UiaDll::table_select hwnd, which_item
100
+ UiaDll::table_select search_information, which_item
101
101
  end
102
102
 
103
103
  def selected?(which_item)
104
- UiaDll::table_row_is_selected hwnd, which_item
104
+ UiaDll::table_row_is_selected search_information, which_item
105
105
  end
106
106
 
107
107
  def row_count
108
- UiaDll::table_row_count hwnd
108
+ UiaDll::table_row_count search_information
109
109
  end
110
110
 
111
111
  def exist?
@@ -117,13 +117,6 @@ module RAutomation
117
117
  end
118
118
 
119
119
  alias_method :exists?, :exist?
120
-
121
- private
122
-
123
- def count_children(element)
124
- UiaDll::find_children(element, nil)
125
- end
126
-
127
120
  end
128
121
  end
129
122
  end
@@ -12,15 +12,7 @@ module RAutomation
12
12
  # @see RAutomation::TextField#set
13
13
  def set(text)
14
14
  raise "Cannot set value on a disabled text field" if disabled?
15
-
16
- wait_until do
17
- hwnd = Functions.control_hwnd(@window.hwnd, @locators)
18
- @window.activate
19
- @window.active? &&
20
- Functions.set_control_focus(hwnd) &&
21
- Functions.set_control_text(hwnd, text) &&
22
- value == text
23
- end
15
+ UiaDll::set_control_value(search_information, text)
24
16
  end
25
17
 
26
18
  # @see RAutomation::TextField#clear
@@ -32,13 +24,7 @@ module RAutomation
32
24
  #todo - replace with UIA version
33
25
  # @see RAutomation::TextField#value
34
26
  def value
35
- Functions.control_value(hwnd)
36
- end
37
-
38
- #todo - replace with UIA version
39
- # @see RAutomation::TextField#hwnd
40
- def hwnd
41
- Functions.control_hwnd(@window.hwnd, @locators)
27
+ UiaDll::get_control_value(search_information)
42
28
  end
43
29
 
44
30
  def exist?
@@ -104,12 +104,15 @@ module RAutomation
104
104
  # Generic Control methods
105
105
  attach_function :ElementExists, [SearchCriteria.by_ref], :bool
106
106
  attach_function :process_id, :ProcessId, [SearchCriteria.by_ref], :int
107
- attach_function :Control_GetValue, [:long, :pointer, :int], :void
108
- attach_function :set_control_value, :Control_SetValue, [:long, :string], :void
107
+ attach_function :Control_GetValue, [SearchCriteria.by_ref, :pointer, :int], :void
108
+ attach_function :set_control_value, :Control_SetValue, [SearchCriteria.by_ref, :string], :void
109
109
  attach_function :BoundingRectangle, [SearchCriteria.by_ref, :pointer], :int
110
110
  attach_function :current_control_type, :ControlType, [SearchCriteria.by_ref], :int
111
111
  attach_function :Name, [SearchCriteria.by_ref, :pointer, :int], :void
112
112
  attach_function :ClassName, [SearchCriteria.by_ref, :pointer, :int], :void
113
+ attach_function :is_enabled, :IsEnabled, [SearchCriteria.by_ref], :bool
114
+ attach_function :is_focused, :IsFocused, [SearchCriteria.by_ref], :bool
115
+ attach_function :set_focus, :SetControlFocus, [SearchCriteria.by_ref], :bool
113
116
  attach_function :GetClassNames,
114
117
  [SearchCriteria.by_ref, :pointer], :int
115
118
 
@@ -123,8 +126,8 @@ module RAutomation
123
126
  boundary.read_array_of_long(4)
124
127
  end
125
128
 
126
- def self.get_control_value(hwnd)
127
- string_from(:Control_GetValue, hwnd)
129
+ def self.get_control_value(search_information)
130
+ string_from(:Control_GetValue, search_information)
128
131
  end
129
132
 
130
133
  def self.name(search_information)
@@ -148,17 +151,23 @@ module RAutomation
148
151
  # Select List methods
149
152
  attach_function :SelectList_Selection,
150
153
  [SearchCriteria.by_ref, :pointer, :int], :void
154
+ attach_function :SelectList_Options,
155
+ [SearchCriteria.by_ref, :pointer], :int
151
156
  attach_function :select_list_count, :SelectList_Count,
152
157
  [SearchCriteria.by_ref], :int
153
158
  attach_function :select_list_selected_index, :SelectList_SelectedIndex,
154
- [:long], :int
159
+ [SearchCriteria.by_ref], :int
155
160
  attach_function :select_list_value_at, :SelectList_ValueAt,
156
- [:long, :int, :pointer, :int], :bool
161
+ [SearchCriteria.by_ref, :int, :pointer, :int], :bool
157
162
  attach_function :select_list_select_index, :SelectList_SelectIndex,
158
163
  [SearchCriteria.by_ref, :int], :bool
159
164
  attach_function :select_list_select_value, :SelectList_SelectValue,
160
165
  [SearchCriteria.by_ref, :pointer], :int
161
166
 
167
+ def self.select_options(search_information)
168
+ strings_from(:SelectList_Options, search_information)
169
+ end
170
+
162
171
  def self.selection(search_information)
163
172
  string_from(:SelectList_Selection, search_information)
164
173
  end
@@ -171,47 +180,47 @@ module RAutomation
171
180
 
172
181
  # Table methods
173
182
  attach_function :Table_GetHeaders,
174
- [:long, :pointer], :int
183
+ [SearchCriteria.by_ref, :pointer], :int
175
184
  attach_function :Table_GetValues,
176
- [:long, :pointer], :int
185
+ [SearchCriteria.by_ref, :pointer], :int
177
186
  attach_function :Table_FindValues,
178
187
  [SearchCriteria.by_ref, :pointer], :int
179
188
  attach_function :table_row_count, :Table_RowCount,
180
- [:long], :int
189
+ [SearchCriteria.by_ref], :int
181
190
  attach_function :Table_CoordinateIsValid,
182
- [:long, :int, :int], :bool
191
+ [SearchCriteria.by_ref, :int, :int], :bool
183
192
  attach_function :Table_ValueAt,
184
- [:long, :int, :int, :pointer, :int], :void
193
+ [SearchCriteria.by_ref, :int, :int, :pointer, :int], :void
185
194
  attach_function :Table_SelectByIndex,
186
- [:long, :int], :void
195
+ [SearchCriteria.by_ref, :int], :void
187
196
  attach_function :Table_SelectByValue,
188
- [:long, :string], :void
197
+ [SearchCriteria.by_ref, :string], :void
189
198
  attach_function :table_row_is_selected, :Table_IsSelectedByIndex,
190
- [:long, :int], :bool
199
+ [SearchCriteria.by_ref, :int], :bool
191
200
 
192
- def self.table_select(hwnd, which_item)
201
+ def self.table_select(search_information, which_item)
193
202
  case which_item
194
203
  when Integer
195
- Table_SelectByIndex hwnd, which_item
204
+ Table_SelectByIndex search_information, which_item
196
205
  when String
197
- Table_SelectByValue hwnd, which_item
206
+ Table_SelectByValue search_information, which_item
198
207
  end
199
208
  end
200
209
 
201
- def self.table_value_at(hwnd, row, column=0)
202
- string_from(:Table_ValueAt, hwnd, row, column)
210
+ def self.table_value_at(search_information, row, column=0)
211
+ string_from(:Table_ValueAt, search_information, row, column)
203
212
  end
204
213
 
205
- def self.table_coordinate_valid?(hwnd, row, column=0)
206
- Table_CoordinateIsValid hwnd, row, column
214
+ def self.table_coordinate_valid?(search_information, row, column=0)
215
+ Table_CoordinateIsValid search_information, row, column
207
216
  end
208
217
 
209
- def self.table_headers(hwnd)
210
- strings_from :Table_GetHeaders, hwnd
218
+ def self.table_headers(search_information)
219
+ strings_from :Table_GetHeaders, search_information
211
220
  end
212
221
 
213
- def self.table_values(hwnd)
214
- strings_from :Table_GetValues, hwnd
222
+ def self.table_values(search_information)
223
+ strings_from :Table_GetValues, search_information
215
224
  end
216
225
 
217
226
  def self.find_table_values(search_information)
@@ -230,8 +239,6 @@ module RAutomation
230
239
  [:pointer, :string], :pointer
231
240
  attach_function :current_native_window_handle, :RA_CurrentNativeWindowHandle,
232
241
  [:pointer], :long
233
- attach_function :set_focus, :RA_SetFocus,
234
- [:pointer], :bool
235
242
  attach_function :move_mouse, :RA_MoveMouse,
236
243
  [:int,:int], :long
237
244
  attach_function :click_mouse, :RA_ClickMouse,
@@ -245,18 +252,22 @@ module RAutomation
245
252
  attach_function :select, :RA_Select,
246
253
  [:pointer], :int
247
254
  attach_function :expand_by_value, :RA_ExpandItemByValue,
248
- [:long, :string], :void
255
+ [SearchCriteria.by_ref, :string], :void
249
256
  attach_function :expand_by_index, :RA_ExpandItemByIndex,
250
- [:long, :int], :void
257
+ [SearchCriteria.by_ref, :int], :void
251
258
  attach_function :collapse_by_value, :RA_CollapseItemByValue,
252
- [:long, :string], :void
259
+ [SearchCriteria.by_ref, :string], :void
253
260
  attach_function :collapse_by_index, :RA_CollapseItemByIndex,
254
- [:long, :int], :void
255
- attach_function :control_click, :RA_Click,
256
- [:long, :pointer, :int], :void
261
+ [SearchCriteria.by_ref, :int], :void
262
+ attach_function :RA_Click,
263
+ [SearchCriteria.by_ref, :pointer, :int], :void
257
264
  attach_function :control_mouse_click, :RA_PointAndClick,
258
265
  [:long, :pointer, :int], :void
259
266
 
267
+ def self.control_click(search_information)
268
+ can_throw(:RA_Click, search_information)
269
+ end
270
+
260
271
  private
261
272
  def self.strings_from(method, hwnd)
262
273
  string_count = send method, hwnd, nil
@@ -272,6 +283,14 @@ module RAutomation
272
283
  send method, *(args << pointer << 1024)
273
284
  pointer.read_string
274
285
  end
286
+
287
+ def self.can_throw(method, *args)
288
+ string_buffer = FFI::MemoryPointer.new :char, 1024
289
+ send method, *(args << string_buffer << 1024)
290
+ error_info = string_buffer.read_string
291
+ raise error_info unless error_info.empty?
292
+ true
293
+ end
275
294
  end
276
295
  end
277
296
  end