rautomation 0.11.0 → 0.12.0
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 +4 -4
- data/Gemfile.lock +2 -2
- data/History.rdoc +6 -0
- data/README.rdoc +5 -2
- data/VERSION +1 -1
- data/ext/UiaDll/RAutomation.UIA/Extensions/Element.cs +15 -4
- data/ext/UiaDll/UiaDll/UiaDll.cpp +17 -0
- data/ext/WindowsForms/WindowsForms/MainFormWindow.Designer.cs +25 -21
- data/ext/WindowsForms/WindowsForms/MainFormWindow.resx +3 -0
- data/lib/rautomation/adapter/ms_uia/control.rb +4 -0
- data/lib/rautomation/adapter/ms_uia/uia_dll.rb +11 -2
- data/spec/adapter/ms_uia/control_spec.rb +5 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 178133c72cc25827e3ce116041461d98735467f7
|
4
|
+
data.tar.gz: 67c1b8edff6687922c7fb97a879af84e10c58107
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 400deacbc79aa298a3d33dd0fc186d9ce6cf3c19af9a5cc5e5cf10e838d4b9b1048b1cd8fc7794feec56c07097111b81a7c4798d8d08bfa479dcf04393534ffc
|
7
|
+
data.tar.gz: c4c2e66e9d4699eedf120aa1352a3111fc1b956ffd0a48f44dbf471c5e158d7fa7e4ecdbacfc8a81b8c815a0839a3ff3b065e9323cd29ec4101bdf4cbf3826de
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rautomation (0.
|
4
|
+
rautomation (0.12.0)
|
5
5
|
ffi
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
10
|
diff-lcs (1.1.3)
|
11
|
-
ffi (1.
|
11
|
+
ffi (1.9.0-x86-mingw32)
|
12
12
|
rake (0.9.2.2)
|
13
13
|
rspec (2.8.0)
|
14
14
|
rspec-core (~> 2.8.0)
|
data/History.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -4,8 +4,6 @@
|
|
4
4
|
* Web: http://www.github.com/jarmo/RAutomation
|
5
5
|
* Author: Jarmo Pertman (mailto:jarmo.p[at]gmail.com)
|
6
6
|
|
7
|
-
{<img alt='Click here to lend your support to: RAutomation and make a donation at www.pledgie.com !' src='https://pledgie.com/campaigns/16196.png?skin_name=chrome' />}[https://pledgie.com/campaigns/16196]
|
8
|
-
|
9
7
|
RAutomation is a small and easy to use library for helping out to automate windows and their controls
|
10
8
|
for automated testing.
|
11
9
|
|
@@ -101,6 +99,11 @@ In case of any problems, feel free to contact me.
|
|
101
99
|
* Eric Kessler - https://github.com/enkessler
|
102
100
|
* Stephan Schwab - https://github.com/snscaimito
|
103
101
|
|
102
|
+
== Libraries Using RAutomation
|
103
|
+
|
104
|
+
* watir-classic[https://github.com/watir/watir-classic]
|
105
|
+
* mohawk[https://github.com/leviwilson/mohawk]
|
106
|
+
|
104
107
|
== Note on Patches/Pull Requests
|
105
108
|
|
106
109
|
* Fork the project.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.12.0
|
@@ -35,6 +35,11 @@ namespace RAutomation.UIA.Extensions
|
|
35
35
|
return automationElement.Current.HasKeyboardFocus;
|
36
36
|
}
|
37
37
|
|
38
|
+
public static string HelpText(this AutomationElement automationElement)
|
39
|
+
{
|
40
|
+
return automationElement.Current.HelpText;
|
41
|
+
}
|
42
|
+
|
38
43
|
public static int NativeWindowHandle(this AutomationElement automationElement)
|
39
44
|
{
|
40
45
|
return automationElement.Exists() ? automationElement.Current.NativeWindowHandle : 0;
|
@@ -80,6 +85,12 @@ namespace RAutomation.UIA.Extensions
|
|
80
85
|
return automationElement.AsValuePattern().Current.Value;
|
81
86
|
}
|
82
87
|
|
88
|
+
public static void SendKeys(this AutomationElement automationElement, string keysToSend)
|
89
|
+
{
|
90
|
+
automationElement.SetFocus();
|
91
|
+
System.Windows.Forms.SendKeys.SendWait(keysToSend);
|
92
|
+
}
|
93
|
+
|
83
94
|
public static void SetValue(this AutomationElement automationElement, string value)
|
84
95
|
{
|
85
96
|
automationElement.AsValuePattern().SetValue(value);
|
@@ -87,22 +98,22 @@ namespace RAutomation.UIA.Extensions
|
|
87
98
|
|
88
99
|
public static bool IsValuePattern(this AutomationElement automationElement)
|
89
100
|
{
|
90
|
-
return (bool)
|
101
|
+
return (bool)automationElement.GetCurrentPropertyValue(AutomationElement.IsValuePatternAvailableProperty);
|
91
102
|
}
|
92
103
|
|
93
104
|
public static ValuePattern AsValuePattern(this AutomationElement automationElement)
|
94
105
|
{
|
95
|
-
return (ValuePattern)
|
106
|
+
return (ValuePattern)automationElement.GetCurrentPattern(ValuePattern.Pattern);
|
96
107
|
}
|
97
108
|
|
98
109
|
public static TextPattern AsTextPattern(this AutomationElement automationElement)
|
99
110
|
{
|
100
|
-
return (TextPattern)
|
111
|
+
return (TextPattern)automationElement.GetCurrentPattern(TextPattern.Pattern);
|
101
112
|
}
|
102
113
|
|
103
114
|
public static T As<T>(this AutomationElement automationElement, AutomationPattern pattern)
|
104
115
|
{
|
105
|
-
return (T)
|
116
|
+
return (T)automationElement.GetCurrentPattern(pattern);
|
106
117
|
}
|
107
118
|
}
|
108
119
|
}
|
@@ -111,6 +111,23 @@ extern "C" {
|
|
111
111
|
}
|
112
112
|
}
|
113
113
|
|
114
|
+
__declspec (dllexport) void SendKeys(const FindInformation& findInformation, const char* keysToSend, char* errorInfo, const long errorInfoLength) {
|
115
|
+
try {
|
116
|
+
Element::SendKeys(Locator::FindFor(findInformation), gcnew String(keysToSend));
|
117
|
+
} catch(Exception^ e) {
|
118
|
+
StringHelper::CopyToUnmanagedString(e->Message, errorInfo, errorInfoLength);
|
119
|
+
}
|
120
|
+
}
|
121
|
+
|
122
|
+
__declspec ( dllexport ) void HelpText(const FindInformation& findInformation, char* helpText, const int helpTextLength) {
|
123
|
+
try {
|
124
|
+
auto helpTextProperty = Element::HelpText(Locator::FindFor(findInformation));
|
125
|
+
StringHelper::CopyToUnmanagedString(helpTextProperty, helpText, helpTextLength);
|
126
|
+
} catch(Exception^ e) {
|
127
|
+
Console::WriteLine("HelpText: {0}", e->Message);
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
114
131
|
__declspec ( dllexport ) int GetClassNames(const FindInformation& findInformation, const char* classNames[]) {
|
115
132
|
auto allChildren = Locator::FindFor(findInformation)->FindAll(System::Windows::Automation::TreeScope::Subtree, Condition::TrueCondition);
|
116
133
|
|
@@ -28,14 +28,15 @@
|
|
28
28
|
/// </summary>
|
29
29
|
private void InitializeComponent()
|
30
30
|
{
|
31
|
-
|
32
|
-
System.Windows.Forms.TreeNode
|
33
|
-
System.Windows.Forms.TreeNode
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
31
|
+
this.components = new System.ComponentModel.Container();
|
32
|
+
System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Child 1");
|
33
|
+
System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Grandchild 1");
|
34
|
+
System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("Child 2", new System.Windows.Forms.TreeNode[] {
|
35
|
+
treeNode7});
|
36
|
+
System.Windows.Forms.TreeNode treeNode9 = new System.Windows.Forms.TreeNode("Parent One", new System.Windows.Forms.TreeNode[] {
|
37
|
+
treeNode6,
|
38
|
+
treeNode8});
|
39
|
+
System.Windows.Forms.TreeNode treeNode10 = new System.Windows.Forms.TreeNode("Parent Two");
|
39
40
|
this.label1 = new System.Windows.Forms.Label();
|
40
41
|
this.aboutButton = new System.Windows.Forms.Button();
|
41
42
|
this.button1 = new System.Windows.Forms.Button();
|
@@ -70,6 +71,7 @@
|
|
70
71
|
this.multiLineTextField = new System.Windows.Forms.TextBox();
|
71
72
|
this.buttonDataGridView = new System.Windows.Forms.Button();
|
72
73
|
this.automatableMonthCalendar1 = new System.Windows.Forms.MonthCalendar();
|
74
|
+
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
|
73
75
|
this.groupBox1.SuspendLayout();
|
74
76
|
this.groupBox2.SuspendLayout();
|
75
77
|
this.menuStrip1.SuspendLayout();
|
@@ -167,6 +169,7 @@
|
|
167
169
|
this.radioButtonReset.Size = new System.Drawing.Size(75, 23);
|
168
170
|
this.radioButtonReset.TabIndex = 9;
|
169
171
|
this.radioButtonReset.Text = "Reset";
|
172
|
+
this.toolTip1.SetToolTip(this.radioButtonReset, "Some help text");
|
170
173
|
this.radioButtonReset.UseVisualStyleBackColor = true;
|
171
174
|
this.radioButtonReset.Click += new System.EventHandler(this.radioButtonReset_Click);
|
172
175
|
//
|
@@ -392,19 +395,19 @@
|
|
392
395
|
//
|
393
396
|
this.treeView.Location = new System.Drawing.Point(490, 285);
|
394
397
|
this.treeView.Name = "treeView";
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
398
|
+
treeNode6.Name = "Child 1";
|
399
|
+
treeNode6.Text = "Child 1";
|
400
|
+
treeNode7.Name = "Grandchild 1";
|
401
|
+
treeNode7.Text = "Grandchild 1";
|
402
|
+
treeNode8.Name = "Child 2";
|
403
|
+
treeNode8.Text = "Child 2";
|
404
|
+
treeNode9.Name = "Parent One";
|
405
|
+
treeNode9.Text = "Parent One";
|
406
|
+
treeNode10.Name = "Parent Two";
|
407
|
+
treeNode10.Text = "Parent Two";
|
405
408
|
this.treeView.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
|
406
|
-
|
407
|
-
|
409
|
+
treeNode9,
|
410
|
+
treeNode10});
|
408
411
|
this.treeView.Size = new System.Drawing.Size(159, 177);
|
409
412
|
this.treeView.TabIndex = 16;
|
410
413
|
//
|
@@ -507,7 +510,8 @@
|
|
507
510
|
private System.Windows.Forms.TreeView treeView;
|
508
511
|
private System.Windows.Forms.TextBox multiLineTextField;
|
509
512
|
private System.Windows.Forms.Button buttonDataGridView;
|
510
|
-
private System.Windows.Forms.MonthCalendar automatableMonthCalendar1;
|
513
|
+
private System.Windows.Forms.MonthCalendar automatableMonthCalendar1;
|
514
|
+
private System.Windows.Forms.ToolTip toolTip1;
|
511
515
|
}
|
512
516
|
}
|
513
517
|
|
@@ -117,6 +117,9 @@
|
|
117
117
|
<resheader name="writer">
|
118
118
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
119
119
|
</resheader>
|
120
|
+
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
121
|
+
<value>132, 17</value>
|
122
|
+
</metadata>
|
120
123
|
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
121
124
|
<value>17, 17</value>
|
122
125
|
</metadata>
|
@@ -134,8 +134,9 @@ module RAutomation
|
|
134
134
|
attach_function :is_enabled, :IsEnabled, [SearchCriteria.by_ref], :bool
|
135
135
|
attach_function :is_focused, :IsFocused, [SearchCriteria.by_ref], :bool
|
136
136
|
attach_function :set_focus, :SetControlFocus, [SearchCriteria.by_ref], :bool
|
137
|
-
attach_function :GetClassNames,
|
138
|
-
|
137
|
+
attach_function :GetClassNames, [SearchCriteria.by_ref, :pointer], :int
|
138
|
+
attach_function :HelpText, [SearchCriteria.by_ref, :pointer, :int], :void
|
139
|
+
attach_function :SendKeys, [SearchCriteria.by_ref, :string, :pointer, :int], :void
|
139
140
|
|
140
141
|
def self.exists?(search_information)
|
141
142
|
ElementExists search_information
|
@@ -155,6 +156,10 @@ module RAutomation
|
|
155
156
|
string_from(:Text_GetValue, search_information)
|
156
157
|
end
|
157
158
|
|
159
|
+
def self.help_text(search_information)
|
160
|
+
string_from(:HelpText, search_information)
|
161
|
+
end
|
162
|
+
|
158
163
|
def self.name(search_information)
|
159
164
|
string_from(:Name, search_information)
|
160
165
|
end
|
@@ -167,6 +172,10 @@ module RAutomation
|
|
167
172
|
strings_from :GetClassNames, search_information
|
168
173
|
end
|
169
174
|
|
175
|
+
def self.send_keys(search_information, keys_to_send)
|
176
|
+
can_throw(:SendKeys, search_information, keys_to_send)
|
177
|
+
end
|
178
|
+
|
170
179
|
# Toggle methods
|
171
180
|
attach_function :is_set, :IsSet, [SearchCriteria.by_ref], :bool
|
172
181
|
|
@@ -27,6 +27,11 @@ describe "MsUia::Control", :if => SpecHelper.adapter == :ms_uia do
|
|
27
27
|
control.control_class.should =~ /WindowsForms10.BUTTON.*/
|
28
28
|
end
|
29
29
|
|
30
|
+
it "can get tooltip information" do
|
31
|
+
control = window.button(:value => 'Reset')
|
32
|
+
control.help_text.should eq 'Some help text'
|
33
|
+
end
|
34
|
+
|
30
35
|
it "can limit the search depth" do
|
31
36
|
window.button(:id => 'buttonDataGridView').click { true }
|
32
37
|
data_grid_window = RAutomation::Window.new(:title => /DataGridView/i)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rautomation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jarmo Pertman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -292,7 +292,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
292
|
version: '0'
|
293
293
|
requirements: []
|
294
294
|
rubyforge_project:
|
295
|
-
rubygems_version: 2.0.
|
295
|
+
rubygems_version: 2.0.7
|
296
296
|
signing_key:
|
297
297
|
specification_version: 4
|
298
298
|
summary: Automate windows and their controls through user-friendly API with Ruby
|