watir-classic 3.3.0 → 3.4.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.
- data/CHANGES +17 -0
- data/Gemfile.lock +9 -8
- data/LICENSE +1 -0
- data/README.rdoc +6 -7
- data/Rakefile +3 -1
- data/VERSION +1 -1
- data/lib/watir-classic.rb +0 -5
- data/lib/watir-classic/browser.rb +58 -35
- data/lib/watir-classic/browsers.rb +1 -1
- data/lib/watir-classic/container.rb +39 -33
- data/lib/watir-classic/cookies.rb +32 -2
- data/lib/watir-classic/core.rb +0 -1
- data/lib/watir-classic/dialogs/alert.rb +12 -0
- data/lib/watir-classic/dialogs/file_field.rb +11 -0
- data/lib/watir-classic/drag_and_drop_helper.rb +14 -0
- data/lib/watir-classic/element.rb +292 -257
- data/lib/watir-classic/element_collection.rb +26 -8
- data/lib/watir-classic/element_extensions.rb +22 -16
- data/lib/watir-classic/exceptions.rb +4 -4
- data/lib/watir-classic/form.rb +52 -49
- data/lib/watir-classic/frame.rb +23 -14
- data/lib/watir-classic/ie-class.rb +363 -315
- data/lib/watir-classic/ie-process.rb +1 -0
- data/lib/watir-classic/ie.rb +0 -17
- data/lib/watir-classic/image.rb +58 -64
- data/lib/watir-classic/input_elements.rb +224 -219
- data/lib/watir-classic/link.rb +14 -15
- data/lib/watir-classic/locator.rb +12 -7
- data/lib/watir-classic/matches.rb +7 -3
- data/lib/watir-classic/modal_dialog.rb +38 -26
- data/lib/watir-classic/non_control_elements.rb +29 -0
- data/lib/watir-classic/options.rb +10 -15
- data/lib/watir-classic/page-container.rb +30 -48
- data/lib/watir-classic/process.rb +4 -2
- data/lib/watir-classic/screenshot.rb +6 -0
- data/lib/watir-classic/supported_elements.rb +36 -14
- data/lib/watir-classic/table.rb +81 -71
- data/lib/watir-classic/util.rb +9 -11
- data/lib/watir-classic/wait.rb +17 -4
- data/lib/watir-classic/wait_helper.rb +15 -2
- data/lib/watir-classic/win32.rb +2 -1
- data/lib/watir-classic/window.rb +35 -7
- data/lib/watir-classic/xpath_locator.rb +1 -0
- data/lib/watir-classic/yard/global_macros.rb +7 -0
- data/spec/frame_spec.rb +17 -0
- metadata +5 -7
- data/lib/watir-classic/close_all.rb +0 -31
- data/lib/watir-classic/contrib/enabled_popup.rb +0 -21
- data/lib/watir-classic/contrib/ie-new-process.rb +0 -27
- data/lib/watir-classic/contrib/page_checker.rb +0 -29
- data/watir.gif +0 -0
data/lib/watir-classic/link.rb
CHANGED
@@ -1,22 +1,21 @@
|
|
1
1
|
module Watir
|
2
2
|
|
3
|
-
#
|
4
|
-
# Normally a user would not need to create this object as it is returned by the Watir::Container#link method
|
5
|
-
# many of the methods available to this object are inherited from the Element class
|
6
|
-
#
|
3
|
+
# Returned by {Container#link}.
|
7
4
|
class Link < Element
|
8
5
|
attr_ole :type
|
9
6
|
attr_ole :href
|
10
7
|
attr_ole :name
|
11
8
|
|
12
|
-
#
|
9
|
+
# @deprecated Use "browser.link.imgs.length > 0" instead.
|
13
10
|
def link_has_image
|
11
|
+
Kernel.warn "Deprecated(Link#link_has_image) - use \"browser.link.imgs.length > 0\" instead."
|
14
12
|
assert_exists
|
15
13
|
@o.getElementsByTagName("IMG").length > 0
|
16
14
|
end
|
17
15
|
|
18
|
-
#
|
19
|
-
def src
|
16
|
+
# @deprecated Use "browser.link.imgs.first.src rescue ''" instead.
|
17
|
+
def src
|
18
|
+
Kernel.warn "Deprecated(Link#link_has_image) - use \"browser.link.imgs.first.src rescue ''\" instead."
|
20
19
|
assert_exists
|
21
20
|
if @o.getElementsByTagName("IMG").length > 0
|
22
21
|
return @o.getElementsByTagName("IMG")[0.to_s].src
|
@@ -24,7 +23,15 @@ module Watir
|
|
24
23
|
return ""
|
25
24
|
end
|
26
25
|
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
assert_exists
|
29
|
+
r = string_creator
|
30
|
+
r = r + link_string_creator
|
31
|
+
return r.join("\n")
|
32
|
+
end
|
27
33
|
|
34
|
+
# @private
|
28
35
|
def link_string_creator
|
29
36
|
n = []
|
30
37
|
n << "href:".ljust(TO_S_SIZE) + self.href
|
@@ -33,14 +40,6 @@ module Watir
|
|
33
40
|
return n
|
34
41
|
end
|
35
42
|
|
36
|
-
# returns a textual description of the link
|
37
|
-
def to_s
|
38
|
-
assert_exists
|
39
|
-
r = string_creator
|
40
|
-
r = r + link_string_creator
|
41
|
-
return r.join("\n")
|
42
|
-
end
|
43
|
-
|
44
43
|
end
|
45
44
|
|
46
45
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module Watir
|
2
|
+
# @private
|
2
3
|
class Locator
|
3
4
|
include Watir
|
4
5
|
include Watir::Exception
|
@@ -6,7 +7,7 @@ module Watir
|
|
6
7
|
|
7
8
|
def initialize container, specifiers, klass
|
8
9
|
@container = container
|
9
|
-
@specifiers = {:index =>
|
10
|
+
@specifiers = {:index => 0}.merge(normalize_specifiers(specifiers))
|
10
11
|
@tags = @specifiers.delete(:tag_name)
|
11
12
|
@klass = klass
|
12
13
|
end
|
@@ -131,6 +132,7 @@ module Watir
|
|
131
132
|
end
|
132
133
|
end
|
133
134
|
|
135
|
+
# @private
|
134
136
|
class TaggedElementLocator < Locator
|
135
137
|
def each_element(tag)
|
136
138
|
document.getElementsByTagName(tag).each do |ole_object|
|
@@ -143,15 +145,16 @@ module Watir
|
|
143
145
|
return el if el
|
144
146
|
return locate_elements_by_xpath_css_ole[0] if has_excluding_specifiers?
|
145
147
|
|
146
|
-
count =
|
148
|
+
count = 0
|
147
149
|
each do |element|
|
148
|
-
count += 1
|
149
150
|
return element.ole_object if count == @specifiers[:index]
|
151
|
+
count += 1
|
150
152
|
end # elements
|
151
153
|
nil
|
152
154
|
end
|
153
155
|
end
|
154
156
|
|
157
|
+
# @private
|
155
158
|
class FrameLocator < TaggedElementLocator
|
156
159
|
def each_element(tag)
|
157
160
|
frames = @container.page_container.document.frames
|
@@ -165,10 +168,10 @@ module Watir
|
|
165
168
|
end
|
166
169
|
|
167
170
|
def locate
|
168
|
-
count =
|
171
|
+
count = 0
|
169
172
|
each do |frame|
|
170
|
-
count += 1
|
171
173
|
return frame.ole_object, frame.document if count == @specifiers[:index]
|
174
|
+
count += 1
|
172
175
|
end
|
173
176
|
end
|
174
177
|
|
@@ -186,6 +189,7 @@ module Watir
|
|
186
189
|
end
|
187
190
|
end
|
188
191
|
|
192
|
+
# @private
|
189
193
|
class FormLocator < TaggedElementLocator
|
190
194
|
def each_element(tag)
|
191
195
|
document.forms.each do |form|
|
@@ -194,6 +198,7 @@ module Watir
|
|
194
198
|
end
|
195
199
|
end
|
196
200
|
|
201
|
+
# @private
|
197
202
|
class InputElementLocator < Locator
|
198
203
|
def each_element
|
199
204
|
elements = locate_by_name || @container.__ole_inner_elements
|
@@ -208,10 +213,10 @@ module Watir
|
|
208
213
|
return el if el
|
209
214
|
return locate_elements_by_xpath_css_ole[0] if has_excluding_specifiers?
|
210
215
|
|
211
|
-
count =
|
216
|
+
count = 0
|
212
217
|
each do |element|
|
213
|
-
count += 1
|
214
218
|
return element.ole_object if count == @specifiers[:index]
|
219
|
+
count += 1
|
215
220
|
end
|
216
221
|
end
|
217
222
|
|
@@ -1,21 +1,25 @@
|
|
1
|
+
# @private
|
1
2
|
class String
|
2
3
|
def matches(x)
|
3
|
-
|
4
|
+
self == x
|
4
5
|
end
|
5
6
|
end
|
6
7
|
|
8
|
+
# @private
|
7
9
|
class Regexp
|
8
10
|
def matches(x)
|
9
|
-
|
11
|
+
self.match(x)
|
10
12
|
end
|
11
13
|
end
|
12
14
|
|
15
|
+
# @private
|
13
16
|
class Integer
|
14
17
|
def matches(x)
|
15
|
-
|
18
|
+
self == x
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
22
|
+
# @private
|
19
23
|
class Object
|
20
24
|
def matches(x)
|
21
25
|
raise TypeError, "#{self.class} is not supported as a locator"
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module Watir
|
2
|
+
# Returned by {Container#modal_dialog}.
|
2
3
|
class ModalDialog
|
3
4
|
include Container
|
4
5
|
include PageContainer
|
@@ -6,9 +7,43 @@ module Watir
|
|
6
7
|
|
7
8
|
def initialize(container)
|
8
9
|
set_container container
|
9
|
-
@modal = ::RAutomation::Window.new(:hwnd
|
10
|
+
@modal = ::RAutomation::Window.new(:hwnd => @container.hwnd).child(:class => 'Internet Explorer_TridentDlgFrame')
|
10
11
|
end
|
11
12
|
|
13
|
+
# @return [String] title of the dialog.
|
14
|
+
def title
|
15
|
+
document.title
|
16
|
+
end
|
17
|
+
|
18
|
+
# Close the modal dialog.
|
19
|
+
#
|
20
|
+
# @param [Fixnum] timeout timeout in seconds to wait until modal dialog is
|
21
|
+
# successfully closed.
|
22
|
+
def close(timeout=5)
|
23
|
+
return unless exists?
|
24
|
+
document.parentWindow.close
|
25
|
+
Watir::Wait.until(timeout) {!exists?} rescue nil
|
26
|
+
wait
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Fixnum] window handle of the dialog.
|
30
|
+
def hwnd
|
31
|
+
@modal.hwnd
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Boolean] true when modal window is active/in focus, false otherwise.
|
35
|
+
def active?
|
36
|
+
@modal.active?
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [Boolean] true when dialog exists, false otherwise.
|
40
|
+
def exists?
|
41
|
+
@modal.exists?
|
42
|
+
end
|
43
|
+
|
44
|
+
alias_method :exist?, :exists?
|
45
|
+
|
46
|
+
# @private
|
12
47
|
def locate
|
13
48
|
@modal.wait_until_present rescue raise NoMatchingWindowFoundException
|
14
49
|
|
@@ -29,38 +64,15 @@ module Watir
|
|
29
64
|
|
30
65
|
alias_method :document, :locate
|
31
66
|
|
32
|
-
|
33
|
-
document.title
|
34
|
-
end
|
35
|
-
|
36
|
-
def close(timeout=5)
|
37
|
-
return unless exists?
|
38
|
-
document.parentWindow.close
|
39
|
-
Watir::Wait.until(timeout) {!exists?} rescue nil
|
40
|
-
wait
|
41
|
-
end
|
42
|
-
|
67
|
+
# @private
|
43
68
|
def attach_command
|
44
69
|
"Watir::IE.find(:hwnd, #{@container.hwnd}).modal_dialog"
|
45
70
|
end
|
46
71
|
|
72
|
+
# @private
|
47
73
|
def wait(no_sleep=false)
|
48
74
|
@container.page_container.wait unless exists?
|
49
75
|
end
|
50
76
|
|
51
|
-
def hwnd
|
52
|
-
@modal.hwnd
|
53
|
-
end
|
54
|
-
|
55
|
-
def active?
|
56
|
-
@modal.active?
|
57
|
-
end
|
58
|
-
|
59
|
-
def exists?
|
60
|
-
@modal.exists?
|
61
|
-
end
|
62
|
-
|
63
|
-
alias_method :exist?, :exists?
|
64
|
-
|
65
77
|
end
|
66
78
|
end
|
@@ -1,28 +1,37 @@
|
|
1
1
|
module Watir
|
2
|
+
# Returned by the {Watir::Container#area}.
|
2
3
|
class Area < Element
|
3
4
|
attr_ole :alt
|
4
5
|
attr_ole :type
|
5
6
|
attr_ole :href
|
6
7
|
end
|
7
8
|
|
9
|
+
# Returned by the {Watir::Container#audio}.
|
8
10
|
class Audio < Element
|
9
11
|
attr_ole :src
|
10
12
|
end
|
11
13
|
|
14
|
+
# Returned by the {Watir::Container#base}.
|
12
15
|
class Base < Element
|
13
16
|
attr_ole :href
|
14
17
|
end
|
15
18
|
|
19
|
+
# Returned by the {Watir::Container#command}.
|
16
20
|
class Command < Element
|
17
21
|
attr_ole :disabled?
|
18
22
|
attr_ole :type
|
19
23
|
end
|
20
24
|
|
25
|
+
# Returned by the {Watir::Container#data}.
|
21
26
|
class Data < Element
|
22
27
|
attr_ole :value
|
23
28
|
end
|
24
29
|
|
30
|
+
# Returned by the {Watir::Container#dl}.
|
25
31
|
class Dl < Element
|
32
|
+
# Returns Hash representation of dl element where each key-value pair consists of dt and dd element text.
|
33
|
+
#
|
34
|
+
# @return [Hash<String, String>] where key and value is dt and dd text respectively
|
26
35
|
def to_hash
|
27
36
|
dts.each_with_index.reduce({}) do |memo, item|
|
28
37
|
dt, i = *item
|
@@ -33,92 +42,112 @@ module Watir
|
|
33
42
|
end
|
34
43
|
end
|
35
44
|
|
45
|
+
# Returned by the {Watir::Container#embed}.
|
36
46
|
class Embed < Element
|
37
47
|
attr_ole :src
|
38
48
|
attr_ole :type
|
39
49
|
end
|
40
50
|
|
51
|
+
# Returned by the {Watir::Container#fieldset}.
|
41
52
|
class FieldSet < Element
|
42
53
|
attr_ole :name
|
43
54
|
attr_ole :disabled?
|
44
55
|
end
|
45
56
|
|
57
|
+
# Returned by the {Watir::Container#font}.
|
46
58
|
class Font < Element
|
47
59
|
attr_ole :color
|
48
60
|
attr_ole :face
|
49
61
|
attr_ole :size
|
50
62
|
end
|
51
63
|
|
64
|
+
# Returned by the {Watir::Container#keygen}.
|
52
65
|
class Keygen < Element
|
53
66
|
attr_ole :name
|
54
67
|
attr_ole :disabled?
|
55
68
|
end
|
56
69
|
|
70
|
+
# Returned by the {Watir::Container#label}.
|
57
71
|
class Label < Element
|
58
72
|
attr_ole :for, :htmlFor
|
59
73
|
end
|
60
74
|
|
75
|
+
# Returned by the {Watir::Container#li}.
|
61
76
|
class Li < Element
|
62
77
|
attr_ole :value
|
63
78
|
end
|
64
79
|
|
80
|
+
# Returned by the {Watir::Container#map}.
|
65
81
|
class Map < Element
|
66
82
|
attr_ole :name
|
67
83
|
end
|
68
84
|
|
85
|
+
# Returned by the {Watir::Container#menu}.
|
69
86
|
class Menu < Element
|
70
87
|
attr_ole :type
|
71
88
|
end
|
72
89
|
|
90
|
+
# Returned by the {Watir::Container#meta}.
|
73
91
|
class Meta < Element
|
74
92
|
attr_ole :http_equiv, :httpEquiv
|
75
93
|
attr_ole :content
|
76
94
|
attr_ole :name
|
77
95
|
end
|
78
96
|
|
97
|
+
# Returned by the {Watir::Container#meter}.
|
79
98
|
class Meter < Element
|
80
99
|
attr_ole :value
|
81
100
|
end
|
82
101
|
|
102
|
+
# Returned by the {Watir::Container#object}.
|
83
103
|
class Object < Element
|
84
104
|
attr_ole :name
|
85
105
|
attr_ole :type
|
86
106
|
end
|
87
107
|
|
108
|
+
# Returned by the {Watir::Container#optgroup}.
|
88
109
|
class Optgroup < Element
|
89
110
|
attr_ole :disabled?
|
90
111
|
end
|
91
112
|
|
113
|
+
# Returned by the {Watir::Container#output}.
|
92
114
|
class Output < Element
|
93
115
|
attr_ole :name
|
94
116
|
end
|
95
117
|
|
118
|
+
# Returned by the {Watir::Container#param}.
|
96
119
|
class Param < Element
|
97
120
|
attr_ole :name
|
98
121
|
attr_ole :value
|
99
122
|
end
|
100
123
|
|
124
|
+
# Returned by the {Watir::Container#progress}.
|
101
125
|
class Progress < Element
|
102
126
|
attr_ole :value
|
103
127
|
end
|
104
128
|
|
129
|
+
# Returned by the {Watir::Container#script}.
|
105
130
|
class Script < Element
|
106
131
|
attr_ole :src
|
107
132
|
attr_ole :type
|
108
133
|
end
|
109
134
|
|
135
|
+
# Returned by the {Watir::Container#source}.
|
110
136
|
class Source < Element
|
111
137
|
attr_ole :type
|
112
138
|
end
|
113
139
|
|
140
|
+
# Returned by the {Watir::Container#style}.
|
114
141
|
class Style < Element
|
115
142
|
attr_ole :type
|
116
143
|
end
|
117
144
|
|
145
|
+
# Returned by the {Watir::Container#track}.
|
118
146
|
class Track < Element
|
119
147
|
attr_ole :src
|
120
148
|
end
|
121
149
|
|
150
|
+
# Returned by the {Watir::Container#video}.
|
122
151
|
class Video < Element
|
123
152
|
attr_ole :src
|
124
153
|
end
|
@@ -5,29 +5,24 @@ require 'rubygems'
|
|
5
5
|
require 'user-choices'
|
6
6
|
|
7
7
|
module Watir
|
8
|
-
@@options_file = nil
|
9
|
-
@@options = nil
|
10
8
|
class << self
|
11
9
|
# Specify the location of a yaml file containing Watir options. Must be
|
12
10
|
# specified before the options are parsed.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
@@options_file
|
18
|
-
end
|
19
|
-
def options= x
|
20
|
-
@@options = x
|
21
|
-
end
|
11
|
+
attr_accessor :options_file
|
12
|
+
|
13
|
+
attr_writer :options
|
14
|
+
|
22
15
|
# Return the Watir options, as a hash. If they haven't been parsed yet,
|
23
16
|
# they will be now.
|
24
17
|
def options
|
25
|
-
|
18
|
+
@options ||= Watir::WatirOptions.new.execute
|
26
19
|
end
|
27
20
|
end
|
28
21
|
|
22
|
+
# @private
|
29
23
|
class WatirOptions < UserChoices::Command
|
30
24
|
include UserChoices
|
25
|
+
|
31
26
|
def add_sources builder
|
32
27
|
builder.add_source EnvironmentSource, :with_prefix, 'watir_'
|
33
28
|
if Watir.options_file
|
@@ -35,6 +30,7 @@ module Watir
|
|
35
30
|
Watir.options_file
|
36
31
|
end
|
37
32
|
end
|
33
|
+
|
38
34
|
def add_choices builder
|
39
35
|
builder.add_choice :browser,
|
40
36
|
:type => Watir::Browser.browser_names,
|
@@ -44,13 +40,12 @@ module Watir
|
|
44
40
|
:default => 'fast'
|
45
41
|
builder.add_choice :visible,
|
46
42
|
:type => :boolean
|
47
|
-
builder.add_choice :zero_based_indexing,
|
48
|
-
:type => :boolean,
|
49
|
-
:default => true
|
50
43
|
end
|
44
|
+
|
51
45
|
def execute
|
52
46
|
@user_choices[:speed] = @user_choices[:speed].to_sym
|
53
47
|
@user_choices
|
54
48
|
end
|
49
|
+
|
55
50
|
end
|
56
51
|
end
|