bewildr 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. data/README.rdoc +1 -1
  2. data/Rakefile +1 -1
  3. data/lib/bewildr/control_patterns/expand_collapse_pattern.rb +7 -0
  4. data/lib/bewildr/control_patterns/grid_pattern.rb +3 -0
  5. data/lib/bewildr/control_patterns/range_value_pattern.rb +4 -0
  6. data/lib/bewildr/control_patterns/scroll_pattern.rb +26 -25
  7. data/lib/bewildr/control_patterns/selection_item_pattern.rb +3 -0
  8. data/lib/bewildr/control_patterns/selection_pattern.rb +3 -0
  9. data/lib/bewildr/control_patterns/table_item_pattern.rb +2 -0
  10. data/lib/bewildr/control_patterns/table_pattern.rb +2 -0
  11. data/lib/bewildr/control_patterns/text_pattern.rb +2 -0
  12. data/lib/bewildr/control_patterns/toggle_pattern.rb +61 -36
  13. data/lib/bewildr/control_patterns/value_pattern.rb +3 -0
  14. data/lib/bewildr/control_patterns/window_pattern.rb +8 -0
  15. data/lib/bewildr/control_type_additions/combo_box_additions.rb +70 -65
  16. data/lib/bewildr/control_type_additions/data_grid_additions.rb +3 -6
  17. data/lib/bewildr/control_type_additions/document_additions.rb +21 -22
  18. data/lib/bewildr/control_type_additions/list_additions.rb +51 -47
  19. data/lib/bewildr/control_type_additions/menu_additions.rb +49 -44
  20. data/lib/bewildr/control_type_additions/menu_item_additions.rb +6 -10
  21. data/lib/bewildr/control_type_additions/scroll_additions.rb +16 -20
  22. data/lib/bewildr/control_type_additions/tab_additions.rb +17 -17
  23. data/lib/bewildr/control_type_additions/text_additions.rb +4 -7
  24. data/lib/bewildr/control_type_additions/tree_additions.rb +45 -41
  25. data/lib/bewildr/control_type_additions/tree_item_additions.rb +14 -17
  26. data/lib/bewildr/control_type_additions/window_additions.rb +8 -10
  27. data/lib/bewildr/element.rb +10 -0
  28. data/lib/bewildr/windows.rb +1 -0
  29. metadata +4 -4
@@ -9,7 +9,7 @@ Documentation is on the way; until then, take a look at the tests or read the AP
9
9
  ==Getting started
10
10
  ===Dependencies
11
11
  1. Install .net 3 and 4 (http://www.microsoft.com/downloads/details.aspx?FamilyID=10cc340b-f857-4a14-83f5-25634c3bf043&displaylang=en & http://msdn.microsoft.com/en-us/netframework/aa569263.aspx)
12
- 2. Install the latest ironruby (http://www.ironruby.net/), and for your own sanity install it in c:\\\\ironruby instead of the default location.
12
+ 2. Install the latest ironruby (http://ironruby.codeplex.com/), and for your own sanity install it in c:\\\\ironruby instead of the default location.
13
13
  3. You'll need at least rubygems version 1.3.6:
14
14
  gem update --system
15
15
 
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ require 'cucumber/rake/task'
10
10
 
11
11
  spec = Gem::Specification.new do |s|
12
12
  s.name = 'bewildr'
13
- s.version = '0.1.9'
13
+ s.version = '0.1.10'
14
14
  s.has_rdoc = true
15
15
  s.extra_rdoc_files = ['README.rdoc', 'LICENSE']
16
16
  s.summary = 'Test WPF UI apps with IronRuby'
@@ -3,14 +3,21 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module ExpandCollapsePattern
6
+ #Expands the element - use to open combo boxes
6
7
  def expand
7
8
  @automation_element.get_current_pattern(System::Windows::Automation::ExpandCollapsePattern.pattern).expand unless expand_state == :expanded or expand_state == :leaf
8
9
  end
9
10
 
11
+ #Collapses the element - use to close combo boxes
10
12
  def collapse
11
13
  @automation_element.get_current_pattern(System::Windows::Automation::ExpandCollapsePattern.pattern).collapse unless expand_state == :collapsed or expand_state == :leaf
12
14
  end
13
15
 
16
+ #Returns the expand-state of the element. The available states are:
17
+ # :collapsed
18
+ # :expanded
19
+ # :partially_expanded
20
+ # :leaf
14
21
  def expand_state
15
22
  case @automation_element.get_current_pattern(System::Windows::Automation::ExpandCollapsePattern.pattern).current.expand_collapse_state
16
23
  when System::Windows::Automation::ExpandCollapseState.collapsed then return :collapsed
@@ -3,14 +3,17 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module GridPattern
6
+ #Returns the number of rows in the grid
6
7
  def row_count
7
8
  @automation_element.get_current_pattern(System::Windows::Automation::GridPattern.pattern).current.row_count.to_i
8
9
  end
9
10
 
11
+ #Returns the number of columns in the grid
10
12
  def column_count
11
13
  @automation_element.get_current_pattern(System::Windows::Automation::GridPattern.pattern).current.column_count.to_i
12
14
  end
13
15
 
16
+ #Returns an item from the grid
14
17
  def get_item(row, column)
15
18
  item = @automation_element.get_current_pattern(System::Windows::Automation::GridPattern.pattern).get_item(row, column)
16
19
  Bewildr::Element.new(item)
@@ -3,18 +3,22 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module RangeValuePattern
6
+ #Returns the current value of the element
6
7
  def value
7
8
  @automation_element.get_current_pattern(System::Windows::Automation::RangeValuePattern.pattern).current.value.to_f
8
9
  end
9
10
 
11
+ #Sets the value of the element
10
12
  def value=(input)
11
13
  @automation_element.get_current_pattern(System::Windows::Automation::RangeValuePattern.pattern).set_value(input.to_f)
12
14
  end
13
15
 
16
+ #Returns the maximum value of the element
14
17
  def maximum
15
18
  @automation_element.get_current_pattern(System::Windows::Automation::RangeValuePattern.pattern).current.maximum.to_f
16
19
  end
17
20
 
21
+ #Returns the minimum value of the element
18
22
  def minimum
19
23
  @automation_element.get_current_pattern(System::Windows::Automation::RangeValuePattern.pattern).current.minimum.to_f
20
24
  end
@@ -3,35 +3,36 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module ScrollPattern
6
- def self.extended(base)
7
-
8
- base.instance_eval do
9
- def vertically_scrollable
10
- @automation_element.get_current_pattern(System::Windows::Automation::ScrollPattern.pattern).current.vertically_scrollable
11
- end
6
+ #Returns true if the element is vertically scrollable, false if it's not
7
+ def vertically_scrollable
8
+ @automation_element.get_current_pattern(System::Windows::Automation::ScrollPattern.pattern).current.vertically_scrollable
9
+ end
10
+
11
+ #Returns the current vertical scroll percent
12
+ def vertical_scroll_percent
13
+ @automation_element.get_current_pattern(System::Windows::Automation::ScrollPattern.pattern).current.vertical_scroll_percent.to_f
14
+ end
15
+ alias :scroll_percent :vertical_scroll_percent
12
16
 
13
- def vertical_scroll_percent
14
- @automation_element.get_current_pattern(System::Windows::Automation::ScrollPattern.pattern).current.vertical_scroll_percent.to_f
15
- end
16
- alias :scroll_percent :vertical_scroll_percent
17
+ #Set the scroll percent of the element
18
+ def set_scroll_percent(percent_horizontal, percent_vertical)
19
+ @automation_element.get_current_pattern(System::Windows::Automation::ScrollPattern.pattern).set_scroll_percent(percent_horizontal, percent_vertical)
20
+ end
17
21
 
18
- def set_scroll_percent(percent_horizontal, percent_vertical)
19
- @automation_element.get_current_pattern(System::Windows::Automation::ScrollPattern.pattern).set_scroll_percent(percent_horizontal, percent_vertical)
20
- end
21
-
22
- def scroll_vertically_to(target_percentage)
23
- set_scroll_percent(System::Windows::Automation::ScrollPattern.NoScroll, target_percentage)
24
- end
25
- alias :scroll_to :scroll_vertically_to
22
+ #Set the vertical scroll percent of the element
23
+ def scroll_vertically_to(target_percentage)
24
+ set_scroll_percent(System::Windows::Automation::ScrollPattern.NoScroll, target_percentage)
25
+ end
26
+ alias :scroll_to :scroll_vertically_to
26
27
 
27
- def scroll_horizontally_to(target_percentage)
28
- set_scroll_percent(target_percentage, System::Windows::Automation::ScrollPattern.NoScroll)
29
- end
28
+ #Set the horizontal scroll percent of the element
29
+ def scroll_horizontally_to(target_percentage)
30
+ set_scroll_percent(target_percentage, System::Windows::Automation::ScrollPattern.NoScroll)
31
+ end
30
32
 
31
- def scroll_down_one_page
32
- @automation_element.get_current_pattern(System::Windows::Automation::ScrollPattern.pattern).scroll_vertical(System::Windows::Automation::ScrollAmount.LargeIncrement)
33
- end
34
- end
33
+ #Scrolls vertically down by one 'page'
34
+ def scroll_down_one_page
35
+ @automation_element.get_current_pattern(System::Windows::Automation::ScrollPattern.pattern).scroll_vertical(System::Windows::Automation::ScrollAmount.LargeIncrement)
35
36
  end
36
37
  end
37
38
  end
@@ -4,14 +4,17 @@
4
4
  module Bewildr
5
5
  module ControlPatterns
6
6
  module SelectionItemPattern
7
+ #Selects the element
7
8
  def select
8
9
  @automation_element.get_current_pattern(System::Windows::Automation::SelectionItemPattern.pattern).select
9
10
  end
10
11
 
12
+ #Returns true if the element is selected, false if it's not
11
13
  def selected?
12
14
  @automation_element.get_current_pattern(System::Windows::Automation::SelectionItemPattern.pattern).current.is_selected
13
15
  end
14
16
 
17
+ #Returns false if the element is selected, true if it's not
15
18
  def unselected?
16
19
  !selected?
17
20
  end
@@ -3,6 +3,7 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module SelectionPattern
6
+ #Returns the elements that are selected
6
7
  def get_selection
7
8
  my_selected_items = @automation_element.get_current_pattern(System::Windows::Automation::SelectionPattern.pattern).current.get_selection
8
9
 
@@ -13,11 +14,13 @@ module Bewildr
13
14
  item_array.to_a.collect {|item| Bewildr::Element.new(item)}
14
15
  end
15
16
 
17
+ #Returns true if more than one selection is possible, false if it's not
16
18
  def multi_selectable?
17
19
  @automation_element.get_current_pattern(System::Windows::Automation::SelectionPattern.pattern).current.can_select_multiple
18
20
  end
19
21
  alias :can_select_multiple? :multi_selectable?
20
22
 
23
+ #Returns the (first - if relevant) selected item
21
24
  def selected
22
25
  multi_selectable? ? get_selection : get_selection.first
23
26
  end
@@ -3,10 +3,12 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module TableItemPattern
6
+ #Returns the number of rows the element spans
6
7
  def row_span
7
8
  @automation_element.get_current_pattern(System::Windows::Automation::TableItemPattern.pattern).current.row_span.to_i
8
9
  end
9
10
 
11
+ #Returns the number of columns the element spans
10
12
  def column_span
11
13
  @automation_element.get_current_pattern(System::Windows::Automation::TableItemPattern.pattern).current.column_span.to_i
12
14
  end
@@ -3,6 +3,7 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module TablePattern
6
+ #Returns an array of elements containing the column headers
6
7
  def column_headers
7
8
  #the following line seems to prompt the table pattern into giving up the column header
8
9
  #information that's called on the line that follows it. Weird? tell me about it...
@@ -12,6 +13,7 @@ module Bewildr
12
13
  end
13
14
  end
14
15
 
16
+ #Returns a string array containing the column header names
15
17
  def column_header_names
16
18
  column_headers.collect {|header| header.name }
17
19
  end
@@ -3,10 +3,12 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module TextPattern
6
+ #Selects all of the text in the element
6
7
  def select_all
7
8
  @automation_element.get_current_pattern(System::Windows::Automation::TextPattern.pattern).document_range.select
8
9
  end
9
10
 
11
+ #Returns all the element's text
10
12
  def get_text
11
13
  @automation_element.get_current_pattern(System::Windows::Automation::TextPattern.pattern).document_range.get_text(-1).to_s
12
14
  end
@@ -2,51 +2,76 @@
2
2
 
3
3
  module Bewildr
4
4
  module ControlPatterns
5
- module TogglePattern
5
+ module TogglePatternForButton
6
+ #Toggle on the element
7
+ def toggle_on
8
+ set_state_to(:on)
9
+ end
6
10
 
7
- def self.extended(base)
8
- base.instance_eval do
9
- case @control_type
10
- when :check_box
11
- def check
12
- set_state_to :on
13
- end
11
+ #Toggle off the element
12
+ def toggle_off
13
+ set_state_to(:off)
14
+ end
14
15
 
15
- def uncheck
16
- set_state_to :off
17
- end
16
+ #Return the toggle state. The available states are:
17
+ # :on
18
+ # :off
19
+ # :indeterminate
20
+ def toggle_state
21
+ state
22
+ end
18
23
 
19
- def checked?
20
- state == :on
21
- end
24
+ #Toggle the element
25
+ def toggle
26
+ flip_state
27
+ end
28
+ end
22
29
 
23
- def unchecked?
24
- state == :off
25
- end
30
+ module TogglePatternForCheckBox
31
+ #Check the element
32
+ def check
33
+ set_state_to :on
34
+ end
26
35
 
27
- def indeterminate?
28
- state == :indeterminate
29
- end
36
+ #Uncheck the element
37
+ def uncheck
38
+ set_state_to :off
39
+ end
30
40
 
31
- def checked_state
32
- state
33
- end
34
- when :button
35
- def toggle_on
36
- set_state_to(:on)
37
- end
41
+ #Return true if the element is checked, false if it's not
42
+ def checked?
43
+ state == :on
44
+ end
45
+
46
+ #Return true if the element is unchecked, false if it's not
47
+ def unchecked?
48
+ state == :off
49
+ end
38
50
 
39
- def toggle_off
40
- set_state_to(:off)
41
- end
51
+ #Return true if the element is indeterminate, false if it's not
52
+ def indeterminate?
53
+ state == :indeterminate
54
+ end
42
55
 
43
- def toggle_state
44
- state
45
- end
56
+ #Returns the checked state. The available states are:
57
+ # :on
58
+ # :off
59
+ # :indeterminate
60
+ def checked_state
61
+ state
62
+ end
63
+ end
46
64
 
47
- def toggle
48
- flip_state
49
- end
65
+ #These are not the toggle patterns you are looking for [wave of the hand/]. If you are dealing with a button, look for Bewildr::ControlPatterns::TogglePatternForButton.
66
+ #If you're dealing with a checkbox, take a look at Bewildr::ControlPatterns::TogglePatternForCheckBox
67
+ module TogglePattern
68
+ def self.extended(base)
69
+ base.instance_eval do
70
+ case @control_type
71
+ when :check_box
72
+ base.extend(Bewildr::ControlPatterns::TogglePatternForCheckBox)
73
+ when :button
74
+ base.extend(Bewildr::ControlPatterns::TogglePatternForButton)
50
75
  end
51
76
  end
52
77
  end
@@ -3,15 +3,18 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module ValuePattern
6
+ #Returns true if the element is a password field, false if it's not
6
7
  def password_field?
7
8
  @automation_element.current.class_name.to_s == "PasswordBox" ? true : false
8
9
  end
9
10
 
11
+ #Returns the element's text
10
12
  def text
11
13
  raise Bewildr::PasswordFieldReadAttempt, "You can't get the text of a password field" if password_field?
12
14
  @automation_element.get_current_pattern(System::Windows::Automation::ValuePattern.pattern).current.value.to_s
13
15
  end
14
16
 
17
+ #Sets the element's text
15
18
  def text=(input)
16
19
  raise Bewildr::ElementNotEnabled unless enabled?
17
20
  @automation_element.get_current_pattern(System::Windows::Automation::ValuePattern.pattern).set_value(input)
@@ -3,22 +3,30 @@
3
3
  module Bewildr
4
4
  module ControlPatterns
5
5
  module WindowPattern
6
+ #Closes the window
6
7
  def close
7
8
  @automation_element.get_current_pattern(System::Windows::Automation::WindowPattern.pattern).close
8
9
  end
9
10
 
11
+ #Minimizes the window
10
12
  def minimize
11
13
  @automation_element.get_current_pattern(System::Windows::Automation::WindowPattern.pattern).set_window_visual_state(System::Windows::Automation::WindowVisualState.minimized)
12
14
  end
13
15
 
16
+ #Maximizes the window
14
17
  def maximize
15
18
  @automation_element.get_current_pattern(System::Windows::Automation::WindowPattern.pattern).set_window_visual_state(System::Windows::Automation::WindowVisualState.maximized)
16
19
  end
17
20
 
21
+ #Restores the window
18
22
  def restore
19
23
  @automation_element.get_current_pattern(System::Windows::Automation::WindowPattern.pattern).set_window_visual_state(System::Windows::Automation::WindowVisualState.normal)
20
24
  end
21
25
 
26
+ #Returns the visual state of the window. Available states are:
27
+ # :maximized
28
+ # :minimized
29
+ # :normal
22
30
  def visual_state
23
31
  case @automation_element.get_current_pattern(System::Windows::Automation::WindowPattern.pattern).current.window_visual_state
24
32
  when System::Windows::Automation::WindowVisualState.maximized then return :maximized
@@ -3,79 +3,84 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module ComboBoxAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def items
9
- my_list_items = list_items
10
- return nil if my_list_items.nil?
11
- my_list_items.collect {|item| item.name}
12
- end
6
+ #Returns a string array containing the element's item names
7
+ def items
8
+ my_list_items = list_items
9
+ return nil if my_list_items.nil?
10
+ my_list_items.collect {|item| item.name}
11
+ end
13
12
 
14
- def list_items
15
- begin
16
- expand_combo
17
- bewildr_list_items = get(:type => :list_item, :scope => :children, :how_many => :all)
18
- bewildr_list_items.nil? ? nil : bewildr_list_items
19
- ensure
20
- collapse_combo
21
- end
22
- end
13
+ #Returns an array containing the combobox items
14
+ def list_items
15
+ begin
16
+ expand_combo
17
+ bewildr_list_items = get(:type => :list_item, :scope => :children, :how_many => :all)
18
+ bewildr_list_items.nil? ? nil : bewildr_list_items
19
+ ensure
20
+ collapse_combo
21
+ end
22
+ end
23
23
 
24
- def count
25
- my_items = items
26
- my_items.nil? ? 0 : my_items.size
27
- end
24
+ #Returns the number of items in the combobox
25
+ def count
26
+ my_items = items
27
+ my_items.nil? ? 0 : my_items.size
28
+ end
28
29
 
29
- def select(input)
30
- case input
31
- when String then select_by_name(input)
32
- when Integer then select_by_index(input)
33
- else raise ArgumentError, "Select by name or by index"
34
- end
35
- end
30
+ #Selects a combobox item. Takes a string (and selects the first item whose name matches) or an integer and selects the respective element
31
+ def select(input)
32
+ case input
33
+ when String then select_by_name(input)
34
+ when Integer then select_by_index(input)
35
+ else raise ArgumentError, "Select by name or by index"
36
+ end
37
+ end
36
38
 
37
- def select_by_name(input)
38
- begin
39
- expand_combo
40
- my_item = list_items.find {|item| item.name == input}
41
- raise Bewildr::NoSuchItemInComboBox if my_item.nil?
42
- my_item.select
43
- ensure
44
- collapse_combo
45
- end
46
- end
39
+ #Selects the first item whose name matches the input
40
+ def select_by_name(input)
41
+ begin
42
+ expand_combo
43
+ my_item = list_items.find {|item| item.name == input}
44
+ raise Bewildr::NoSuchItemInComboBox if my_item.nil?
45
+ my_item.select
46
+ ensure
47
+ collapse_combo
48
+ end
49
+ end
47
50
 
48
- def select_by_index(input)
49
- raise "Index must be 0 or greater" if input < 0
50
- begin
51
- expand_combo
52
- list_items[input].select
53
- ensure
54
- collapse_combo
55
- end
56
- end
51
+ #Selects the item at the supplied position
52
+ def select_by_index(input)
53
+ raise "Index must be 0 or greater" if input < 0
54
+ begin
55
+ expand_combo
56
+ list_items[input].select
57
+ ensure
58
+ collapse_combo
59
+ end
60
+ end
57
61
 
58
- def selected
59
- #TODO: find a way to not need to expand and collapse before getting the selected item
60
- expand_combo
61
- collapse_combo
62
- #get_selection.first
63
- get_selection.first.name
64
- end
62
+ #Returns the selected combobox item
63
+ def selected
64
+ #TODO: find a way to not need to expand and collapse before getting the selected item
65
+ expand_combo
66
+ collapse_combo
67
+ #get_selection.first
68
+ get_selection.first.name
69
+ end
65
70
 
66
- def expand_combo
67
- expand
68
- Timeout.timeout(30) do
69
- sleep 0.2 until expand_state == :expanded
70
- end
71
- end
71
+ #Expands the combobox
72
+ def expand_combo
73
+ expand
74
+ Timeout.timeout(30) do
75
+ sleep 0.2 until expand_state == :expanded
76
+ end
77
+ end
72
78
 
73
- def collapse_combo
74
- collapse
75
- Timeout.timeout(30) do
76
- sleep 0.2 until expand_state == :collapsed
77
- end
78
- end
79
+ #Collapses the combobox
80
+ def collapse_combo
81
+ collapse
82
+ Timeout.timeout(30) do
83
+ sleep 0.2 until expand_state == :collapsed
79
84
  end
80
85
  end
81
86
  end
@@ -3,12 +3,9 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module DataGridAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def cell(row, column)
9
- get_item(row, column)
10
- end
11
- end
6
+ #Returns the cell at the supplied row and column
7
+ def cell(row, column)
8
+ get_item(row, column)
12
9
  end
13
10
  end
14
11
  end
@@ -3,31 +3,30 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module DocumentAdditions
6
- def self.extended(base)
7
- base.instance_eval do
6
+ #Returns the document text
7
+ def text
8
+ get_text
9
+ end
8
10
 
9
- def clean_string(input)
10
- #add special chars as necessary. Ref: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx
11
- replacements = {
12
- /\n/ => "{ENTER}"
13
- }
14
- cleaned_string = input
15
- replacements.keys.each {|key| cleaned_string.gsub!(key, replacements[key])}
16
- cleaned_string
17
- end
11
+ #Sets the document text to the supplied input
12
+ def text=(input)
13
+ cleaned_string = clean_string(input)
14
+ focus
15
+ select_all
16
+ System::Windows::Forms::SendKeys.send_wait("{DEL}")
17
+ System::Windows::Forms::SendKeys.send_wait(cleaned_string)
18
+ end
18
19
 
19
- def text
20
- get_text
21
- end
20
+ private
22
21
 
23
- def text=(input)
24
- cleaned_string = clean_string(input)
25
- focus
26
- select_all
27
- System::Windows::Forms::SendKeys.send_wait("{DEL}")
28
- System::Windows::Forms::SendKeys.send_wait(cleaned_string)
29
- end
30
- end
22
+ def clean_string(input)
23
+ #add special chars as necessary. Ref: http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send.aspx
24
+ replacements = {
25
+ /\n/ => "{ENTER}"
26
+ }
27
+ cleaned_string = input
28
+ replacements.keys.each {|key| cleaned_string.gsub!(key, replacements[key])}
29
+ cleaned_string
31
30
  end
32
31
  end
33
32
  end
@@ -3,55 +3,59 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module ListAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def select(input)
9
- selectable_elements = get(:type => :list_item, :scope => :children, :how_many => :all)
10
- selectable_elements.find {|selectable_element| selectable_element.name == input}.select
11
- end
12
-
13
- def items
14
- my_list_items = list_items
15
- return nil if my_list_items.nil?
16
- my_list_items.collect {|item| item.name}
17
- end
18
-
19
- def list_items
20
- prepare_element
21
- bewildr_list_items = get(:type => :list_item, :scope => :children, :how_many => :all)
22
- bewildr_list_items.nil? ? nil : bewildr_list_items
23
- end
24
-
25
- def count
26
- my_items = items
27
- my_items.nil? ? 0 : my_items.size
28
- end
29
-
30
- def select(input)
31
- case input
32
- when String then select_by_name(input)
33
- when Integer then select_by_index(input)
34
- else raise ArgumentError, "Select by name or by index"
35
- end
36
- end
37
-
38
- def select_by_name(input)
39
- my_item = list_items.find {|item| item.name == input}
40
- raise Bewildr::NoSuchItemInListBox if my_item.nil?
41
- my_item.select
42
- end
43
-
44
- def select_by_index(input)
45
- raise "Index must be 0 or greater" if input < 0
46
- list_items[input].select
47
- end
48
-
49
- def selected
50
- return nil if get_selection.empty?
51
- get_selection.first.name
52
- end
6
+ #Select the list item whose name matches the supplied input
7
+ def select(input)
8
+ selectable_elements = get(:type => :list_item, :scope => :children, :how_many => :all)
9
+ selectable_elements.find {|selectable_element| selectable_element.name == input}.select
10
+ end
11
+
12
+ #Returns a string array containing the list item names
13
+ def items
14
+ my_list_items = list_items
15
+ return nil if my_list_items.nil?
16
+ my_list_items.collect {|item| item.name}
17
+ end
18
+
19
+ #Returns an array containing the list items
20
+ def list_items
21
+ prepare_element
22
+ bewildr_list_items = get(:type => :list_item, :scope => :children, :how_many => :all)
23
+ bewildr_list_items.nil? ? nil : bewildr_list_items
24
+ end
25
+
26
+ #Returns the number of items in the list
27
+ def count
28
+ my_items = items
29
+ my_items.nil? ? 0 : my_items.size
30
+ end
31
+
32
+ #Selects a list item. Takes a string (and selects the first item whose name matches) or an integer and selects the respective element
33
+ def select(input)
34
+ case input
35
+ when String then select_by_name(input)
36
+ when Integer then select_by_index(input)
37
+ else raise ArgumentError, "Select by name or by index"
53
38
  end
54
39
  end
40
+
41
+ #Selects the first item whose name matches the input
42
+ def select_by_name(input)
43
+ my_item = list_items.find {|item| item.name == input}
44
+ raise Bewildr::NoSuchItemInListBox if my_item.nil?
45
+ my_item.select
46
+ end
47
+
48
+ #Selects the item at the supplied position
49
+ def select_by_index(input)
50
+ raise "Index must be 0 or greater" if input < 0
51
+ list_items[input].select
52
+ end
53
+
54
+ #Returns the selected list item
55
+ def selected
56
+ return nil if get_selection.empty?
57
+ get_selection.first.name
58
+ end
55
59
  end
56
60
  end
57
61
  end
@@ -3,56 +3,61 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module MenuAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def root_menu_items
9
- get(:type => :menu_item, :scope => :children, :how_many => :all)
10
- end
6
+ #Returns an array containing the menu's root items
7
+ def root_menu_items
8
+ get(:type => :menu_item, :scope => :children, :how_many => :all)
9
+ end
11
10
 
12
- def root_menu_item_names
13
- root_menu_items.collect {|menu_item| menu_item.name}
14
- end
15
-
16
- def select_menu(path)
17
- menu_item(path).click
18
- end
11
+ #Returns a string array containing the root items' names
12
+ def root_menu_item_names
13
+ root_menu_items.collect {|menu_item| menu_item.name}
14
+ end
19
15
 
20
- def select_node(path)
21
- node(path).select
22
- end
16
+ #Clicks the menu described by the input, eg:
17
+ # select_menu(["File", "Close"])
18
+ def select_menu(path)
19
+ menu_item(path).click
20
+ end
23
21
 
24
- def menu_item(path)
25
- current_menu_items = root_menu_items
26
- matching_menu_item = nil
27
- path.each_with_index do |target_menu_item, index|
28
- case current_menu_items
29
- when Array
30
- matching_menu_item = current_menu_items.find {|node| node.name == target_menu_item} #TODO: make this work with regexes as well as strings...
31
- raise Bewildr::ElementDoesntExist if matching_menu_item.nil?
32
- when Bewildr::Element
33
- if current_menu_items.name == target_menu_item #TODO: make this work with regexes as well as strings...
34
- matching_menu_item = current_menu_items
35
- else
36
- raise Bewildr::ElementDoesntExist
37
- end
38
- end
39
- raise Bewildr::ElementDoesntExist if matching_menu_item.nil?
40
- if path.size != index + 1
41
- matching_menu_item.expand
42
- current_menu_items = matching_menu_item.sub_menus
43
- end
44
- end
45
- return matching_menu_item
46
- end
22
+ #Selects the menu described by the input, eg:
23
+ # select_node(["File", "Close"])
24
+ def select_node(path)
25
+ node(path).select
26
+ end
47
27
 
48
- def contains_menu_item?(path)
49
- begin
50
- menu_item(path)
51
- return true
52
- rescue ElementDoesntExist => e
53
- return false
28
+ #Returns the menu item described by the input, eg:
29
+ # menu_item(["File", "Close"])
30
+ def menu_item(path)
31
+ current_menu_items = root_menu_items
32
+ matching_menu_item = nil
33
+ path.each_with_index do |target_menu_item, index|
34
+ case current_menu_items
35
+ when Array
36
+ matching_menu_item = current_menu_items.find {|node| node.name == target_menu_item} #TODO: make this work with regexes as well as strings...
37
+ raise Bewildr::ElementDoesntExist if matching_menu_item.nil?
38
+ when Bewildr::Element
39
+ if current_menu_items.name == target_menu_item #TODO: make this work with regexes as well as strings...
40
+ matching_menu_item = current_menu_items
41
+ else
42
+ raise Bewildr::ElementDoesntExist
54
43
  end
55
44
  end
45
+ raise Bewildr::ElementDoesntExist if matching_menu_item.nil?
46
+ if path.size != index + 1
47
+ matching_menu_item.expand
48
+ current_menu_items = matching_menu_item.sub_menus
49
+ end
50
+ end
51
+ return matching_menu_item
52
+ end
53
+
54
+ #Returns true if the menu contains the item described by the input, false if it doesn't
55
+ def contains_menu_item?(path)
56
+ begin
57
+ menu_item(path)
58
+ return true
59
+ rescue ElementDoesntExist => e
60
+ return false
56
61
  end
57
62
  end
58
63
  end
@@ -3,17 +3,13 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module MenuItemAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def sub_menus
9
- get(:type => :menu_item, :scope => :children, :how_many => :all)
10
- end
6
+ def sub_menus
7
+ get(:type => :menu_item, :scope => :children, :how_many => :all)
8
+ end
11
9
 
12
- #menu items like 'invoke', not a proper mouse click
13
- def click
14
- @automation_element.get_current_pattern(System::Windows::Automation::InvokePattern.pattern).invoke
15
- end
16
- end
10
+ #menu items like 'invoke', not a proper mouse click
11
+ def click
12
+ @automation_element.get_current_pattern(System::Windows::Automation::InvokePattern.pattern).invoke
17
13
  end
18
14
  end
19
15
  end
@@ -3,29 +3,25 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module ScrollAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
-
9
- #required because when a list is displayed, UI Automation only knows
10
- #about the visible items. This method stores where the scroll value is,
11
- #then moves the scroller to the top of the scroll bar and proceeds to
12
- #page-down until the bottom of the scroll bar is reached. At this point,
13
- #UI Automation knows about all the items in the list and we can put
14
- #the scroll back where it was before we started this nonsense.
15
- def load_all_items_hack
16
- return unless scrollable?
6
+ #required because when a list is displayed, UI Automation only knows
7
+ #about the visible items. This method stores where the scroll value is,
8
+ #then moves the scroller to the top of the scroll bar and proceeds to
9
+ #page-down until the bottom of the scroll bar is reached. At this point,
10
+ #UI Automation knows about all the items in the list and we can put
11
+ #the scroll back where it was before we started this nonsense.
12
+ def load_all_items_hack
13
+ return unless scrollable?
17
14
 
18
- initial_scroll_value = vertical_scroll_percent
15
+ initial_scroll_value = vertical_scroll_percent
19
16
 
20
- scroll_to 0.0
21
- page_down_to_bottom_of_scroll_bar
22
- scroll_to initial_scroll_value
23
- end
17
+ scroll_to 0.0
18
+ page_down_to_bottom_of_scroll_bar
19
+ scroll_to initial_scroll_value
20
+ end
24
21
 
25
- def page_down_to_bottom_of_scroll_bar
26
- scroll_down_one_page while vertical_scroll_percent < 99.99
27
- end
28
- end
22
+ #Scrolls down to the bottom, page by page
23
+ def page_down_to_bottom_of_scroll_bar
24
+ scroll_down_one_page while vertical_scroll_percent < 99.99
29
25
  end
30
26
  end
31
27
  end
@@ -3,26 +3,26 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module TabAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def select(input)
9
- raise Bewildr::NoSuchTab unless tab_names.include?(input)
10
- selectable_elements = tabs
11
- selectable_elements.find {|selectable_element| selectable_element.name == input}.select
12
- end
6
+ #Selects the tab whose name matches the input
7
+ def select(input)
8
+ raise Bewildr::NoSuchTab unless tab_names.include?(input)
9
+ selectable_elements = tabs
10
+ selectable_elements.find {|selectable_element| selectable_element.name == input}.select
11
+ end
13
12
 
14
- def tabs
15
- get(:type => :tab_item, :scope => :children, :how_many => :all)
16
- end
13
+ #Returns an array containing the tab items belonging to the tab control
14
+ def tabs
15
+ get(:type => :tab_item, :scope => :children, :how_many => :all)
16
+ end
17
17
 
18
- def tab_names
19
- tabs.collect {|tab| tab.name}
20
- end
18
+ #Returns a string array containing the names of all the tabs in the tab control
19
+ def tab_names
20
+ tabs.collect {|tab| tab.name}
21
+ end
21
22
 
22
- def selected
23
- tabs.find {|tab| tab.selected?}
24
- end
25
- end
23
+ #Returns the selected tab
24
+ def selected
25
+ tabs.find {|tab| tab.selected?}
26
26
  end
27
27
  end
28
28
  end
@@ -3,13 +3,10 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module TextAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def text
9
- existence_check
10
- name
11
- end
12
- end
6
+ #Returns the element's text
7
+ def text
8
+ existence_check
9
+ name
13
10
  end
14
11
  end
15
12
  end
@@ -3,54 +3,58 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module TreeAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def root_nodes
9
- prepare_element
10
- get(:type => :tree_item, :scope => :children)
11
- end
6
+ #Returns an array containing the tree's root nodes
7
+ def root_nodes
8
+ prepare_element
9
+ get(:type => :tree_item, :scope => :children)
10
+ end
12
11
 
13
- def root_node
14
- root_nodes.first
15
- end
12
+ #Returns the root node
13
+ def root_node
14
+ root_nodes.first
15
+ end
16
16
 
17
- def select_node(path)
18
- node(path).select
19
- end
17
+ #Selects the tree node described by the input, eg:
18
+ # select_node(["parent node", "child node"])
19
+ def select_node(path)
20
+ node(path).select
21
+ end
20
22
 
21
- def node(path)
22
- current_nodes = root_nodes
23
- matching_node = nil
24
- path.each_with_index do |target_node, index|
25
- case current_nodes
26
- when Array
27
- matching_node = current_nodes.find {|node| node.name == target_node} #TODO: make this work with regexes as well as strings...
28
- raise Bewildr::ElementDoesntExist if matching_node.nil?
29
- when Bewildr::Element
30
- if current_nodes.name == target_node #TODO: make this work with regexes as well as strings...
31
- matching_node = current_nodes
32
- else
33
- raise Bewildr::ElementDoesntExist
34
- end
35
- end
36
- raise Bewildr::ElementDoesntExist if matching_node.nil?
37
- if path.size != index + 1
38
- matching_node.expand
39
- current_nodes = matching_node.child_nodes
40
- end
23
+ #Returns the tree node described by the input, eg:
24
+ # node(["parent node", "child node"])
25
+ def node(path)
26
+ current_nodes = root_nodes
27
+ matching_node = nil
28
+ path.each_with_index do |target_node, index|
29
+ case current_nodes
30
+ when Array
31
+ matching_node = current_nodes.find {|node| node.name == target_node} #TODO: make this work with regexes as well as strings...
32
+ raise Bewildr::ElementDoesntExist if matching_node.nil?
33
+ when Bewildr::Element
34
+ if current_nodes.name == target_node #TODO: make this work with regexes as well as strings...
35
+ matching_node = current_nodes
36
+ else
37
+ raise Bewildr::ElementDoesntExist
41
38
  end
42
- return matching_node
43
39
  end
44
-
45
- def contains_node?(path)
46
- begin
47
- node(path)
48
- return true
49
- rescue ElementDoesntExist => e
50
- return false
51
- end
40
+ raise Bewildr::ElementDoesntExist if matching_node.nil?
41
+ if path.size != index + 1
42
+ matching_node.expand
43
+ load_all_items_hack
44
+ current_nodes = matching_node.child_nodes
52
45
  end
53
46
  end
47
+ return matching_node
48
+ end
49
+
50
+ #Returns true if the tree contains the item described by the input, false if it doesn't
51
+ def contains_node?(path)
52
+ begin
53
+ node(path)
54
+ return true
55
+ rescue ElementDoesntExist => e
56
+ return false
57
+ end
54
58
  end
55
59
  end
56
60
  end
@@ -3,24 +3,21 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module TreeItemAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def child_nodes
9
- get(:type => :tree_item, :scope => :children)
10
- end
6
+ #Returns the tree item's child nodes
7
+ def child_nodes
8
+ get(:type => :tree_item, :scope => :children)
9
+ end
11
10
 
12
- #horrible, but necessary - clickable point for tree items doesn't work like you think it would...
13
- #I've added 7 to y and 22 to x... that's working for now... this is hardly the ideal solution...
14
- #To see what's going on with the following code, take a look at a tree node under uispy - you'll
15
- #understand - a picture paints a thousand words and all that.
16
- def clickable_point
17
- existence_check
18
- ae_top_left_point = @automation_element.current.bounding_rectangle.top_left
19
- ae_top_left_point.x += 22
20
- ae_top_left_point.y += 7
21
- ae_top_left_point
22
- end
23
- end
11
+ #horrible, but necessary - clickable point for tree items doesn't work like you think it would...
12
+ #I've added 7 to y and 22 to x... that's working for now... this is hardly the ideal solution...
13
+ #To see what's going on with the following code, take a look at a tree node under uispy - you'll
14
+ #understand - a picture paints a thousand words and all that.
15
+ def clickable_point
16
+ existence_check
17
+ ae_top_left_point = @automation_element.current.bounding_rectangle.top_left
18
+ ae_top_left_point.x += 22
19
+ ae_top_left_point.y += 7
20
+ ae_top_left_point
24
21
  end
25
22
  end
26
23
  end
@@ -3,17 +3,15 @@
3
3
  module Bewildr
4
4
  module ControlTypeAdditions
5
5
  module WindowAdditions
6
- def self.extended(base)
7
- base.instance_eval do
8
- def open?
9
- exists?
10
- end
6
+ #Returns true if the window is open, false if it's not
7
+ def open?
8
+ exists?
9
+ end
11
10
 
12
- def wait_for_close
13
- Timeout::timeout(30) do
14
- sleep 0.2 while open?
15
- end
16
- end
11
+ #Waits up to 30 seconds for the window to close
12
+ def wait_for_close
13
+ Timeout::timeout(30) do
14
+ sleep 0.2 while open?
17
15
  end
18
16
  end
19
17
  end
@@ -177,6 +177,16 @@ module Bewildr
177
177
  end
178
178
  end
179
179
 
180
+ #Returns the height of the element in pixels
181
+ def height
182
+ @automation_element.current.bounding_rectangle.height.to_i
183
+ end
184
+
185
+ #Returns the width of the element in pixels
186
+ def width
187
+ @automation_element.current.bounding_rectangle.width.to_i
188
+ end
189
+
180
190
  private
181
191
 
182
192
  #Raises an exception if this element no longer exists
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Bewildr
4
4
  class Windows
5
+ #Returns an array of windows belonging to a process id
5
6
  def self.windows_by_process_id(process_id)
6
7
  #find top level windows
7
8
  window_scope = System::Windows::Automation::TreeScope.Children
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bewildr
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 9
10
- version: 0.1.9
9
+ - 10
10
+ version: 0.1.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nat Ritmeyer
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-20 00:00:00 +00:00
18
+ date: 2011-02-08 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency