rautomation 2.0.1-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +41 -0
- data/.rspec +2 -0
- data/.yardopts +8 -0
- data/CHANGES.md +276 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +142 -0
- data/Rakefile +73 -0
- data/ext/AutoItX/AutoItX.chm +0 -0
- data/ext/AutoItX/AutoItX3.dll +0 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.cpp +30 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj +179 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj.filters +42 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/IAccessibleDLL.vcxproj.user +3 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/ReadMe.txt +48 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/dllmain.cpp +19 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/stdafx.cpp +8 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/stdafx.h +22 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/table_support.cpp +282 -0
- data/ext/IAccessibleDLL/IAccessibleDLL/targetver.h +8 -0
- data/ext/IAccessibleDLL/IAccessibleDLL.sln +31 -0
- data/ext/IAccessibleDLL/IAccessibleDLL.suo +0 -0
- data/ext/IAccessibleDLL/Release/IAccessibleDLL.dll +0 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/Clicker.cs +63 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/SelectList.cs +116 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/Spinner.cs +46 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/TabControl.cs +54 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/TableControl.cs +132 -0
- data/ext/UiaDll/RAutomation.UIA/Controls/TextControl.cs +50 -0
- data/ext/UiaDll/RAutomation.UIA/Expander.cs +59 -0
- data/ext/UiaDll/RAutomation.UIA/Extensions/Element.cs +166 -0
- data/ext/UiaDll/RAutomation.UIA/Extensions/Enumerable.cs +76 -0
- data/ext/UiaDll/RAutomation.UIA/Extensions/Property.cs +27 -0
- data/ext/UiaDll/RAutomation.UIA/Properties/AssemblyInfo.cs +36 -0
- data/ext/UiaDll/RAutomation.UIA/Properties/AutomationProperties.cs +18 -0
- data/ext/UiaDll/RAutomation.UIA/RAutomation.UIA.csproj +77 -0
- data/ext/UiaDll/Release/RAutomation.UIA.dll +0 -0
- data/ext/UiaDll/Release/UiaDll.dll +0 -0
- data/ext/UiaDll/UiaDll/ArrayHelper.cpp +14 -0
- data/ext/UiaDll/UiaDll/ArrayHelper.h +7 -0
- data/ext/UiaDll/UiaDll/AssemblyInfo.cpp +40 -0
- data/ext/UiaDll/UiaDll/ControlMethods.cpp +16 -0
- data/ext/UiaDll/UiaDll/DynamicAssemblyResolver.cpp +24 -0
- data/ext/UiaDll/UiaDll/DynamicAssemblyResolver.h +16 -0
- data/ext/UiaDll/UiaDll/Locator.cpp +93 -0
- data/ext/UiaDll/UiaDll/Locator.h +55 -0
- data/ext/UiaDll/UiaDll/MenuItemSelector.cpp +75 -0
- data/ext/UiaDll/UiaDll/MenuItemSelector.h +24 -0
- data/ext/UiaDll/UiaDll/MenuMethods.cpp +62 -0
- data/ext/UiaDll/UiaDll/ReadMe.txt +38 -0
- data/ext/UiaDll/UiaDll/SelectListMethods.cpp +84 -0
- data/ext/UiaDll/UiaDll/SpinnerMethods.cpp +61 -0
- data/ext/UiaDll/UiaDll/StringHelper.cpp +57 -0
- data/ext/UiaDll/UiaDll/StringHelper.h +15 -0
- data/ext/UiaDll/UiaDll/StringMethods.cpp +8 -0
- data/ext/UiaDll/UiaDll/TabControlMethods.cpp +40 -0
- data/ext/UiaDll/UiaDll/TableMethods.cpp +108 -0
- data/ext/UiaDll/UiaDll/TextMethods.cpp +25 -0
- data/ext/UiaDll/UiaDll/ToggleStateHelper.h +10 -0
- data/ext/UiaDll/UiaDll/UiaDll.cpp +216 -0
- data/ext/UiaDll/UiaDll/UiaDll.h +13 -0
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj +167 -0
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj.filters +110 -0
- data/ext/UiaDll/UiaDll/app.ico +0 -0
- data/ext/UiaDll/UiaDll/app.rc +0 -0
- data/ext/UiaDll/UiaDll/dllmain.cpp +1 -0
- data/ext/UiaDll/UiaDll/resource.h +3 -0
- data/ext/UiaDll/UiaDll/stdafx.cpp +5 -0
- data/ext/UiaDll/UiaDll/stdafx.h +41 -0
- data/ext/UiaDll/UiaDll/targetver.h +8 -0
- data/ext/UiaDll/UiaDll.sln +57 -0
- data/ext/WindowsForms/.nuget/NuGet.Config +6 -0
- data/ext/WindowsForms/.nuget/NuGet.exe +0 -0
- data/ext/WindowsForms/.nuget/NuGet.targets +136 -0
- data/ext/WindowsForms/Release/FizzWare.NBuilder.dll +0 -0
- data/ext/WindowsForms/Release/UIA.Extensions.dll +0 -0
- data/ext/WindowsForms/Release/WindowsForms.exe +0 -0
- data/ext/WindowsForms/WindowsForms/AboutBox.Designer.cs +168 -0
- data/ext/WindowsForms/WindowsForms/AboutBox.cs +103 -0
- data/ext/WindowsForms/WindowsForms/AboutBox.resx +123 -0
- data/ext/WindowsForms/WindowsForms/DataEntryForm.Designer.cs +218 -0
- data/ext/WindowsForms/WindowsForms/DataEntryForm.cs +52 -0
- data/ext/WindowsForms/WindowsForms/DataEntryForm.resx +120 -0
- data/ext/WindowsForms/WindowsForms/DataGridView.Designer.cs +77 -0
- data/ext/WindowsForms/WindowsForms/DataGridView.cs +43 -0
- data/ext/WindowsForms/WindowsForms/DataGridView.resx +120 -0
- data/ext/WindowsForms/WindowsForms/FizzWare.NBuilder.dll +0 -0
- data/ext/WindowsForms/WindowsForms/MainFormWindow.Designer.cs +527 -0
- data/ext/WindowsForms/WindowsForms/MainFormWindow.cs +109 -0
- data/ext/WindowsForms/WindowsForms/MainFormWindow.resx +126 -0
- data/ext/WindowsForms/WindowsForms/PersonForm.Designer.cs +119 -0
- data/ext/WindowsForms/WindowsForms/PersonForm.cs +34 -0
- data/ext/WindowsForms/WindowsForms/PersonForm.resx +120 -0
- data/ext/WindowsForms/WindowsForms/Program.cs +21 -0
- data/ext/WindowsForms/WindowsForms/Properties/AssemblyInfo.cs +36 -0
- data/ext/WindowsForms/WindowsForms/Properties/Resources.Designer.cs +71 -0
- data/ext/WindowsForms/WindowsForms/Properties/Resources.resx +117 -0
- data/ext/WindowsForms/WindowsForms/Properties/Settings.Designer.cs +30 -0
- data/ext/WindowsForms/WindowsForms/Properties/Settings.settings +7 -0
- data/ext/WindowsForms/WindowsForms/SimpleElementsForm.Designer.cs +93 -0
- data/ext/WindowsForms/WindowsForms/SimpleElementsForm.cs +19 -0
- data/ext/WindowsForms/WindowsForms/SimpleElementsForm.resx +120 -0
- data/ext/WindowsForms/WindowsForms/UIA.Extensions.dll +0 -0
- data/ext/WindowsForms/WindowsForms/ValueMonthCalendar.cs +28 -0
- data/ext/WindowsForms/WindowsForms/WindowsForms.csproj +166 -0
- data/ext/WindowsForms/WindowsForms/packages.config +4 -0
- data/ext/WindowsForms/WindowsForms.sln +46 -0
- data/lib/rautomation/adapter/autoit/button.rb +59 -0
- data/lib/rautomation/adapter/autoit/locators.rb +22 -0
- data/lib/rautomation/adapter/autoit/mouse.rb +38 -0
- data/lib/rautomation/adapter/autoit/text_field.rb +70 -0
- data/lib/rautomation/adapter/autoit/window.rb +197 -0
- data/lib/rautomation/adapter/autoit.rb +8 -0
- data/lib/rautomation/adapter/helper.rb +64 -0
- data/lib/rautomation/adapter/ms_uia/button.rb +21 -0
- data/lib/rautomation/adapter/ms_uia/button_helper.rb +19 -0
- data/lib/rautomation/adapter/ms_uia/checkbox.rb +23 -0
- data/lib/rautomation/adapter/ms_uia/constants.rb +111 -0
- data/lib/rautomation/adapter/ms_uia/control.rb +134 -0
- data/lib/rautomation/adapter/ms_uia/functions.rb +279 -0
- data/lib/rautomation/adapter/ms_uia/keys.rb +121 -0
- data/lib/rautomation/adapter/ms_uia/keystroke_converter.rb +122 -0
- data/lib/rautomation/adapter/ms_uia/label.rb +18 -0
- data/lib/rautomation/adapter/ms_uia/list_box.rb +46 -0
- data/lib/rautomation/adapter/ms_uia/list_item.rb +22 -0
- data/lib/rautomation/adapter/ms_uia/locators.rb +23 -0
- data/lib/rautomation/adapter/ms_uia/menu.rb +36 -0
- data/lib/rautomation/adapter/ms_uia/radio.rb +23 -0
- data/lib/rautomation/adapter/ms_uia/select_list.rb +85 -0
- data/lib/rautomation/adapter/ms_uia/spinner.rb +31 -0
- data/lib/rautomation/adapter/ms_uia/tab_control.rb +46 -0
- data/lib/rautomation/adapter/ms_uia/table.rb +140 -0
- data/lib/rautomation/adapter/ms_uia/text_field.rb +39 -0
- data/lib/rautomation/adapter/ms_uia/uia_dll.rb +428 -0
- data/lib/rautomation/adapter/ms_uia/value_control.rb +21 -0
- data/lib/rautomation/adapter/ms_uia/window.rb +289 -0
- data/lib/rautomation/adapter/ms_uia.rb +27 -0
- data/lib/rautomation/adapter/win_32/button.rb +14 -0
- data/lib/rautomation/adapter/win_32/button_helper.rb +24 -0
- data/lib/rautomation/adapter/win_32/checkbox.rb +14 -0
- data/lib/rautomation/adapter/win_32/constants.rb +73 -0
- data/lib/rautomation/adapter/win_32/control.rb +86 -0
- data/lib/rautomation/adapter/win_32/functions.rb +336 -0
- data/lib/rautomation/adapter/win_32/keys.rb +146 -0
- data/lib/rautomation/adapter/win_32/label.rb +10 -0
- data/lib/rautomation/adapter/win_32/list_box.rb +40 -0
- data/lib/rautomation/adapter/win_32/locators.rb +22 -0
- data/lib/rautomation/adapter/win_32/mouse.rb +59 -0
- data/lib/rautomation/adapter/win_32/password_field.rb +15 -0
- data/lib/rautomation/adapter/win_32/radio.rb +11 -0
- data/lib/rautomation/adapter/win_32/select_list.rb +97 -0
- data/lib/rautomation/adapter/win_32/table.rb +25 -0
- data/lib/rautomation/adapter/win_32/text_field.rb +52 -0
- data/lib/rautomation/adapter/win_32/window.rb +277 -0
- data/lib/rautomation/adapter/win_32.rb +23 -0
- data/lib/rautomation/button.rb +55 -0
- data/lib/rautomation/element_collections.rb +55 -0
- data/lib/rautomation/platform.rb +15 -0
- data/lib/rautomation/text_field.rb +60 -0
- data/lib/rautomation/version.rb +3 -0
- data/lib/rautomation/wait_helper.rb +23 -0
- data/lib/rautomation/window.rb +248 -0
- data/lib/rautomation.rb +8 -0
- data/rautomation.gemspec +52 -0
- data/spec/adapter/autoit/mouse_spec.rb +53 -0
- data/spec/adapter/autoit/window_spec.rb +17 -0
- data/spec/adapter/ms_uia/button_spec.rb +39 -0
- data/spec/adapter/ms_uia/checkbox_spec.rb +55 -0
- data/spec/adapter/ms_uia/control_spec.rb +88 -0
- data/spec/adapter/ms_uia/functions_spec.rb +39 -0
- data/spec/adapter/ms_uia/keystroke_converter_spec.rb +48 -0
- data/spec/adapter/ms_uia/label_spec.rb +18 -0
- data/spec/adapter/ms_uia/list_item_spec.rb +14 -0
- data/spec/adapter/ms_uia/listbox_spec.rb +73 -0
- data/spec/adapter/ms_uia/radio_spec.rb +39 -0
- data/spec/adapter/ms_uia/select_list_spec.rb +118 -0
- data/spec/adapter/ms_uia/spinner_spec.rb +44 -0
- data/spec/adapter/ms_uia/tab_control_spec.rb +53 -0
- data/spec/adapter/ms_uia/table_spec.rb +197 -0
- data/spec/adapter/ms_uia/text_field_spec.rb +43 -0
- data/spec/adapter/ms_uia/value_control_spec.rb +11 -0
- data/spec/adapter/ms_uia/window_spec.rb +81 -0
- data/spec/adapter/win_32/button_spec.rb +31 -0
- data/spec/adapter/win_32/checkbox_spec.rb +46 -0
- data/spec/adapter/win_32/label_spec.rb +13 -0
- data/spec/adapter/win_32/listbox_spec.rb +41 -0
- data/spec/adapter/win_32/mouse_spec.rb +49 -0
- data/spec/adapter/win_32/radio_spec.rb +33 -0
- data/spec/adapter/win_32/select_list_spec.rb +65 -0
- data/spec/adapter/win_32/table_spec.rb +27 -0
- data/spec/adapter/win_32/text_field_spec.rb +24 -0
- data/spec/adapter/win_32/window_spec.rb +61 -0
- data/spec/button_spec.rb +67 -0
- data/spec/buttons_spec.rb +21 -0
- data/spec/spec_helper.rb +128 -0
- data/spec/text_field_spec.rb +64 -0
- data/spec/text_fields_spec.rb +22 -0
- data/spec/window_spec.rb +150 -0
- data/spec/windows_spec.rb +76 -0
- metadata +369 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Runtime.InteropServices;
|
3
|
+
using System.Threading;
|
4
|
+
using System.Windows;
|
5
|
+
using System.Windows.Automation;
|
6
|
+
using System.Windows.Forms;
|
7
|
+
using RAutomation.UIA.Extensions;
|
8
|
+
|
9
|
+
namespace RAutomation.UIA.Controls
|
10
|
+
{
|
11
|
+
public class Clicker
|
12
|
+
{
|
13
|
+
[DllImport("user32.dll")]
|
14
|
+
static extern void mouse_event(uint flags, uint x, uint y, uint data, int extraInfo);
|
15
|
+
|
16
|
+
[Flags]
|
17
|
+
public enum MouseEvent
|
18
|
+
{
|
19
|
+
Leftdown = 0x00000002,
|
20
|
+
Leftup = 0x00000004,
|
21
|
+
}
|
22
|
+
|
23
|
+
private const uint MOUSEEVENTLF_LEFTDOWN = 0x2;
|
24
|
+
private const uint MOUSEEVENTLF_LEFTUP = 0x4;
|
25
|
+
|
26
|
+
public static bool Click(AutomationElement element)
|
27
|
+
{
|
28
|
+
try
|
29
|
+
{
|
30
|
+
if (AutomationElement.IsInvokePatternAvailableProperty.In(element))
|
31
|
+
{
|
32
|
+
element.As<InvokePattern>(InvokePattern.Pattern).Invoke();
|
33
|
+
}
|
34
|
+
else if (AutomationElement.IsTogglePatternAvailableProperty.In(element))
|
35
|
+
{
|
36
|
+
element.AsTogglePattern().Toggle();
|
37
|
+
}
|
38
|
+
else if (AutomationElement.IsSelectionItemPatternAvailableProperty.In(element))
|
39
|
+
{
|
40
|
+
element.AsSelectionItem().Select();
|
41
|
+
}
|
42
|
+
|
43
|
+
return true;
|
44
|
+
}
|
45
|
+
catch (Exception e)
|
46
|
+
{
|
47
|
+
Console.WriteLine(e);
|
48
|
+
return false;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
public static void MouseClick(AutomationElement element)
|
53
|
+
{
|
54
|
+
element.ScrollToIfPossible();
|
55
|
+
element.SetFocus();
|
56
|
+
|
57
|
+
var clickablePoint = element.GetClickablePoint();
|
58
|
+
Cursor.Position = new System.Drawing.Point((int)clickablePoint.X, (int)clickablePoint.Y);
|
59
|
+
mouse_event(MOUSEEVENTLF_LEFTDOWN, 0, 0, 0, 0);
|
60
|
+
mouse_event(MOUSEEVENTLF_LEFTUP, 0, 0, 0, 0);
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
@@ -0,0 +1,116 @@
|
|
1
|
+
using System.Collections.Generic;
|
2
|
+
using System.Linq;
|
3
|
+
using System.Threading;
|
4
|
+
using System.Windows;
|
5
|
+
using System.Windows.Automation;
|
6
|
+
using RAutomation.UIA.Extensions;
|
7
|
+
using RAutomation.UIA.Properties;
|
8
|
+
|
9
|
+
namespace RAutomation.UIA.Controls
|
10
|
+
{
|
11
|
+
public class SelectList
|
12
|
+
{
|
13
|
+
private readonly AutomationElement _element;
|
14
|
+
|
15
|
+
public SelectList(AutomationElement element)
|
16
|
+
{
|
17
|
+
_element = element;
|
18
|
+
}
|
19
|
+
|
20
|
+
public string[] Options
|
21
|
+
{
|
22
|
+
get { return SelectionItems.Names().ToArray(); }
|
23
|
+
}
|
24
|
+
|
25
|
+
public int Count
|
26
|
+
{
|
27
|
+
get { return SelectionItems.Count(); }
|
28
|
+
}
|
29
|
+
|
30
|
+
public int SelectedIndex
|
31
|
+
{
|
32
|
+
get { return SelectionItems.IndexOf(IsSelected); }
|
33
|
+
set { Select(SelectionItems.ElementAt(value)); }
|
34
|
+
}
|
35
|
+
|
36
|
+
public string At(int index)
|
37
|
+
{
|
38
|
+
return SelectionItems.ElementAt(index).Current.Name;
|
39
|
+
}
|
40
|
+
|
41
|
+
public string Selection
|
42
|
+
{
|
43
|
+
get
|
44
|
+
{
|
45
|
+
var selection = SelectionItems.FirstOrDefault(IsSelected);
|
46
|
+
return null == selection ? "" : selection.Current.Name;
|
47
|
+
}
|
48
|
+
set
|
49
|
+
{
|
50
|
+
Select(SelectionItems.First(x => x.Current.Name == value));
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
public string[] Selections
|
55
|
+
{
|
56
|
+
get { return SelectionPattern.GetSelection().Select(x => x.Current.Name).ToArray(); }
|
57
|
+
}
|
58
|
+
|
59
|
+
public void Remove(int index)
|
60
|
+
{
|
61
|
+
SelectionItems.ElementAt(index).AsSelectionItem().RemoveFromSelection();
|
62
|
+
}
|
63
|
+
|
64
|
+
public void Remove(string value)
|
65
|
+
{
|
66
|
+
SelectionNamed(value).RemoveFromSelection();
|
67
|
+
}
|
68
|
+
|
69
|
+
private void Select(AutomationElement element)
|
70
|
+
{
|
71
|
+
if (SelectionPattern.CanSelectMultiple)
|
72
|
+
MultipleSelect(element);
|
73
|
+
else
|
74
|
+
SingleSelect(element);
|
75
|
+
}
|
76
|
+
|
77
|
+
private static void MultipleSelect(AutomationElement element)
|
78
|
+
{
|
79
|
+
element.AsSelectionItem().AddToSelection();
|
80
|
+
}
|
81
|
+
|
82
|
+
private static void SingleSelect(AutomationElement element)
|
83
|
+
{
|
84
|
+
var selectionItem = element.AsSelectionItem();
|
85
|
+
|
86
|
+
try
|
87
|
+
{
|
88
|
+
Clicker.MouseClick(element);
|
89
|
+
}
|
90
|
+
catch { }
|
91
|
+
|
92
|
+
if (!selectionItem.Current.IsSelected)
|
93
|
+
selectionItem.Select();
|
94
|
+
}
|
95
|
+
|
96
|
+
private SelectionPattern.SelectionPatternInformation SelectionPattern
|
97
|
+
{
|
98
|
+
get { return _element.As<SelectionPattern>(System.Windows.Automation.SelectionPattern.Pattern).Current; }
|
99
|
+
}
|
100
|
+
|
101
|
+
private SelectionItemPattern SelectionNamed(string value)
|
102
|
+
{
|
103
|
+
return SelectionItems.First(x => x.Current.Name == value).AsSelectionItem();
|
104
|
+
}
|
105
|
+
|
106
|
+
private static bool IsSelected(AutomationElement element)
|
107
|
+
{
|
108
|
+
return element.AsSelectionItem().Current.IsSelected;
|
109
|
+
}
|
110
|
+
|
111
|
+
private IEnumerable<AutomationElement> SelectionItems
|
112
|
+
{
|
113
|
+
get { return _element.Find(AutomationProperties.IsSelectionItem); }
|
114
|
+
}
|
115
|
+
}
|
116
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
using System.Windows.Automation;
|
2
|
+
using RAutomation.UIA.Extensions;
|
3
|
+
|
4
|
+
namespace RAutomation.UIA.Controls
|
5
|
+
{
|
6
|
+
public class Spinner
|
7
|
+
{
|
8
|
+
private readonly AutomationElement _element;
|
9
|
+
|
10
|
+
public Spinner(AutomationElement element)
|
11
|
+
{
|
12
|
+
_element = element;
|
13
|
+
}
|
14
|
+
|
15
|
+
public double Value
|
16
|
+
{
|
17
|
+
get { return RangeValue.Current.Value; }
|
18
|
+
set { RangeValue.SetValue(value); }
|
19
|
+
}
|
20
|
+
|
21
|
+
public double Minimum
|
22
|
+
{
|
23
|
+
get { return RangeValue.Current.Minimum; }
|
24
|
+
}
|
25
|
+
|
26
|
+
public double Maximum
|
27
|
+
{
|
28
|
+
get { return RangeValue.Current.Maximum; }
|
29
|
+
}
|
30
|
+
|
31
|
+
public double Increment()
|
32
|
+
{
|
33
|
+
return Value += RangeValue.Current.SmallChange;
|
34
|
+
}
|
35
|
+
|
36
|
+
public double Decrement()
|
37
|
+
{
|
38
|
+
return Value -= RangeValue.Current.SmallChange;
|
39
|
+
}
|
40
|
+
|
41
|
+
private RangeValuePattern RangeValue
|
42
|
+
{
|
43
|
+
get { return _element.As<RangeValuePattern>(RangeValuePattern.Pattern); }
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
using System.Collections.Generic;
|
2
|
+
using System.Linq;
|
3
|
+
using System.Windows.Automation;
|
4
|
+
using RAutomation.UIA.Extensions;
|
5
|
+
|
6
|
+
namespace RAutomation.UIA.Controls
|
7
|
+
{
|
8
|
+
public class TabControl
|
9
|
+
{
|
10
|
+
private readonly AutomationElement _element;
|
11
|
+
|
12
|
+
public TabControl(AutomationElement element)
|
13
|
+
{
|
14
|
+
_element = element;
|
15
|
+
}
|
16
|
+
|
17
|
+
public string[] TabNames
|
18
|
+
{
|
19
|
+
get { return TabItems.Select(x => x.Current.Name).ToArray(); }
|
20
|
+
}
|
21
|
+
|
22
|
+
public string Selection
|
23
|
+
{
|
24
|
+
get { return TabItems.First(IsSelected).Current.Name; }
|
25
|
+
set { TabItems.First(x => x.Current.Name == value).AsSelectionItem().Select(); }
|
26
|
+
}
|
27
|
+
|
28
|
+
public int SelectedIndex
|
29
|
+
{
|
30
|
+
get { return TabItems.IndexOf(IsSelected); }
|
31
|
+
set { SelectionItems.ElementAt(value).Select(); }
|
32
|
+
}
|
33
|
+
|
34
|
+
private static bool IsSelected(AutomationElement tabItem)
|
35
|
+
{
|
36
|
+
return tabItem.AsSelectionItem().Current.IsSelected;
|
37
|
+
}
|
38
|
+
|
39
|
+
private IEnumerable<AutomationElement> TabItems
|
40
|
+
{
|
41
|
+
get { return _element.Find(IsTabItem); }
|
42
|
+
}
|
43
|
+
|
44
|
+
private IEnumerable<SelectionItemPattern> SelectionItems
|
45
|
+
{
|
46
|
+
get { return TabItems.AsSelectionItems(); }
|
47
|
+
}
|
48
|
+
|
49
|
+
private static Condition IsTabItem
|
50
|
+
{
|
51
|
+
get { return new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem); }
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
@@ -0,0 +1,132 @@
|
|
1
|
+
using System.Collections.Generic;
|
2
|
+
using System.Linq;
|
3
|
+
using System.Windows.Automation;
|
4
|
+
using RAutomation.UIA.Extensions;
|
5
|
+
using RAutomation.UIA.Properties;
|
6
|
+
|
7
|
+
namespace RAutomation.UIA.Controls
|
8
|
+
{
|
9
|
+
public class TableControl
|
10
|
+
{
|
11
|
+
private readonly AutomationElement _element;
|
12
|
+
|
13
|
+
public TableControl(AutomationElement element)
|
14
|
+
{
|
15
|
+
_element = element;
|
16
|
+
}
|
17
|
+
|
18
|
+
public int RowCount
|
19
|
+
{
|
20
|
+
get { return _element.As<TablePattern>(TablePattern.Pattern).Current.RowCount; }
|
21
|
+
}
|
22
|
+
|
23
|
+
public int SelectedIndex
|
24
|
+
{
|
25
|
+
get { return SelectionItems.IndexOf(x => x.Current.IsSelected); }
|
26
|
+
set { Select(value); }
|
27
|
+
}
|
28
|
+
|
29
|
+
public int[] SelectedIndexes
|
30
|
+
{
|
31
|
+
get { return DataItems.IndexesOf(x => x.AsSelectionItem().Current.IsSelected); }
|
32
|
+
}
|
33
|
+
|
34
|
+
public bool IsRowSelected(int dataItemIndex)
|
35
|
+
{
|
36
|
+
return DataItems.ElementAt(dataItemIndex).AsSelectionItem().Current.IsSelected;
|
37
|
+
}
|
38
|
+
|
39
|
+
public void Remove(int dataItemIndex)
|
40
|
+
{
|
41
|
+
DataItems.ElementAt(dataItemIndex).AsSelectionItem().RemoveFromSelection();
|
42
|
+
}
|
43
|
+
|
44
|
+
public void Remove(string dataItemValue)
|
45
|
+
{
|
46
|
+
DataItems.FirstOrDefault(x => x.Current.Name == dataItemValue).AsSelectionItem().RemoveFromSelection();
|
47
|
+
}
|
48
|
+
|
49
|
+
public string Value
|
50
|
+
{
|
51
|
+
set { Select(value); }
|
52
|
+
}
|
53
|
+
|
54
|
+
public bool Exists(int row, int column)
|
55
|
+
{
|
56
|
+
return At(row, column).Exists();
|
57
|
+
}
|
58
|
+
|
59
|
+
public string ValueAt(int row, int column)
|
60
|
+
{
|
61
|
+
return At(row, column).Current.Name;
|
62
|
+
}
|
63
|
+
|
64
|
+
public AutomationElement At(int row, int column)
|
65
|
+
{
|
66
|
+
return _element.FindOne(IsTableItem, GridItemPattern.ColumnProperty.Is(column), GridItemPattern.RowProperty.Is(row));
|
67
|
+
}
|
68
|
+
|
69
|
+
public string[] Headers
|
70
|
+
{
|
71
|
+
get { return _element.Find(ControlType.HeaderItem.Condition()).Select(x => x.Current.Name).ToArray(); }
|
72
|
+
}
|
73
|
+
|
74
|
+
public string[] Values
|
75
|
+
{
|
76
|
+
get { return TableOrListItems.Select(x => x.Current.Name).ToArray(); }
|
77
|
+
}
|
78
|
+
|
79
|
+
public void SingleSelect(int value)
|
80
|
+
{
|
81
|
+
DataItems.ElementAt(value).AsSelectionItem().Select();
|
82
|
+
}
|
83
|
+
|
84
|
+
private void Select(int value)
|
85
|
+
{
|
86
|
+
var selectionItem = DataItems.ElementAt(value).AsSelectionItem();
|
87
|
+
|
88
|
+
if (SelectionPattern.CanSelectMultiple)
|
89
|
+
selectionItem.AddToSelection();
|
90
|
+
else
|
91
|
+
selectionItem.Select();
|
92
|
+
}
|
93
|
+
|
94
|
+
private SelectionPattern.SelectionPatternInformation SelectionPattern
|
95
|
+
{
|
96
|
+
get { return _element.As<SelectionPattern>(SelectionPatternIdentifiers.Pattern).Current; }
|
97
|
+
}
|
98
|
+
|
99
|
+
private void Select(string value)
|
100
|
+
{
|
101
|
+
SelectionElements.First(x => x.Current.Name == value).AsSelectionItem().Select();
|
102
|
+
}
|
103
|
+
|
104
|
+
private IEnumerable<SelectionItemPattern> SelectionItems
|
105
|
+
{
|
106
|
+
get { return SelectionElements.Select(x => x.As<SelectionItemPattern>(SelectionItemPattern.Pattern)); }
|
107
|
+
}
|
108
|
+
|
109
|
+
private IEnumerable<AutomationElement> DataItems
|
110
|
+
{
|
111
|
+
get
|
112
|
+
{
|
113
|
+
return _element.Find(AutomationProperties.IsDataItem);
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
private IEnumerable<AutomationElement> SelectionElements
|
118
|
+
{
|
119
|
+
get { return _element.Find(AutomationProperties.IsSelectionItem); }
|
120
|
+
}
|
121
|
+
|
122
|
+
private IEnumerable<AutomationElement> TableOrListItems
|
123
|
+
{
|
124
|
+
get { return _element.FindAny(IsTableItem, ControlType.ListItem.Condition()); }
|
125
|
+
}
|
126
|
+
|
127
|
+
private static Condition IsTableItem
|
128
|
+
{
|
129
|
+
get { return AutomationElement.IsTableItemPatternAvailableProperty.TrueCondition(); }
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
using System.Runtime.Remoting.Services;
|
2
|
+
using System.Windows.Automation;
|
3
|
+
using System.Windows.Forms;
|
4
|
+
using RAutomation.UIA.Extensions;
|
5
|
+
|
6
|
+
namespace RAutomation.UIA.Controls
|
7
|
+
{
|
8
|
+
public class TextControl
|
9
|
+
{
|
10
|
+
private readonly AutomationElement _element;
|
11
|
+
|
12
|
+
public TextControl(AutomationElement element)
|
13
|
+
{
|
14
|
+
_element = element;
|
15
|
+
}
|
16
|
+
|
17
|
+
public string Value
|
18
|
+
{
|
19
|
+
get { return _element.IsValuePattern() ? TextValue : DocumentText; }
|
20
|
+
set
|
21
|
+
{
|
22
|
+
if (_element.IsValuePattern())
|
23
|
+
TextValue = value;
|
24
|
+
else
|
25
|
+
DocumentText = value;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
private string DocumentText
|
30
|
+
{
|
31
|
+
get { return _element.AsTextPattern().DocumentRange.GetText(-1); }
|
32
|
+
set
|
33
|
+
{
|
34
|
+
_element.SetFocus();
|
35
|
+
Enter("^{HOME}", "^+{END}", "{DEL}", value);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
private static void Enter(params string[] keys)
|
40
|
+
{
|
41
|
+
keys.ForEach(SendKeys.SendWait);
|
42
|
+
}
|
43
|
+
|
44
|
+
private string TextValue
|
45
|
+
{
|
46
|
+
get { return _element.AsValuePattern().Current.Value; }
|
47
|
+
set { _element.AsValuePattern().SetValue(value); }
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
using System.Collections.Generic;
|
2
|
+
using System.Linq;
|
3
|
+
using System.Windows.Automation;
|
4
|
+
using RAutomation.UIA.Extensions;
|
5
|
+
|
6
|
+
namespace RAutomation.UIA
|
7
|
+
{
|
8
|
+
public class ExpandibleCollapsibleContainer
|
9
|
+
{
|
10
|
+
protected readonly AutomationElement _element;
|
11
|
+
|
12
|
+
protected ExpandibleCollapsibleContainer(AutomationElement element)
|
13
|
+
{
|
14
|
+
_element = element;
|
15
|
+
}
|
16
|
+
|
17
|
+
protected IEnumerable<ExpandCollapsePattern> ExpandCollapsItems
|
18
|
+
{
|
19
|
+
get { return Elements.Select(x => x.As<ExpandCollapsePattern>(ExpandCollapsePattern.Pattern)); }
|
20
|
+
}
|
21
|
+
|
22
|
+
protected IEnumerable<AutomationElement> Elements
|
23
|
+
{
|
24
|
+
get { return _element.Find(AutomationElement.IsExpandCollapsePatternAvailableProperty.TrueCondition()); }
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
public class Expander : ExpandibleCollapsibleContainer
|
29
|
+
{
|
30
|
+
public Expander(AutomationElement element) : base(element)
|
31
|
+
{}
|
32
|
+
|
33
|
+
public void Expand(int index)
|
34
|
+
{
|
35
|
+
ExpandCollapsItems.ElementAt(index).Expand();
|
36
|
+
}
|
37
|
+
|
38
|
+
public void Expand(string value)
|
39
|
+
{
|
40
|
+
Elements.FirstOrDefault(x => x.Current.Name == value).As<ExpandCollapsePattern>(ExpandCollapsePattern.Pattern).Expand();
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
public class Collapser : ExpandibleCollapsibleContainer
|
45
|
+
{
|
46
|
+
public Collapser(AutomationElement element) : base(element)
|
47
|
+
{}
|
48
|
+
|
49
|
+
public void Collapse(int index)
|
50
|
+
{
|
51
|
+
ExpandCollapsItems.ElementAt(index).Collapse();
|
52
|
+
}
|
53
|
+
|
54
|
+
public void Collapse(string value)
|
55
|
+
{
|
56
|
+
Elements.FirstOrDefault(x => x.Current.Name == value).As<ExpandCollapsePattern>(ExpandCollapsePattern.Pattern).Collapse();
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
@@ -0,0 +1,166 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Threading;
|
3
|
+
using System.Windows;
|
4
|
+
using System.Windows.Automation;
|
5
|
+
|
6
|
+
namespace RAutomation.UIA.Extensions
|
7
|
+
{
|
8
|
+
public static class Element
|
9
|
+
{
|
10
|
+
public static SelectionItemPattern AsSelectionItem(this AutomationElement automationElement)
|
11
|
+
{
|
12
|
+
return (SelectionItemPattern)automationElement.GetCurrentPattern(SelectionItemPattern.Pattern);
|
13
|
+
}
|
14
|
+
|
15
|
+
public static bool Exists(this AutomationElement automationElement)
|
16
|
+
{
|
17
|
+
return null != automationElement;
|
18
|
+
}
|
19
|
+
|
20
|
+
public static string Name(this AutomationElement automationElement)
|
21
|
+
{
|
22
|
+
return automationElement.Current.Name;
|
23
|
+
}
|
24
|
+
|
25
|
+
public static string ClassName(this AutomationElement automationElement)
|
26
|
+
{
|
27
|
+
return automationElement.Current.ClassName;
|
28
|
+
}
|
29
|
+
|
30
|
+
public static bool IsEnabled(this AutomationElement automationElement)
|
31
|
+
{
|
32
|
+
return automationElement.Current.IsEnabled;
|
33
|
+
}
|
34
|
+
|
35
|
+
public static bool IsFocused(this AutomationElement automationElement)
|
36
|
+
{
|
37
|
+
return automationElement.Current.HasKeyboardFocus;
|
38
|
+
}
|
39
|
+
|
40
|
+
public static string HelpText(this AutomationElement automationElement)
|
41
|
+
{
|
42
|
+
return automationElement.Current.HelpText;
|
43
|
+
}
|
44
|
+
|
45
|
+
public static int NativeWindowHandle(this AutomationElement automationElement)
|
46
|
+
{
|
47
|
+
return automationElement.Exists() ? automationElement.Current.NativeWindowHandle : 0;
|
48
|
+
}
|
49
|
+
|
50
|
+
public static Rect BoundingRectangle(this AutomationElement automationElement)
|
51
|
+
{
|
52
|
+
return automationElement.Current.BoundingRectangle;
|
53
|
+
}
|
54
|
+
|
55
|
+
public static ControlType ControlType(this AutomationElement automationElement)
|
56
|
+
{
|
57
|
+
return automationElement.Current.ControlType;
|
58
|
+
}
|
59
|
+
|
60
|
+
public static int ProcessId(this AutomationElement automationElement)
|
61
|
+
{
|
62
|
+
return automationElement.Current.ProcessId;
|
63
|
+
}
|
64
|
+
|
65
|
+
public static bool IsSelected(this AutomationElement automationElement)
|
66
|
+
{
|
67
|
+
return automationElement.AsSelectionItem().Current.IsSelected;
|
68
|
+
}
|
69
|
+
|
70
|
+
public static bool IsOffscreen(this AutomationElement automationElement)
|
71
|
+
{
|
72
|
+
return automationElement.Current.IsOffscreen;
|
73
|
+
}
|
74
|
+
|
75
|
+
public static TogglePattern AsTogglePattern(this AutomationElement automationElement)
|
76
|
+
{
|
77
|
+
return (TogglePattern)automationElement.GetCurrentPattern(TogglePattern.Pattern);
|
78
|
+
}
|
79
|
+
|
80
|
+
public static bool IsToggled(this AutomationElement automationElement)
|
81
|
+
{
|
82
|
+
return automationElement.AsTogglePattern().Current.ToggleState == ToggleState.On;
|
83
|
+
}
|
84
|
+
|
85
|
+
public static string Value(this AutomationElement automationElement)
|
86
|
+
{
|
87
|
+
return automationElement.AsValuePattern().Current.Value;
|
88
|
+
}
|
89
|
+
|
90
|
+
public static void SendKeys(this AutomationElement automationElement, string keysToSend)
|
91
|
+
{
|
92
|
+
automationElement.SetFocus();
|
93
|
+
System.Windows.Forms.SendKeys.SendWait(keysToSend);
|
94
|
+
}
|
95
|
+
|
96
|
+
public static void SetValue(this AutomationElement automationElement, string value)
|
97
|
+
{
|
98
|
+
automationElement.AsValuePattern().SetValue(value);
|
99
|
+
}
|
100
|
+
|
101
|
+
public static bool IsValuePattern(this AutomationElement automationElement)
|
102
|
+
{
|
103
|
+
return (bool)automationElement.GetCurrentPropertyValue(AutomationElement.IsValuePatternAvailableProperty);
|
104
|
+
}
|
105
|
+
|
106
|
+
public static bool CanScrollTo(this AutomationElement automationElement)
|
107
|
+
{
|
108
|
+
return (bool)automationElement.GetCurrentPropertyValue(AutomationElement.IsScrollItemPatternAvailableProperty);
|
109
|
+
}
|
110
|
+
|
111
|
+
public static ScrollItemPattern AsScrollItem(this AutomationElement automationElement)
|
112
|
+
{
|
113
|
+
return automationElement.As<ScrollItemPattern>(ScrollItemPatternIdentifiers.Pattern);
|
114
|
+
}
|
115
|
+
|
116
|
+
public static bool HasClickablePoint(this AutomationElement automationElement)
|
117
|
+
{
|
118
|
+
Point point;
|
119
|
+
return automationElement.TryGetClickablePoint(out point);
|
120
|
+
}
|
121
|
+
|
122
|
+
public static bool ScrollToIfPossible(this AutomationElement automationElement)
|
123
|
+
{
|
124
|
+
if (!automationElement.CanScrollTo())
|
125
|
+
{
|
126
|
+
return false;
|
127
|
+
}
|
128
|
+
|
129
|
+
if (!automationElement.HasClickablePoint())
|
130
|
+
{
|
131
|
+
automationElement.AsScrollItem().ScrollIntoView();
|
132
|
+
automationElement.WaitUntilClickable(3);
|
133
|
+
}
|
134
|
+
|
135
|
+
return true;
|
136
|
+
}
|
137
|
+
|
138
|
+
public static void WaitUntilClickable(this AutomationElement automationElement, int howManySeconds)
|
139
|
+
{
|
140
|
+
var then = DateTime.Now;
|
141
|
+
while (!automationElement.HasClickablePoint())
|
142
|
+
{
|
143
|
+
Thread.Sleep(1);
|
144
|
+
if ((DateTime.Now - then).Seconds > howManySeconds)
|
145
|
+
{
|
146
|
+
throw new Exception(string.Format("Waited for more than {0} seconds to be able to click this", howManySeconds));
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
public static ValuePattern AsValuePattern(this AutomationElement automationElement)
|
152
|
+
{
|
153
|
+
return (ValuePattern)automationElement.GetCurrentPattern(ValuePattern.Pattern);
|
154
|
+
}
|
155
|
+
|
156
|
+
public static TextPattern AsTextPattern(this AutomationElement automationElement)
|
157
|
+
{
|
158
|
+
return (TextPattern)automationElement.GetCurrentPattern(TextPattern.Pattern);
|
159
|
+
}
|
160
|
+
|
161
|
+
public static T As<T>(this AutomationElement automationElement, AutomationPattern pattern)
|
162
|
+
{
|
163
|
+
return (T)automationElement.GetCurrentPattern(pattern);
|
164
|
+
}
|
165
|
+
}
|
166
|
+
}
|