uia 0.0.6.1 → 0.0.7
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.
- data/ChangeLog +14 -0
- data/README.md +127 -46
- data/ext/UiaDll/Release/UIA.Helper.dll +0 -0
- data/ext/UiaDll/Release/UiaDll.dll +0 -0
- data/ext/UiaDll/UiaDll/ElementMethods.cpp +15 -11
- data/ext/UiaDll/UiaDll/ElementStructures.h +15 -1
- data/ext/UiaDll/UiaDll/PatternInformationStructures.h +77 -1
- data/ext/UiaDll/UiaDll/SelectionItemMethods.cpp +1 -0
- data/ext/UiaDll/UiaDll/TableItemMethods.cpp +16 -0
- data/ext/UiaDll/UiaDll/TableMethods.cpp +16 -0
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj +4 -0
- data/ext/UiaDll/UiaDll/UiaDll.vcxproj.filters +9 -0
- data/ext/UiaDll/UiaDll/WindowMethods.cpp +24 -0
- data/ext/UiaDll/UiaDll.Test/ElementInformationTest.cpp +15 -0
- data/ext/UiaDll/UiaDll.Test/PatternInformationTest.cpp +14 -1
- data/ext/UiaDll/UiaDll.Test/UiaDll.Test.vcxproj +2 -0
- data/lib/core_ext/string.rb +5 -0
- data/lib/core_ext/symbol.rb +5 -0
- data/lib/uia/element.rb +26 -17
- data/lib/uia/library/element_structs.rb +95 -0
- data/lib/uia/library/pattern_structs.rb +155 -0
- data/lib/uia/library.rb +36 -12
- data/lib/uia/patterns/expand_collapse.rb +1 -1
- data/lib/uia/patterns/table.rb +32 -0
- data/lib/uia/patterns/table_item.rb +18 -0
- data/lib/uia/patterns/toggle.rb +1 -1
- data/lib/uia/patterns/window.rb +38 -0
- data/lib/uia/version.rb +1 -1
- data/lib/uia.rb +6 -2
- data/spec/uia/element_spec.rb +20 -0
- data/spec/uia/patterns/table_item_spec.rb +21 -0
- data/spec/uia/patterns/table_spec.rb +34 -0
- data/spec/uia/patterns/window_spec.rb +31 -0
- data/uia.gemspec +1 -0
- metadata +36 -5
- data/lib/uia/library/structs.rb +0 -174
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module Uia
|
4
|
+
module Library
|
5
|
+
module ElementLayout
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
layout :handle, :int,
|
9
|
+
:runtime_id, :pointer,
|
10
|
+
:number_of_ids, :int,
|
11
|
+
:name, :string,
|
12
|
+
:class_name, :string,
|
13
|
+
:control_type_id, :int,
|
14
|
+
:patterns, :pointer,
|
15
|
+
:patterns_length, :int,
|
16
|
+
:id, :string,
|
17
|
+
:is_enabled, :bool
|
18
|
+
|
19
|
+
def id
|
20
|
+
self[:id]
|
21
|
+
end
|
22
|
+
|
23
|
+
def name
|
24
|
+
self[:name]
|
25
|
+
end
|
26
|
+
|
27
|
+
def handle
|
28
|
+
self[:handle]
|
29
|
+
end
|
30
|
+
|
31
|
+
def runtime_id
|
32
|
+
self[:runtime_id].read_array_of_int(number_of_ids)
|
33
|
+
end
|
34
|
+
|
35
|
+
def control_type_id
|
36
|
+
self[:control_type_id]
|
37
|
+
end
|
38
|
+
|
39
|
+
def pattern_ids
|
40
|
+
self[:patterns].read_array_of_int(self[:patterns_length])
|
41
|
+
end
|
42
|
+
|
43
|
+
def children
|
44
|
+
Library.children(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
def descendants
|
48
|
+
Library.descendants(self)
|
49
|
+
end
|
50
|
+
|
51
|
+
def empty?
|
52
|
+
to_ptr.address == 0
|
53
|
+
end
|
54
|
+
|
55
|
+
def enabled?
|
56
|
+
self[:is_enabled]
|
57
|
+
end
|
58
|
+
|
59
|
+
def class_name
|
60
|
+
self[:class_name]
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def number_of_ids
|
65
|
+
self[:number_of_ids]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class ManagedElementStruct < FFI::ManagedStruct
|
72
|
+
include ElementLayout
|
73
|
+
|
74
|
+
def self.release(pointer)
|
75
|
+
Library.release_element(pointer)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class ElementStruct < FFI::Struct
|
80
|
+
include ElementLayout
|
81
|
+
end
|
82
|
+
|
83
|
+
class Elements < FFI::Struct
|
84
|
+
layout :length, :int,
|
85
|
+
:items, :pointer
|
86
|
+
|
87
|
+
def children
|
88
|
+
self[:length].times.collect do |i|
|
89
|
+
pointer = self[:items] + i * ElementStruct.size
|
90
|
+
Uia::Element.new(ElementStruct.new(pointer))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
module Uia
|
2
|
+
module Library
|
3
|
+
class ValueInformation < FFI::ManagedStruct
|
4
|
+
layout :is_read_only, :bool,
|
5
|
+
:value, :string
|
6
|
+
|
7
|
+
def read_only?
|
8
|
+
self[:is_read_only]
|
9
|
+
end
|
10
|
+
|
11
|
+
def value
|
12
|
+
self[:value]
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.release(pointer)
|
16
|
+
Library.release_value_info(pointer)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class ToggleInformation < FFI::ManagedStruct
|
21
|
+
layout :state, :string
|
22
|
+
|
23
|
+
def state
|
24
|
+
self[:state]
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.release(pointer)
|
28
|
+
Library.release_toggle_info(pointer)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class SelectionInformation < FFI::ManagedStruct
|
33
|
+
layout :can_multi_select, :bool,
|
34
|
+
:is_selection_required, :bool
|
35
|
+
|
36
|
+
def multi_select?
|
37
|
+
self[:can_multi_select]
|
38
|
+
end
|
39
|
+
|
40
|
+
def selection_required?
|
41
|
+
self[:is_selection_required]
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.release(pointer)
|
45
|
+
Library.release_selection_info(pointer)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class SelectionItemInformation < FFI::ManagedStruct
|
50
|
+
layout :is_selected, :bool,
|
51
|
+
:container, ElementStruct.ptr
|
52
|
+
|
53
|
+
def selected?
|
54
|
+
self[:is_selected]
|
55
|
+
end
|
56
|
+
|
57
|
+
def container
|
58
|
+
self[:container] unless self[:container].empty?
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.release(pointer)
|
62
|
+
Library.release_selection_item_info(pointer)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class ExpandCollapseInformation < FFI::ManagedStruct
|
67
|
+
layout :expand_collapse_state, :string
|
68
|
+
|
69
|
+
def expand_collapse_state
|
70
|
+
self[:expand_collapse_state]
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.release(pointer)
|
74
|
+
Library.release_expand_collapse_info(pointer)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class WindowInformation < FFI::ManagedStruct
|
79
|
+
layout :visual_state, :string,
|
80
|
+
:interaction_state, :string,
|
81
|
+
:can_minimize, :bool,
|
82
|
+
:can_maximize, :bool,
|
83
|
+
:is_modal, :bool,
|
84
|
+
:is_topmost, :bool
|
85
|
+
|
86
|
+
def visual_state
|
87
|
+
self[:visual_state]
|
88
|
+
end
|
89
|
+
|
90
|
+
def can_minimize?
|
91
|
+
self[:can_minimize]
|
92
|
+
end
|
93
|
+
|
94
|
+
def can_maximize?
|
95
|
+
self[:can_maximize]
|
96
|
+
end
|
97
|
+
|
98
|
+
def modal?
|
99
|
+
self[:is_modal]
|
100
|
+
end
|
101
|
+
|
102
|
+
def topmost?
|
103
|
+
self[:is_topmost]
|
104
|
+
end
|
105
|
+
|
106
|
+
def interaction_state
|
107
|
+
self[:interaction_state]
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.release(pointer)
|
111
|
+
Library.release_window_info(pointer)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class TableInformation < FFI::ManagedStruct
|
116
|
+
layout :row_count, :int,
|
117
|
+
:column_count, :int,
|
118
|
+
:headers, Elements.ptr
|
119
|
+
|
120
|
+
def row_count
|
121
|
+
self[:row_count]
|
122
|
+
end
|
123
|
+
|
124
|
+
def column_count
|
125
|
+
self[:column_count]
|
126
|
+
end
|
127
|
+
|
128
|
+
def headers
|
129
|
+
self[:headers].children
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.release(pointer)
|
133
|
+
Library.release_table_info(pointer)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class TableItemInformation < FFI::ManagedStruct
|
138
|
+
layout :column, :int,
|
139
|
+
:row, :int
|
140
|
+
|
141
|
+
def column
|
142
|
+
self[:column]
|
143
|
+
end
|
144
|
+
|
145
|
+
def row
|
146
|
+
self[:row]
|
147
|
+
end
|
148
|
+
|
149
|
+
def self.release(pointer)
|
150
|
+
Library.release_table_item_info(pointer)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|
data/lib/uia/library.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
require 'uia/library/structs'
|
2
1
|
require 'ffi'
|
2
|
+
require 'uia/library/element_structs'
|
3
|
+
require 'uia/library/pattern_structs'
|
3
4
|
|
4
5
|
module Uia
|
5
6
|
module Library
|
@@ -24,36 +25,53 @@ module Uia
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
28
|
+
def self.elements_from(name_alias, name, arg_types, &block)
|
29
|
+
attach_function name, arg_types + [:pointer, :pointer, :int], :int
|
30
|
+
define_singleton_method(name_alias) do |*args|
|
31
|
+
elements_pointer = FFI::MemoryPointer.new :pointer
|
32
|
+
can_throw(name, *(args << elements_pointer)).times.collect do |which_element|
|
33
|
+
pointer = elements_pointer.read_pointer + which_element * ManagedElementStruct.size
|
34
|
+
Uia::Element.new(ManagedElementStruct.new(pointer))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
27
39
|
# returns nil rather than empty FFI::Struct for Uia::Element
|
28
40
|
element_or_nil = lambda { |e| Uia::Element.new(e) unless e.empty? }
|
29
41
|
|
30
42
|
# cleanup
|
31
43
|
attach_function :release_element, :Element_Release, [:pointer], :void
|
32
|
-
attach_function :
|
44
|
+
attach_function :release_window_info, :Window_Release, [:pointer], :void
|
33
45
|
attach_function :release_value_info, :Value_Release, [:pointer], :void
|
34
46
|
attach_function :release_toggle_info, :Toggle_Release, [:pointer], :void
|
35
47
|
attach_function :release_selection_info, :Selection_Release, [:pointer], :void
|
36
48
|
attach_function :release_selection_item_info, :SelectionItem_Release, [:pointer], :void
|
49
|
+
attach_function :release_table_info, :Table_Release, [:pointer], :void
|
50
|
+
attach_function :release_table_item_info, :TableItem_Release, [:pointer], :void
|
37
51
|
attach_function :release_expand_collapse_info, :ExpandCollapse_Release, [:pointer], :void
|
38
52
|
|
39
53
|
# root methods
|
40
|
-
|
54
|
+
elements_from :root_children, :Root_Children, []
|
41
55
|
|
42
56
|
# finding elements
|
43
|
-
attach_throwable_function :find_by_id, :Element_FindById, [:string],
|
44
|
-
attach_throwable_function :find_by_name, :Element_FindByName, [:string],
|
45
|
-
attach_throwable_function :find_by_pid, :Element_FindByProcessId, [:int],
|
46
|
-
attach_throwable_function :find_by_handle, :Element_FindByHandle, [:int],
|
47
|
-
attach_function :Element_FindByRuntimeId, [:pointer, :int, :pointer, :int],
|
57
|
+
attach_throwable_function :find_by_id, :Element_FindById, [:string], ManagedElementStruct.by_ref, &element_or_nil
|
58
|
+
attach_throwable_function :find_by_name, :Element_FindByName, [:string], ManagedElementStruct.by_ref, &element_or_nil
|
59
|
+
attach_throwable_function :find_by_pid, :Element_FindByProcessId, [:int], ManagedElementStruct.by_ref, &element_or_nil
|
60
|
+
attach_throwable_function :find_by_handle, :Element_FindByHandle, [:int], ManagedElementStruct.by_ref, &element_or_nil
|
61
|
+
attach_function :Element_FindByRuntimeId, [:pointer, :int, :pointer, :int], ManagedElementStruct.by_ref
|
48
62
|
|
49
63
|
# element methods
|
50
|
-
attach_throwable_function :find_child_by_id, :Element_FindChildById, [:pointer, :string],
|
51
|
-
attach_throwable_function :find_child_by_name, :Element_FindChildByName, [:pointer, :string],
|
52
|
-
|
53
|
-
|
64
|
+
attach_throwable_function :find_child_by_id, :Element_FindChildById, [:pointer, :string], ManagedElementStruct.by_ref, &element_or_nil
|
65
|
+
attach_throwable_function :find_child_by_name, :Element_FindChildByName, [:pointer, :string], ManagedElementStruct.by_ref, &element_or_nil
|
66
|
+
elements_from :children, :Element_Children, [:pointer]
|
67
|
+
elements_from :descendants, :Element_Descendants, [:pointer]
|
54
68
|
attach_throwable_function :click, :Element_Click, [:pointer], :void
|
55
69
|
attach_throwable_function :refresh, :Element_Refresh, [:pointer], :void
|
56
70
|
|
71
|
+
# WindowPattern methods
|
72
|
+
attach_throwable_function :window_information, :Window_Information, [:pointer], WindowInformation.by_ref
|
73
|
+
attach_throwable_function :set_visual_state, :Window_SetVisualState, [:pointer, :string], :void
|
74
|
+
|
57
75
|
# ValuePattern methods
|
58
76
|
attach_throwable_function :set_value, :Value_Set, [:pointer, :string], :void
|
59
77
|
attach_throwable_function :value_info, :Value_Information, [:pointer], ValueInformation.by_ref
|
@@ -79,6 +97,12 @@ module Uia
|
|
79
97
|
attach_throwable_function :add_to_selection, :SelectionItem_AddToSelection, [:pointer], :void
|
80
98
|
attach_throwable_function :remove_from_selection, :SelectionItem_RemoveFromSelection, [:pointer], :void
|
81
99
|
|
100
|
+
# TablePattern methods
|
101
|
+
attach_throwable_function :table_info, :Table_Information, [:pointer], TableInformation.by_ref
|
102
|
+
|
103
|
+
# TableItemPattern methods
|
104
|
+
attach_throwable_function :table_item_info, :TableItem_Information, [:pointer], TableItemInformation.by_ref
|
105
|
+
|
82
106
|
def self.find_by_runtime_id(id)
|
83
107
|
p = FFI::MemoryPointer.new :int, id.count
|
84
108
|
p.write_array_of_int(id)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Uia
|
2
|
+
module Patterns
|
3
|
+
module Table
|
4
|
+
module Row
|
5
|
+
def items
|
6
|
+
select(pattern: :table_item).each { |e| e.as :table_item }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def row_count
|
11
|
+
table_info.row_count
|
12
|
+
end
|
13
|
+
|
14
|
+
def column_count
|
15
|
+
table_info.column_count
|
16
|
+
end
|
17
|
+
|
18
|
+
def headers
|
19
|
+
table_info.headers
|
20
|
+
end
|
21
|
+
|
22
|
+
def rows
|
23
|
+
select(control_type: :data_item).each { |e| e.extend Row }
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def table_info
|
28
|
+
Library.table_info(@element)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/uia/patterns/toggle.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
module Uia
|
2
|
+
module Patterns
|
3
|
+
module Window
|
4
|
+
def visual_state
|
5
|
+
window_information.visual_state.to_snake_case_sym
|
6
|
+
end
|
7
|
+
|
8
|
+
def can_minimize?
|
9
|
+
window_information.can_minimize?
|
10
|
+
end
|
11
|
+
|
12
|
+
def can_maximize?
|
13
|
+
window_information.can_maximize?
|
14
|
+
end
|
15
|
+
|
16
|
+
def modal?
|
17
|
+
window_information.modal?
|
18
|
+
end
|
19
|
+
|
20
|
+
def topmost?
|
21
|
+
window_information.topmost?
|
22
|
+
end
|
23
|
+
|
24
|
+
def visual_state=(state)
|
25
|
+
Library.set_visual_state(@element, state.to_camelized_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
def interaction_state
|
29
|
+
window_information.interaction_state.to_snake_case_sym
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def window_information
|
34
|
+
Library.window_information(@element)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/uia/version.rb
CHANGED
data/lib/uia.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
|
+
require 'require_all'
|
1
2
|
require 'uia/version'
|
2
3
|
require 'uia/library'
|
3
4
|
require 'uia/library/constants'
|
4
|
-
require 'uia/element'
|
5
5
|
require 'uia/finder'
|
6
|
+
require 'uia/element'
|
7
|
+
|
8
|
+
require_rel 'uia/patterns'
|
9
|
+
require_rel 'core_ext'
|
6
10
|
|
7
11
|
module Uia
|
8
12
|
class BadLocator < StandardError; end
|
9
13
|
extend Finder
|
10
14
|
|
11
15
|
def self.children
|
12
|
-
Library.root_children
|
16
|
+
Library.root_children
|
13
17
|
end
|
14
18
|
|
15
19
|
def self.find_element(how)
|
data/spec/uia/element_spec.rb
CHANGED
@@ -28,6 +28,11 @@ describe Uia::Element do
|
|
28
28
|
Given { raw_element.stub(:pattern_ids).and_return([7777]) }
|
29
29
|
Then { element.patterns.should == [:unknown] }
|
30
30
|
end
|
31
|
+
|
32
|
+
context '#as' do
|
33
|
+
When(:cast) { element.as :toggle }
|
34
|
+
Then { cast.should have_failed UnsupportedPattern, "Pattern toggle not found in [:window, :transform]" }
|
35
|
+
end
|
31
36
|
end
|
32
37
|
|
33
38
|
context '#refresh' do
|
@@ -55,6 +60,21 @@ describe Uia::Element do
|
|
55
60
|
end
|
56
61
|
end
|
57
62
|
|
63
|
+
context '#select' do
|
64
|
+
context 'control_type' do
|
65
|
+
When(:buttons) { element.select(control_type: :radio_button) }
|
66
|
+
Then { buttons.map(&:control_type) == [:radio_button] * 3 }
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'pattern' do
|
70
|
+
Then { element.select(pattern: :value).count == 4 }
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'combinations' do
|
74
|
+
Then { element.select(control_type: :button, name: 'About')[0].id == 'aboutButton' }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
58
78
|
context '#click' do
|
59
79
|
Given(:about) { element.children.find { |c| c.name == 'About' } }
|
60
80
|
Given(:disabled_checkbox) { element.children.find { |c| c.name == 'checkBoxDisabled' } }
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Uia::Patterns::TableItem do
|
4
|
+
Given(:data_grid) do
|
5
|
+
until (form = Uia.find_element(name: 'DataEntryForm'))
|
6
|
+
Uia.find_element(id: /MainForm/).find(name: 'Data Entry Form').as(:invoke).invoke
|
7
|
+
end
|
8
|
+
|
9
|
+
form.find(name: 'Add Many').as(:invoke).invoke
|
10
|
+
form.find(id: 'personListView').as(:table)
|
11
|
+
end
|
12
|
+
Given(:first_row) { data_grid.rows.first }
|
13
|
+
|
14
|
+
context 'properties' do
|
15
|
+
Given(:first_item) { first_row.items.first }
|
16
|
+
Given(:last_item) { first_row.items.last }
|
17
|
+
|
18
|
+
Then { last_item.column == 2 }
|
19
|
+
Then { first_item.row == 0 }
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Uia::Patterns::Table do
|
4
|
+
Given(:data_grid) do
|
5
|
+
until (form = Uia.find_element(name: 'DataEntryForm'))
|
6
|
+
Uia.find_element(id: /MainForm/).find(name: 'Data Entry Form').as(:invoke).invoke
|
7
|
+
end
|
8
|
+
|
9
|
+
form.find(name: 'Add Many').as(:invoke).invoke
|
10
|
+
form.find(id: 'personListView').as(:table)
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'properties' do
|
14
|
+
Then { data_grid.row_count == 52 }
|
15
|
+
Then { data_grid.column_count == 3 }
|
16
|
+
end
|
17
|
+
|
18
|
+
context '#headers' do
|
19
|
+
Then { data_grid.headers.map(&:control_type) == [:header_item] * 3 }
|
20
|
+
Then { data_grid.headers.map(&:name) == ['Name', 'Date of birth', 'State'] }
|
21
|
+
end
|
22
|
+
|
23
|
+
context '#rows' do
|
24
|
+
Then { data_grid.rows.count == data_grid.row_count }
|
25
|
+
|
26
|
+
context 'row' do
|
27
|
+
Given(:row) { data_grid.rows[0] }
|
28
|
+
|
29
|
+
context '#items' do
|
30
|
+
Then { row.items.map(&:name) == ['John Doe', '12/15/1967', 'FL'] }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Uia::Patterns::Window do
|
4
|
+
Given(:window) { Uia.find_element(id: /MainFormWindow/).as(:window) }
|
5
|
+
|
6
|
+
context 'properties' do
|
7
|
+
Then { window.visual_state == :normal }
|
8
|
+
Then { window.interaction_state == :ready_for_user_interaction }
|
9
|
+
Then { window.can_minimize? == true }
|
10
|
+
Then { window.can_maximize? == true }
|
11
|
+
Then { window.modal? == false }
|
12
|
+
Then { window.topmost? == false }
|
13
|
+
end
|
14
|
+
|
15
|
+
context '#visual_state=' do
|
16
|
+
context 'minimized' do
|
17
|
+
When { window.visual_state = :minimized }
|
18
|
+
Then { window.visual_state == :minimized }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'maximized' do
|
22
|
+
When { window.visual_state = :maximized }
|
23
|
+
Then { window.visual_state == :maximized }
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'normal' do
|
27
|
+
When { window.visual_state = :normal }
|
28
|
+
Then { window.visual_state == :normal }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/uia.gemspec
CHANGED