watir 6.1.0 → 6.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -1
- data/CHANGES.md +8 -0
- data/lib/watir.rb +1 -0
- data/lib/watir/adjacent.rb +120 -0
- data/lib/watir/atoms.rb +0 -1
- data/lib/watir/element_collection.rb +28 -3
- data/lib/watir/elements/element.rb +21 -38
- data/lib/watir/wait.rb +6 -3
- data/spec/element_spec.rb +38 -17
- data/spec/spec_helper.rb +1 -8
- data/spec/watirspec/adjacent_spec.rb +164 -0
- data/spec/watirspec/elements/collections_spec.rb +15 -4
- data/spec/watirspec/elements/element_spec.rb +1 -11
- data/spec/watirspec/elements/elements_spec.rb +21 -0
- data/spec/watirspec/html/nested_elements.html +34 -0
- data/spec/watirspec/html/nested_iframes.html +4 -0
- data/spec/watirspec/html/wait.html +6 -1
- data/spec/watirspec/relaxed_locate_spec.rb +12 -12
- data/spec/watirspec/support/raise_exception_matchers.rb +3 -2
- data/spec/watirspec/wait_spec.rb +26 -7
- data/support/doctest_helper.rb +1 -6
- data/support/travis.sh +2 -10
- data/watir.gemspec +1 -1
- metadata +7 -3
- data/lib/watir/atoms/getParentElement.js +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7a75c3cb00c09caec743b797d7b5590fc81938c
|
4
|
+
data.tar.gz: a0d2f54bca3c49c1b9c893e0f767f3015f4b00e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3600748e11ba3740795eb9d80292d4b71ed0fa2798806f27c9e2a2fcf97308a4024fb231a36ba91e2a58de50852ede60b152d51449b97f754276e316d2a8f525
|
7
|
+
data.tar.gz: ca859e2face12ccdfa90cd4935a00b196ef6b8f4555e28f71f1abaffd6f054416a7d5f8d49c218eb9635e4ab936657c0aee080f9b9948bdadcf1375070c088d7
|
data/.travis.yml
CHANGED
data/CHANGES.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
### 6.2.0 (2017-02-20)
|
2
|
+
|
3
|
+
* `Element#wait_while_present` exits when locator no longer matches
|
4
|
+
* Element Collections store specific element types rather than just `HTMLElement`
|
5
|
+
* Implement adjacent element location for parent, siblings and children
|
6
|
+
* Add support for assigning keywords to `Element` for better error messaging
|
7
|
+
* Update actions implementation to work with selenium-webdriver > 3.0.5
|
8
|
+
|
1
9
|
### 6.1.0 (2017-01-04)
|
2
10
|
|
3
11
|
* Add Ruby 2.4.0 support (thanks Robert MacCracken)
|
data/lib/watir.rb
CHANGED
@@ -0,0 +1,120 @@
|
|
1
|
+
module Watir
|
2
|
+
module Adjacent
|
3
|
+
|
4
|
+
#
|
5
|
+
# Returns parent element of current element.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# browser.text_field(name: "new_user_first_name").parent == browser.fieldset
|
9
|
+
# #=> true
|
10
|
+
#
|
11
|
+
|
12
|
+
def parent(opt = {})
|
13
|
+
opt[:index] ||= 0
|
14
|
+
xpath_adjacent("ancestor::", opt)
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Returns preceding sibling element of current element.
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# browser.text_field(name: "new_user_first_name").preceding_sibling(index: 1) == browser.legend
|
22
|
+
# #=> true
|
23
|
+
#
|
24
|
+
|
25
|
+
def preceding_sibling(opt = {})
|
26
|
+
opt[:index] ||= 0
|
27
|
+
xpath_adjacent("preceding-sibling::", opt)
|
28
|
+
end
|
29
|
+
alias_method :previous_sibling, :preceding_sibling
|
30
|
+
|
31
|
+
#
|
32
|
+
# Returns collection of preceding sibling elements of current element.
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
# browser.text_field(name: "new_user_first_name").preceding_siblings.size
|
36
|
+
# #=> 3
|
37
|
+
#
|
38
|
+
|
39
|
+
def preceding_siblings(opt = {})
|
40
|
+
raise ArgumentError, "#previous_siblings can not take an index value" if opt[:index]
|
41
|
+
xpath_adjacent("preceding-sibling::", opt)
|
42
|
+
end
|
43
|
+
alias_method :previous_siblings, :preceding_siblings
|
44
|
+
|
45
|
+
#
|
46
|
+
# Returns following sibling element of current element.
|
47
|
+
#
|
48
|
+
# @example
|
49
|
+
# browser.text_field(name: "new_user_first_name").following_sibling(index: 2) == browser.text_field(id: "new_user_last_name")
|
50
|
+
# #=> true
|
51
|
+
#
|
52
|
+
|
53
|
+
def following_sibling(opt = {})
|
54
|
+
opt[:index] ||= 0
|
55
|
+
xpath_adjacent("following-sibling::", opt)
|
56
|
+
end
|
57
|
+
alias_method :next_sibling, :following_sibling
|
58
|
+
|
59
|
+
#
|
60
|
+
# Returns collection of following sibling elements of current element.
|
61
|
+
#
|
62
|
+
# @example
|
63
|
+
# browser.text_field(name: "new_user_first_name").following_siblings.size
|
64
|
+
# #=> 52
|
65
|
+
#
|
66
|
+
|
67
|
+
def following_siblings(opt = {})
|
68
|
+
raise ArgumentError, "#next_siblings can not take an index value" if opt[:index]
|
69
|
+
xpath_adjacent("following-sibling::", opt)
|
70
|
+
end
|
71
|
+
alias_method :next_siblings, :following_siblings
|
72
|
+
|
73
|
+
#
|
74
|
+
# Returns element of direct child of current element.
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# browser.form(id: "new_user").child == browser.fieldset
|
78
|
+
# #=> true
|
79
|
+
#
|
80
|
+
|
81
|
+
def child(opt = {})
|
82
|
+
opt[:index] ||= 0
|
83
|
+
xpath_adjacent('', opt)
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# Returns collection of elements of direct children of current element.
|
88
|
+
#
|
89
|
+
# @example
|
90
|
+
# browser.select_list(id: "new_user_languages").children == browser.select_list(id: "new_user_languages").options.to_a
|
91
|
+
# #=> true
|
92
|
+
#
|
93
|
+
|
94
|
+
def children(opt = {})
|
95
|
+
raise ArgumentError, "#children can not take an index value" if opt[:index]
|
96
|
+
xpath_adjacent('', opt)
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def xpath_adjacent(direction = '', opt = {})
|
102
|
+
opt = opt.dup
|
103
|
+
index = opt.delete :index
|
104
|
+
tag_name = opt.delete :tag_name
|
105
|
+
unless opt.empty?
|
106
|
+
caller = caller_locations(1, 1)[0].label
|
107
|
+
raise ArgumentError, "unsupported locators: #{opt.inspect} for ##{caller} method"
|
108
|
+
end
|
109
|
+
|
110
|
+
if index
|
111
|
+
klass = tag_name ? self.send(tag_name).class : HTMLElement
|
112
|
+
klass.new(self, xpath: "./#{direction}#{tag_name || '*'}[#{index + 1}]")
|
113
|
+
else
|
114
|
+
klass = tag_name ? Object.const_get("#{self.send(tag_name).class}Collection") : HTMLElementCollection
|
115
|
+
klass.new(self, xpath: "./#{direction}#{tag_name || '*'}")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end # Adjacent
|
120
|
+
end # Watir
|
data/lib/watir/atoms.rb
CHANGED
@@ -35,7 +35,7 @@ module Watir
|
|
35
35
|
#
|
36
36
|
|
37
37
|
def length
|
38
|
-
|
38
|
+
to_a.length
|
39
39
|
end
|
40
40
|
alias_method :size, :length
|
41
41
|
|
@@ -80,12 +80,37 @@ module Watir
|
|
80
80
|
#
|
81
81
|
|
82
82
|
def to_a
|
83
|
-
# TODO: optimize - lazy element_class instance?
|
84
83
|
@to_a ||= elements.map.with_index do |e, idx|
|
85
|
-
element_class.new(@query_scope, @selector.merge(element: e, index: idx))
|
84
|
+
element = element_class.new(@query_scope, @selector.merge(element: e, index: idx))
|
85
|
+
element_class == Watir::HTMLElement ? element.to_subtype : element
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
#
|
90
|
+
# Returns true if two element collections are equal.
|
91
|
+
#
|
92
|
+
# @example
|
93
|
+
# browser.select_list(name: "new_user_languages").options == browser.select_list(id: "new_user_languages").options
|
94
|
+
# #=> true
|
95
|
+
#
|
96
|
+
# @example
|
97
|
+
# browser.select_list(name: "new_user_role").options == browser.select_list(id: "new_user_languages").options
|
98
|
+
# #=> false
|
99
|
+
#
|
100
|
+
|
101
|
+
def ==(other)
|
102
|
+
to_a == other.to_a
|
103
|
+
end
|
104
|
+
alias_method :eql?, :==
|
105
|
+
|
106
|
+
#
|
107
|
+
# Creates a Collection containing elements of two collections.
|
108
|
+
#
|
109
|
+
# @example
|
110
|
+
# (browser.select_list(name: "new_user_languages").options + browser.select_list(id: "new_user_role").options).size
|
111
|
+
# #=> 8
|
112
|
+
#
|
113
|
+
|
89
114
|
private
|
90
115
|
|
91
116
|
def elements
|
@@ -11,6 +11,9 @@ module Watir
|
|
11
11
|
include Container
|
12
12
|
include EventuallyPresent
|
13
13
|
include Waitable
|
14
|
+
include Adjacent
|
15
|
+
|
16
|
+
attr_accessor :keyword
|
14
17
|
|
15
18
|
#
|
16
19
|
# temporarily add :id and :class_name manually since they're no longer specified in the HTML spec.
|
@@ -49,11 +52,16 @@ module Watir
|
|
49
52
|
alias_method :exist?, :exists?
|
50
53
|
|
51
54
|
def inspect
|
55
|
+
string = "#<#{self.class}: "
|
56
|
+
string << "keyword: #{keyword} " if keyword
|
57
|
+
string << "located: #{!!@element}; "
|
52
58
|
if @selector.empty?
|
53
|
-
|
59
|
+
string << '{element: (selenium element)}'
|
54
60
|
else
|
55
|
-
|
61
|
+
string << selector_string
|
56
62
|
end
|
63
|
+
string << '>'
|
64
|
+
string
|
57
65
|
end
|
58
66
|
|
59
67
|
#
|
@@ -113,8 +121,6 @@ module Watir
|
|
113
121
|
def click(*modifiers)
|
114
122
|
element_call(:wait_for_enabled) do
|
115
123
|
if modifiers.any?
|
116
|
-
assert_has_input_devices_for "click(#{modifiers.join ', '})"
|
117
|
-
|
118
124
|
action = driver.action
|
119
125
|
modifiers.each { |mod| action.key_down mod }
|
120
126
|
action.click @element
|
@@ -138,8 +144,6 @@ module Watir
|
|
138
144
|
#
|
139
145
|
|
140
146
|
def double_click
|
141
|
-
assert_has_input_devices_for :double_click
|
142
|
-
|
143
147
|
element_call(:wait_for_present) { driver.action.double_click(@element).perform }
|
144
148
|
browser.after_hooks.run
|
145
149
|
end
|
@@ -153,8 +157,6 @@ module Watir
|
|
153
157
|
#
|
154
158
|
|
155
159
|
def right_click
|
156
|
-
assert_has_input_devices_for :right_click
|
157
|
-
|
158
160
|
element_call(:wait_for_present) { driver.action.context_click(@element).perform }
|
159
161
|
browser.after_hooks.run
|
160
162
|
end
|
@@ -168,8 +170,6 @@ module Watir
|
|
168
170
|
#
|
169
171
|
|
170
172
|
def hover
|
171
|
-
assert_has_input_devices_for :hover
|
172
|
-
|
173
173
|
element_call(:wait_for_present) { driver.action.move_to(@element).perform }
|
174
174
|
end
|
175
175
|
|
@@ -185,7 +185,6 @@ module Watir
|
|
185
185
|
|
186
186
|
def drag_and_drop_on(other)
|
187
187
|
assert_is_element other
|
188
|
-
assert_has_input_devices_for :drag_and_drop_on
|
189
188
|
|
190
189
|
element_call(:wait_for_present) do
|
191
190
|
driver.action.
|
@@ -206,8 +205,6 @@ module Watir
|
|
206
205
|
#
|
207
206
|
|
208
207
|
def drag_and_drop_by(right_by, down_by)
|
209
|
-
assert_has_input_devices_for :drag_and_drop_by
|
210
|
-
|
211
208
|
element_call(:wait_for_present) do
|
212
209
|
driver.action.
|
213
210
|
drag_and_drop_by(@element, right_by, down_by).
|
@@ -345,18 +342,6 @@ module Watir
|
|
345
342
|
element_call { execute_atom :fireEvent, @element, event_name }
|
346
343
|
end
|
347
344
|
|
348
|
-
#
|
349
|
-
# Returns parent element of current element.
|
350
|
-
#
|
351
|
-
|
352
|
-
def parent
|
353
|
-
e = element_call { execute_atom :getParentElement, @element }
|
354
|
-
|
355
|
-
if e.kind_of?(Selenium::WebDriver::Element)
|
356
|
-
Watir.element_class_for(e.tag_name.downcase).new(@query_scope, element: e)
|
357
|
-
end
|
358
|
-
end
|
359
|
-
|
360
345
|
#
|
361
346
|
# @api private
|
362
347
|
#
|
@@ -488,6 +473,10 @@ module Watir
|
|
488
473
|
true
|
489
474
|
end
|
490
475
|
|
476
|
+
def reset!
|
477
|
+
@element = nil
|
478
|
+
end
|
479
|
+
|
491
480
|
protected
|
492
481
|
|
493
482
|
def wait_for_exists
|
@@ -505,7 +494,7 @@ module Watir
|
|
505
494
|
warn message
|
506
495
|
end
|
507
496
|
raise unknown_exception, "timed out after #{Watir.default_timeout} seconds, "\
|
508
|
-
"waiting for #{
|
497
|
+
"waiting for #{inspect} to be located"
|
509
498
|
end
|
510
499
|
end
|
511
500
|
|
@@ -534,7 +523,7 @@ module Watir
|
|
534
523
|
begin
|
535
524
|
wait_until(&:enabled?)
|
536
525
|
rescue Watir::Wait::TimeoutError
|
537
|
-
message = "element present, but timed out after #{Watir.default_timeout} seconds, waiting for #{
|
526
|
+
message = "element present, but timed out after #{Watir.default_timeout} seconds, waiting for #{inspect} to be enabled"
|
538
527
|
raise ObjectDisabledException, message
|
539
528
|
end
|
540
529
|
end
|
@@ -546,7 +535,7 @@ module Watir
|
|
546
535
|
begin
|
547
536
|
wait_until { !respond_to?(:readonly?) || !readonly? }
|
548
537
|
rescue Watir::Wait::TimeoutError
|
549
|
-
message = "element present and enabled, but timed out after #{Watir.default_timeout} seconds, waiting for #{
|
538
|
+
message = "element present and enabled, but timed out after #{Watir.default_timeout} seconds, waiting for #{inspect} to not be readonly"
|
550
539
|
raise ObjectReadOnlyException, message
|
551
540
|
end
|
552
541
|
end
|
@@ -555,7 +544,7 @@ module Watir
|
|
555
544
|
def assert_exists
|
556
545
|
if @element && @selector.empty?
|
557
546
|
ensure_context
|
558
|
-
@element
|
547
|
+
@element.reset! if stale?
|
559
548
|
elsif @element && !stale?
|
560
549
|
return
|
561
550
|
else
|
@@ -567,7 +556,7 @@ module Watir
|
|
567
556
|
|
568
557
|
def assert_element_found
|
569
558
|
unless @element
|
570
|
-
raise unknown_exception, "unable to locate element
|
559
|
+
raise unknown_exception, "unable to locate element: #{inspect}"
|
571
560
|
end
|
572
561
|
end
|
573
562
|
|
@@ -625,7 +614,7 @@ module Watir
|
|
625
614
|
|
626
615
|
def assert_enabled
|
627
616
|
unless element_call { @element.enabled? }
|
628
|
-
raise ObjectDisabledException, "object is disabled #{
|
617
|
+
raise ObjectDisabledException, "object is disabled #{inspect}"
|
629
618
|
end
|
630
619
|
end
|
631
620
|
|
@@ -633,13 +622,7 @@ module Watir
|
|
633
622
|
assert_enabled
|
634
623
|
|
635
624
|
if respond_to?(:readonly?) && readonly?
|
636
|
-
raise ObjectReadOnlyException, "object is read only #{
|
637
|
-
end
|
638
|
-
end
|
639
|
-
|
640
|
-
def assert_has_input_devices_for(name)
|
641
|
-
unless driver.kind_of? Selenium::WebDriver::DriverExtensions::HasInputDevices
|
642
|
-
raise NotImplementedError, "#{self.class}##{name} is not supported by this driver"
|
625
|
+
raise ObjectReadOnlyException, "object is read only #{inspect}"
|
643
626
|
end
|
644
627
|
end
|
645
628
|
|
data/lib/watir/wait.rb
CHANGED
@@ -121,7 +121,7 @@ module Watir
|
|
121
121
|
timeout = deprecated_timeout
|
122
122
|
message = deprecated_message
|
123
123
|
end
|
124
|
-
message ||= "waiting for true condition on #{
|
124
|
+
message ||= "waiting for true condition on #{inspect}"
|
125
125
|
Wait.until(timeout: timeout, message: message, interval: interval, object: self, &blk)
|
126
126
|
|
127
127
|
self
|
@@ -147,7 +147,7 @@ module Watir
|
|
147
147
|
timeout = deprecated_timeout
|
148
148
|
message = deprecated_message
|
149
149
|
end
|
150
|
-
message ||= "waiting for false condition on #{
|
150
|
+
message ||= "waiting for false condition on #{inspect}"
|
151
151
|
Wait.while(timeout: timeout, message: message, interval: interval, object: self, &blk)
|
152
152
|
|
153
153
|
self
|
@@ -190,7 +190,10 @@ module Watir
|
|
190
190
|
warn "Instead of passing arguments into #wait_while_present method, use keywords"
|
191
191
|
timeout = deprecated_timeout
|
192
192
|
end
|
193
|
-
wait_while(timeout: timeout
|
193
|
+
wait_while(timeout: timeout) do
|
194
|
+
self.reset! if self.is_a? Watir::Element
|
195
|
+
self.present?
|
196
|
+
end
|
194
197
|
end
|
195
198
|
|
196
199
|
end # Waitable
|
data/spec/element_spec.rb
CHANGED
@@ -76,7 +76,7 @@ describe Watir::Element do
|
|
76
76
|
|
77
77
|
watir_element = browser.div(id: "text")
|
78
78
|
|
79
|
-
|
79
|
+
# simulate element going stale after assert_exists and before action taken, but not when block retried
|
80
80
|
allow(watir_element).to receive(:text) do
|
81
81
|
watir_element.send(:element_call) do
|
82
82
|
@already_stale ||= false
|
@@ -106,33 +106,54 @@ describe Watir::Element do
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
-
describe "#
|
110
|
-
|
111
|
-
|
109
|
+
describe "#inspect" do
|
110
|
+
before(:each) { browser.goto(WatirSpec.url_for("nested_iframes.html")) }
|
111
|
+
|
112
|
+
it "does displays specified element type" do
|
113
|
+
expect(browser.div.inspect).to include('Watir::Div')
|
114
|
+
end
|
115
|
+
|
116
|
+
it "does not display element type if not specified" do
|
117
|
+
element = browser.element(index: 4)
|
118
|
+
expect(element.inspect).to include('Watir::HTMLElement')
|
119
|
+
end
|
120
|
+
|
121
|
+
it "displays keyword if specified" do
|
122
|
+
element = browser.h3
|
123
|
+
element.keyword = 'foo'
|
124
|
+
expect(element.inspect).to include('keyword: foo')
|
125
|
+
end
|
126
|
+
|
127
|
+
it "does not display keyword if not specified" do
|
128
|
+
element = browser.h3
|
129
|
+
expect(element.inspect).to_not include('keyword')
|
130
|
+
end
|
131
|
+
|
132
|
+
it "locate is false when not located" do
|
112
133
|
element = browser.div(:id, 'not_present')
|
113
|
-
|
114
|
-
|
134
|
+
expect(element.inspect).to include('located: false')
|
135
|
+
end
|
136
|
+
|
137
|
+
it "locate is true when located" do
|
138
|
+
element = browser.h3
|
139
|
+
element.exists?
|
140
|
+
expect(element.inspect).to include('located: true')
|
115
141
|
end
|
116
142
|
|
117
143
|
it "displays selector string for element from colection" do
|
118
|
-
browser.
|
119
|
-
|
120
|
-
error = 'timed out after 0 seconds, waiting for true condition on {:tag_name=>"div", :index=>5}'
|
121
|
-
expect { element.wait_until_present(timeout: 0) }.to raise_exception(Watir::Wait::TimeoutError, error)
|
144
|
+
elements = browser.frames
|
145
|
+
expect(elements.last.inspect).to include '{:tag_name=>"frame", :index=>-1}'
|
122
146
|
end
|
123
147
|
|
124
148
|
it "displays selector string for nested element" do
|
125
149
|
browser.goto(WatirSpec.url_for("wait.html"))
|
126
|
-
element = browser.div(index:
|
127
|
-
|
128
|
-
expect { element.wait_until_present(timeout: 0) }.to raise_exception(Watir::Wait::TimeoutError, error)
|
150
|
+
element = browser.div(index: 1).div(id: 'div2')
|
151
|
+
expect(element.inspect).to include '{:index=>1, :tag_name=>"div"} --> {:id=>"div2", :tag_name=>"div"}'
|
129
152
|
end
|
130
153
|
|
131
154
|
it "displays selector string for nested element under frame" do
|
132
|
-
browser.
|
133
|
-
element
|
134
|
-
error = 'unable to locate iframe using {:id=>"one", :tag_name=>"iframe"} --> {:id=>"three", :tag_name=>"iframe"}'
|
135
|
-
expect { element.wait_until_present(timeout: 0) }.to raise_exception(Watir::Exception::UnknownFrameException, error)
|
155
|
+
element = browser.iframe(id: 'one').iframe(id: 'three')
|
156
|
+
expect(element.inspect).to include '{:id=>"one", :tag_name=>"iframe"} --> {:id=>"three", :tag_name=>"iframe"}'
|
136
157
|
end
|
137
158
|
end
|
138
159
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -14,14 +14,7 @@ if ENV['RELAXED_LOCATE'] == "false"
|
|
14
14
|
Watir.relaxed_locate = false
|
15
15
|
end
|
16
16
|
|
17
|
-
if ENV['TRAVIS']
|
18
|
-
ENV['DISPLAY'] = ":99.0"
|
19
|
-
|
20
|
-
if ENV['WATIR_BROWSER'] == "chrome"
|
21
|
-
ENV['WATIR_CHROME_BINARY'] = File.expand_path "chrome-linux/chrome"
|
22
|
-
ENV['WATIR_CHROME_DRIVER'] = File.expand_path "chrome-linux/chromedriver"
|
23
|
-
end
|
24
|
-
end
|
17
|
+
ENV['DISPLAY'] = ':99.0' if ENV['TRAVIS']
|
25
18
|
|
26
19
|
if Selenium::WebDriver::Platform.linux? && ENV['DISPLAY'].nil?
|
27
20
|
raise "DISPLAY not set"
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require "watirspec_helper"
|
2
|
+
|
3
|
+
describe "Adjacent Elements" do
|
4
|
+
before(:all) do
|
5
|
+
browser.goto(WatirSpec.url_for("nested_elements.html"))
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#parent" do
|
9
|
+
it "gets immediate parent of an element by default" do
|
10
|
+
expect(browser.div(id: "first_sibling").parent.id).to eq 'parent'
|
11
|
+
expect(browser.div(id: "first_sibling").parent).to be_a Watir::HTMLElement
|
12
|
+
end
|
13
|
+
|
14
|
+
it "accepts index argument" do
|
15
|
+
expect(browser.div(id: "first_sibling").parent(index: 2).id).to eq 'grandparent'
|
16
|
+
expect(browser.div(id: "first_sibling").parent(index: 2)).to be_a Watir::HTMLElement
|
17
|
+
end
|
18
|
+
|
19
|
+
it "accepts tag_name argument" do
|
20
|
+
expect(browser.div(id: "first_sibling").parent(tag_name: :div).id).to eq 'parent'
|
21
|
+
expect(browser.div(id: "first_sibling").parent(tag_name: :div)).to be_a Watir::Div
|
22
|
+
end
|
23
|
+
|
24
|
+
it "accepts index and tag_name arguments" do
|
25
|
+
expect(browser.div(id: "first_sibling").parent(tag_name: :div, index: 1).id).to eq 'grandparent'
|
26
|
+
expect(browser.div(id: "first_sibling").parent(tag_name: :div, index: 1)).to be_a Watir::Div
|
27
|
+
end
|
28
|
+
|
29
|
+
it "does not error when no parent element of an index exists" do
|
30
|
+
expect(browser.body.parent(index: 2)).to_not exist
|
31
|
+
end
|
32
|
+
|
33
|
+
it "does not error when no parent element of a tag_name exists" do
|
34
|
+
expect(browser.div(id: "first_sibling").parent(tag_name: :table)).to_not exist
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#following_sibling" do
|
39
|
+
it "gets immediate following sibling of an element by default" do
|
40
|
+
expect(browser.div(id: "first_sibling").following_sibling.id).to eq 'between_siblings1'
|
41
|
+
expect(browser.div(id: "first_sibling").following_sibling).to be_a Watir::HTMLElement
|
42
|
+
end
|
43
|
+
|
44
|
+
it "accepts index argument" do
|
45
|
+
expect(browser.div(id: "first_sibling").following_sibling(index: 2).id).to eq 'between_siblings2'
|
46
|
+
expect(browser.div(id: "first_sibling").following_sibling(index: 2)).to be_a Watir::HTMLElement
|
47
|
+
end
|
48
|
+
|
49
|
+
it "accepts tag_name argument" do
|
50
|
+
expect(browser.div(id: "first_sibling").following_sibling(tag_name: :div).id).to eq 'second_sibling'
|
51
|
+
expect(browser.div(id: "first_sibling").following_sibling(tag_name: :div)).to be_a Watir::Div
|
52
|
+
end
|
53
|
+
|
54
|
+
it "accepts index and tag_name arguments" do
|
55
|
+
expect(browser.div(id: "first_sibling").following_sibling(tag_name: :div, index: 1).id).to eq 'third_sibling'
|
56
|
+
expect(browser.div(id: "first_sibling").following_sibling(tag_name: :div, index: 1)).to be_a Watir::Div
|
57
|
+
end
|
58
|
+
|
59
|
+
it "does not error when no next sibling of an index exists" do
|
60
|
+
expect(browser.body.following_sibling(index: 1)).to_not exist
|
61
|
+
end
|
62
|
+
|
63
|
+
it "does not error when no next sibling of a tag_name exists" do
|
64
|
+
expect(browser.div(id: "first_sibling").following_sibling(tag_name: :table)).to_not exist
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#following_siblings" do
|
69
|
+
it "gets collection of subsequent siblings of an element by default" do
|
70
|
+
expect(browser.div(id: "second_sibling").following_siblings).to be_a Watir::HTMLElementCollection
|
71
|
+
expect(browser.div(id: "second_sibling").following_siblings.size).to eq 2
|
72
|
+
end
|
73
|
+
|
74
|
+
it "accepts tag_name argument" do
|
75
|
+
expect(browser.div(id: "second_sibling").following_siblings(tag_name: :div).size).to eq 1
|
76
|
+
expect(browser.div(id: "second_sibling").following_siblings(tag_name: :div).first).to be_a Watir::Div
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#previous_sibling" do
|
81
|
+
it "gets immediate preceeding sibling of an element by default" do
|
82
|
+
expect(browser.div(id: "third_sibling").previous_sibling.id).to eq 'between_siblings2'
|
83
|
+
expect(browser.div(id: "third_sibling").previous_sibling).to be_a Watir::HTMLElement
|
84
|
+
end
|
85
|
+
|
86
|
+
it "accepts index argument" do
|
87
|
+
expect(browser.div(id: "third_sibling").previous_sibling(index: 2).id).to eq 'between_siblings1'
|
88
|
+
expect(browser.div(id: "third_sibling").previous_sibling(index: 2)).to be_a Watir::HTMLElement
|
89
|
+
end
|
90
|
+
|
91
|
+
it "accepts tag_name argument" do
|
92
|
+
expect(browser.div(id: "third_sibling").previous_sibling(tag_name: :div).id).to eq 'second_sibling'
|
93
|
+
expect(browser.div(id: "third_sibling").previous_sibling(tag_name: :div)).to be_a Watir::Div
|
94
|
+
end
|
95
|
+
|
96
|
+
it "accepts index and tag_name arguments" do
|
97
|
+
expect(browser.div(id: "third_sibling").previous_sibling(tag_name: :div, index: 1).id).to eq 'first_sibling'
|
98
|
+
expect(browser.div(id: "third_sibling").previous_sibling(tag_name: :div, index: 1)).to be_a Watir::Div
|
99
|
+
end
|
100
|
+
|
101
|
+
it "does not error when no next sibling of an index exists" do
|
102
|
+
expect(browser.body.previous_sibling(index: 1)).to_not exist
|
103
|
+
end
|
104
|
+
|
105
|
+
it "does not error when no next sibling of a tag_name exists" do
|
106
|
+
expect(browser.div(id: "third_sibling").previous_sibling(tag_name: :table)).to_not exist
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#previous_siblings" do
|
111
|
+
it "gets collection of previous siblings of an element by default" do
|
112
|
+
expect(browser.div(id: "second_sibling").previous_siblings).to be_a Watir::HTMLElementCollection
|
113
|
+
expect(browser.div(id: "second_sibling").previous_siblings.size).to eq 2
|
114
|
+
end
|
115
|
+
|
116
|
+
it "accepts tag_name argument" do
|
117
|
+
expect(browser.div(id: "second_sibling").previous_siblings(tag_name: :div).size).to eq 1
|
118
|
+
expect(browser.div(id: "second_sibling").previous_siblings(tag_name: :div).first).to be_a Watir::Div
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "#child" do
|
123
|
+
it "gets immediate child of an element by default" do
|
124
|
+
expect(browser.div(id: "parent").child.id).to eq 'first_sibling'
|
125
|
+
expect(browser.div(id: "parent").child).to be_a Watir::HTMLElement
|
126
|
+
end
|
127
|
+
|
128
|
+
it "accepts index argument" do
|
129
|
+
expect(browser.div(id: "parent").child(index: 2).id).to eq 'second_sibling'
|
130
|
+
expect(browser.div(id: "parent").child(index: 2)).to be_a Watir::HTMLElement
|
131
|
+
end
|
132
|
+
|
133
|
+
it "accepts tag_name argument" do
|
134
|
+
expect(browser.div(id: "parent").child(tag_name: :span).id).to eq 'between_siblings1'
|
135
|
+
expect(browser.div(id: "parent").child(tag_name: :span)).to be_a Watir::Span
|
136
|
+
end
|
137
|
+
|
138
|
+
it "accepts index and tag_name arguments" do
|
139
|
+
expect(browser.div(id: "parent").child(tag_name: :div, index: 1).id).to eq 'second_sibling'
|
140
|
+
expect(browser.div(id: "parent").child(tag_name: :div, index: 1)).to be_a Watir::Div
|
141
|
+
end
|
142
|
+
|
143
|
+
it "does not error when no next sibling of an index exists" do
|
144
|
+
expect(browser.div(id: "second_sibling").child(index: 1)).to_not exist
|
145
|
+
end
|
146
|
+
|
147
|
+
it "does not error when no next sibling of a tag_name exists" do
|
148
|
+
expect(browser.div(id: "parent").child(tag_name: :table)).to_not exist
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "#children" do
|
153
|
+
it "gets collection of children of an element by default" do
|
154
|
+
expect(browser.div(id: "parent").children).to be_a Watir::HTMLElementCollection
|
155
|
+
expect(browser.div(id: "parent").children.size).to eq 5
|
156
|
+
end
|
157
|
+
|
158
|
+
it "accepts tag_name argument" do
|
159
|
+
children = browser.div(id: "parent").children(tag_name: :div)
|
160
|
+
expect(children.size).to eq 3
|
161
|
+
expect(children.all? { |child| child.is_a? Watir::Div }).to eq true
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -2,15 +2,26 @@ require "watirspec_helper"
|
|
2
2
|
|
3
3
|
describe "Collections" do
|
4
4
|
|
5
|
-
before :each do
|
6
|
-
browser.goto(WatirSpec.url_for("collections.html"))
|
7
|
-
end
|
8
|
-
|
9
5
|
it "returns inner elements of parent element having different html tag" do
|
6
|
+
browser.goto(WatirSpec.url_for("collections.html"))
|
10
7
|
expect(browser.span(id: "a_span").divs.size).to eq 2
|
11
8
|
end
|
12
9
|
|
13
10
|
it "returns inner elements of parent element having same html tag" do
|
11
|
+
browser.goto(WatirSpec.url_for("collections.html"))
|
14
12
|
expect(browser.span(id: "a_span").spans.size).to eq 2
|
15
13
|
end
|
14
|
+
|
15
|
+
it "returns correct subtype of elements" do
|
16
|
+
browser.goto(WatirSpec.url_for("collections.html"))
|
17
|
+
collection = browser.span(id: "a_span").spans.to_a
|
18
|
+
expect(collection.all? { |el| el.is_a? Watir::Span}).to eq true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can contain more than one type of element" do
|
22
|
+
browser.goto(WatirSpec.url_for("nested_elements.html"))
|
23
|
+
collection = browser.div(id: "parent").children
|
24
|
+
expect(collection.any? { |el| el.is_a? Watir::Span}).to eq true
|
25
|
+
expect(collection.any? { |el| el.is_a? Watir::Div}).to eq true
|
26
|
+
end
|
16
27
|
end
|
@@ -182,23 +182,13 @@ describe "Element" do
|
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
185
|
-
describe "#parent" do
|
186
|
-
it "gets the parent of this element" do
|
187
|
-
expect(browser.text_field(id: "new_user_email").parent).to be_instance_of(Watir::FieldSet)
|
188
|
-
end
|
189
|
-
|
190
|
-
it "returns nil if the element has no parent" do
|
191
|
-
expect(browser.body.parent.parent).to be_nil
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
185
|
describe "#visible?" do
|
196
186
|
it "returns true if the element is visible" do
|
197
187
|
expect(browser.text_field(id: "new_user_email")).to be_visible
|
198
188
|
end
|
199
189
|
|
200
190
|
it "raises UnknownObjectException exception if the element does not exist" do
|
201
|
-
expect {browser.text_field(id: "no_such_id").visible?}.to raise_unknown_object_exception
|
191
|
+
expect { browser.text_field(id: "no_such_id").visible? }.to raise_unknown_object_exception
|
202
192
|
end
|
203
193
|
|
204
194
|
it "raises UnknownObjectException exception if the element is stale" do
|
@@ -12,4 +12,25 @@ describe "Elements" do
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
describe "#eq and #eql?" do
|
17
|
+
before { browser.goto WatirSpec.url_for("forms_with_input_elements.html") }
|
18
|
+
|
19
|
+
it "returns true if the two collections have the same Watir Elements" do
|
20
|
+
a = browser.select_list(name: "new_user_languages").options
|
21
|
+
b = browser.select_list(id: "new_user_languages").options
|
22
|
+
|
23
|
+
expect(a).to eq b
|
24
|
+
expect(a).to eql(b)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns false if the two collections are not the same" do
|
28
|
+
a = browser.select_list(name: "new_user_languages").options
|
29
|
+
b = browser.select_list(id: "new_user_role").options
|
30
|
+
|
31
|
+
expect(a).to_not eq b
|
32
|
+
expect(a).to_not eql(b)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
15
36
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
5
|
+
<title>Nested Elements</title>
|
6
|
+
</head>
|
7
|
+
|
8
|
+
<body>
|
9
|
+
<span id="grandparent_span">
|
10
|
+
<div id="grandparent">
|
11
|
+
<span id="parent_span">
|
12
|
+
<div id="parent">
|
13
|
+
<div id="first_sibling">
|
14
|
+
<span id="child_span">
|
15
|
+
<div id="oldest_child">
|
16
|
+
<span id="grandson_span">
|
17
|
+
<div id="first_grandson"></div>
|
18
|
+
<div id="second_grandson"></div>
|
19
|
+
</span>
|
20
|
+
</div>
|
21
|
+
<div id="middle_child"></div>
|
22
|
+
<div id="youngest_child"></div>
|
23
|
+
</span>
|
24
|
+
</div>
|
25
|
+
<span id="between_siblings1"></span>
|
26
|
+
<div id="second_sibling"></div>
|
27
|
+
<span id="between_siblings2"></span>
|
28
|
+
<div id="third_sibling"></div>
|
29
|
+
</div>
|
30
|
+
</span>
|
31
|
+
</div>
|
32
|
+
</span>
|
33
|
+
</body>
|
34
|
+
</html>
|
@@ -40,6 +40,10 @@
|
|
40
40
|
document.getElementById(id).disabled = disabled;
|
41
41
|
}, timeout);
|
42
42
|
}
|
43
|
+
|
44
|
+
function changeName(id) {
|
45
|
+
document.getElementById(id).name = 'different';
|
46
|
+
}
|
43
47
|
</script>
|
44
48
|
</head>
|
45
49
|
|
@@ -59,7 +63,8 @@
|
|
59
63
|
</a>
|
60
64
|
</div>
|
61
65
|
<div>
|
62
|
-
<a id="
|
66
|
+
<a id="change_select" href="#" onclick="changeName('add_select');">change select list</a>
|
67
|
+
<a id="add_select" name="add_select" href="#" onclick="setTimeoutDisplay('languages', 'block', 500);">show select list</a>
|
63
68
|
</div>
|
64
69
|
<form>
|
65
70
|
<fieldset>
|
@@ -54,10 +54,10 @@ describe 'Watir#relaxed_locate?' do
|
|
54
54
|
it 'fails first for parent not existing' do
|
55
55
|
begin
|
56
56
|
Watir.default_timeout = 0
|
57
|
-
|
57
|
+
inspected = '#<Watir::Div: located: false; {:id=>"no_parent", :tag_name=>"div"}>'
|
58
58
|
element = browser.div(id: 'no_parent').div(id: 'no_child')
|
59
59
|
error = Watir::Exception::UnknownObjectException
|
60
|
-
message = "timed out after #{Watir.default_timeout} seconds, waiting for #{
|
60
|
+
message = "timed out after #{Watir.default_timeout} seconds, waiting for #{inspected} to be located"
|
61
61
|
expect { element.click }.to raise_exception(error, message)
|
62
62
|
ensure
|
63
63
|
Watir.default_timeout = 30
|
@@ -67,10 +67,10 @@ describe 'Watir#relaxed_locate?' do
|
|
67
67
|
it 'fails for child not existing if parent exists' do
|
68
68
|
begin
|
69
69
|
Watir.default_timeout = 0
|
70
|
-
|
70
|
+
inspected = '#<Watir::Div: located: false; {:id=>"buttons", :tag_name=>"div"} --> {:id=>"no_child", :tag_name=>"div"}>'
|
71
71
|
element = browser.div(id: 'buttons').div(id: 'no_child')
|
72
72
|
error = Watir::Exception::UnknownObjectException
|
73
|
-
message = "timed out after #{Watir.default_timeout} seconds, waiting for #{
|
73
|
+
message = "timed out after #{Watir.default_timeout} seconds, waiting for #{inspected} to be located"
|
74
74
|
expect { element.click }.to raise_exception(error, message)
|
75
75
|
ensure
|
76
76
|
Watir.default_timeout = 30
|
@@ -80,10 +80,10 @@ describe 'Watir#relaxed_locate?' do
|
|
80
80
|
it 'fails for parent not present if child exists' do
|
81
81
|
begin
|
82
82
|
Watir.default_timeout = 0.5
|
83
|
-
|
83
|
+
inspected = '#<Watir::Div: located: true; {:id=>"also_hidden", :tag_name=>"div"}>'
|
84
84
|
element = browser.div(id: 'also_hidden').div(id: 'hidden_child')
|
85
85
|
error = Watir::Exception::UnknownObjectException
|
86
|
-
message = "element located, but timed out after #{Watir.default_timeout} seconds, waiting for true condition on #{
|
86
|
+
message = "element located, but timed out after #{Watir.default_timeout} seconds, waiting for true condition on #{inspected}"
|
87
87
|
allow($stderr).to receive(:write).twice
|
88
88
|
expect { element.click }.to raise_exception(error, message)
|
89
89
|
ensure
|
@@ -94,10 +94,10 @@ describe 'Watir#relaxed_locate?' do
|
|
94
94
|
it 'fails for child not present if parent is present' do
|
95
95
|
begin
|
96
96
|
Watir.default_timeout = 0.5
|
97
|
-
|
97
|
+
inspected = '#<Watir::Button: located: true; {:id=>"buttons", :tag_name=>"div"} --> {:id=>"btn2", :tag_name=>"button"}>'
|
98
98
|
element = browser.div(id: 'buttons').button(id: 'btn2')
|
99
99
|
error = Watir::Exception::UnknownObjectException
|
100
|
-
message = "element located, but timed out after #{Watir.default_timeout} seconds, waiting for true condition on #{
|
100
|
+
message = "element located, but timed out after #{Watir.default_timeout} seconds, waiting for true condition on #{inspected}"
|
101
101
|
allow($stderr).to receive(:write).twice
|
102
102
|
expect { element.click }.to raise_exception(error, message)
|
103
103
|
ensure
|
@@ -109,10 +109,10 @@ describe 'Watir#relaxed_locate?' do
|
|
109
109
|
browser.goto(WatirSpec.url_for("forms_with_input_elements.html"))
|
110
110
|
begin
|
111
111
|
Watir.default_timeout = 0.5
|
112
|
-
|
112
|
+
inspected = '#<Watir::TextField: located: true; {:id=>"new_user", :tag_name=>"form"} --> {:id=>"good_luck", :tag_name=>"input or textarea", :type=>"(any text type)"}>'
|
113
113
|
element = browser.form(id: 'new_user').text_field(id: 'good_luck')
|
114
114
|
error = Watir::Exception::ObjectDisabledException
|
115
|
-
message = "element present, but timed out after #{Watir.default_timeout} seconds, waiting for #{
|
115
|
+
message = "element present, but timed out after #{Watir.default_timeout} seconds, waiting for #{inspected} to be enabled"
|
116
116
|
expect { element.set('foo') }.to raise_exception(error, message)
|
117
117
|
ensure
|
118
118
|
Watir.default_timeout = 30
|
@@ -123,10 +123,10 @@ describe 'Watir#relaxed_locate?' do
|
|
123
123
|
browser.goto(WatirSpec.url_for("forms_with_input_elements.html"))
|
124
124
|
begin
|
125
125
|
Watir.default_timeout = 0.5
|
126
|
-
|
126
|
+
inspected = '#<Watir::TextField: located: true; {:id=>"new_user", :tag_name=>"form"} --> {:id=>"new_user_code", :tag_name=>"input or textarea", :type=>"(any text type)"}>'
|
127
127
|
element = browser.form(id: 'new_user').text_field(id: 'new_user_code')
|
128
128
|
error = Watir::Exception::ObjectReadOnlyException
|
129
|
-
message = "element present and enabled, but timed out after #{Watir.default_timeout} seconds, waiting for #{
|
129
|
+
message = "element present and enabled, but timed out after #{Watir.default_timeout} seconds, waiting for #{inspected} to not be readonly"
|
130
130
|
expect { element.set('foo') }.to raise_exception(error, message)
|
131
131
|
ensure
|
132
132
|
Watir.default_timeout = 30
|
@@ -9,14 +9,15 @@ if defined?(RSpec)
|
|
9
9
|
}.freeze
|
10
10
|
|
11
11
|
TIMING_EXCEPTIONS.each do |matcher, exception|
|
12
|
-
RSpec::Matchers.define matcher do |
|
12
|
+
RSpec::Matchers.define matcher do |message|
|
13
13
|
match do |actual|
|
14
14
|
original_timeout = Watir.default_timeout
|
15
15
|
Watir.default_timeout = 0
|
16
16
|
begin
|
17
17
|
actual.call
|
18
18
|
false
|
19
|
-
rescue exception
|
19
|
+
rescue exception => ex
|
20
|
+
raise exception, "expected '#{message}' to be included in: '#{ex.message}'" unless message.nil? || ex.message.include?(message)
|
20
21
|
true
|
21
22
|
ensure
|
22
23
|
Watir.default_timeout = original_timeout
|
data/spec/watirspec/wait_spec.rb
CHANGED
@@ -167,8 +167,11 @@ not_compliant_on :safari do
|
|
167
167
|
end
|
168
168
|
|
169
169
|
it "times out" do
|
170
|
-
|
171
|
-
|
170
|
+
error = Watir::Wait::TimeoutError
|
171
|
+
inspected = '#<Watir::Button: located: false; {:id=>"btn", :tag_name=>"button"}>'
|
172
|
+
message = "timed out after 1 seconds, waiting for true condition on #{inspected}"
|
173
|
+
element = browser.button(id: 'btn')
|
174
|
+
expect { element.wait_until(timeout: 1, &:enabled?).click }.to raise_error(error, message)
|
172
175
|
end
|
173
176
|
|
174
177
|
it "responds to Element methods" do
|
@@ -196,8 +199,11 @@ not_compliant_on :safari do
|
|
196
199
|
end
|
197
200
|
|
198
201
|
it "times out if the element doesn't appear" do
|
199
|
-
|
200
|
-
|
202
|
+
inspected = '#<Watir::Div: located: false; {:id=>"bar", :tag_name=>"div"}>'
|
203
|
+
error = Watir::Wait::TimeoutError
|
204
|
+
message = "timed out after 1 seconds, waiting for true condition on #{inspected}"
|
205
|
+
|
206
|
+
expect { browser.div(id: 'bar').wait_until_present(timeout: 1) }.to raise_error(error, message)
|
201
207
|
end
|
202
208
|
|
203
209
|
it "uses provided interval" do
|
@@ -225,7 +231,7 @@ not_compliant_on :safari do
|
|
225
231
|
expect { select_list.select('No') }.to raise_error Watir::Exception::NoValueFoundException
|
226
232
|
expect(::Time.now - start_time).to be > 1
|
227
233
|
ensure
|
228
|
-
Watir.default_timeout =
|
234
|
+
Watir.default_timeout = 30
|
229
235
|
end
|
230
236
|
end
|
231
237
|
end
|
@@ -237,8 +243,10 @@ not_compliant_on :safari do
|
|
237
243
|
end
|
238
244
|
|
239
245
|
it "times out if the element doesn't disappear" do
|
240
|
-
|
241
|
-
|
246
|
+
error = Watir::Wait::TimeoutError
|
247
|
+
inspected = '#<Watir::Div: located: false; {:id=>"foo", :tag_name=>"div"}>'
|
248
|
+
message = "timed out after 1 seconds, waiting for false condition on #{inspected}"
|
249
|
+
expect { browser.div(id: 'foo').wait_while_present(timeout: 1) }.to raise_error(error, message)
|
242
250
|
end
|
243
251
|
|
244
252
|
it "uses provided interval" do
|
@@ -267,6 +275,17 @@ not_compliant_on :safari do
|
|
267
275
|
expect { element.wait_while_present(timeout: 1) }.to_not raise_exception
|
268
276
|
end
|
269
277
|
|
278
|
+
it "waits until the selector no longer matches" do
|
279
|
+
Watir.default_timeout = 1
|
280
|
+
element = browser.link(name: 'add_select').wait_until(&:exists?)
|
281
|
+
begin
|
282
|
+
start_time = ::Time.now
|
283
|
+
browser.link(id: 'change_select').click
|
284
|
+
expect { element.wait_while_present }.not_to raise_error
|
285
|
+
ensure
|
286
|
+
Watir.default_timeout = 30
|
287
|
+
end
|
288
|
+
end
|
270
289
|
end
|
271
290
|
|
272
291
|
describe "#wait_until" do
|
data/support/doctest_helper.rb
CHANGED
@@ -74,9 +74,4 @@ YARD::Doctest.configure do |doctest|
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
if ENV['TRAVIS']
|
78
|
-
ENV['DISPLAY'] = ':99.0'
|
79
|
-
|
80
|
-
Selenium::WebDriver::Chrome.path = File.expand_path 'chrome-linux/chrome'
|
81
|
-
Selenium::WebDriver::Chrome.driver_path = File.expand_path 'chrome-linux/chromedriver'
|
82
|
-
end
|
77
|
+
ENV['DISPLAY'] = ':99.0' if ENV['TRAVIS']
|
data/support/travis.sh
CHANGED
@@ -11,20 +11,12 @@ if [[ "$RAKE_TASK" = "yard:doctest" ]]; then
|
|
11
11
|
fi
|
12
12
|
|
13
13
|
if [[ "$RAKE_TASK" = "spec:chrome" ]] || [[ "$RAKE_TASK" = "yard:doctest" ]]; then
|
14
|
-
# https://omahaproxy.appspot.com
|
15
|
-
# https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/
|
16
|
-
# CHROME_REVISION=`curl -s http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/LAST_CHANGE`
|
17
|
-
CHROME_REVISION=417841
|
18
|
-
|
19
|
-
curl -L -O "http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/${CHROME_REVISION}/chrome-linux.zip"
|
20
|
-
unzip chrome-linux.zip
|
21
|
-
|
22
14
|
CHROMEDRIVER_VERSION=$(curl -s http://chromedriver.storage.googleapis.com/LATEST_RELEASE)
|
23
15
|
curl -L -O "http://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip"
|
24
16
|
unzip chromedriver_linux64.zip
|
25
17
|
|
26
|
-
mv chromedriver
|
27
|
-
chmod +x
|
18
|
+
mv chromedriver travis-drivers/chromedriver
|
19
|
+
chmod +x travis-drivers/chromedriver
|
28
20
|
fi
|
29
21
|
|
30
22
|
if [[ "$RAKE_TASK" = "spec:firefox" ]]; then
|
data/watir.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Rodionov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-02-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: selenium-webdriver
|
@@ -186,6 +186,7 @@ files:
|
|
186
186
|
- appveyor.yml
|
187
187
|
- lib/watir-webdriver.rb
|
188
188
|
- lib/watir.rb
|
189
|
+
- lib/watir/adjacent.rb
|
189
190
|
- lib/watir/after_hooks.rb
|
190
191
|
- lib/watir/alert.rb
|
191
192
|
- lib/watir/aliases.rb
|
@@ -194,7 +195,6 @@ files:
|
|
194
195
|
- lib/watir/atoms/fireEvent.js
|
195
196
|
- lib/watir/atoms/getInnerHtml.js
|
196
197
|
- lib/watir/atoms/getOuterHtml.js
|
197
|
-
- lib/watir/atoms/getParentElement.js
|
198
198
|
- lib/watir/atoms/selectText.js
|
199
199
|
- lib/watir/attribute_helper.rb
|
200
200
|
- lib/watir/browser.rb
|
@@ -291,6 +291,7 @@ files:
|
|
291
291
|
- spec/locator_spec_helper.rb
|
292
292
|
- spec/spec_helper.rb
|
293
293
|
- spec/special_chars_spec.rb
|
294
|
+
- spec/watirspec/adjacent_spec.rb
|
294
295
|
- spec/watirspec/after_hooks_spec.rb
|
295
296
|
- spec/watirspec/alert_spec.rb
|
296
297
|
- spec/watirspec/browser_spec.rb
|
@@ -417,6 +418,7 @@ files:
|
|
417
418
|
- spec/watirspec/html/keylogger.html
|
418
419
|
- spec/watirspec/html/modal_dialog.html
|
419
420
|
- spec/watirspec/html/multiple_ids.html
|
421
|
+
- spec/watirspec/html/nested_elements.html
|
420
422
|
- spec/watirspec/html/nested_frame_1.html
|
421
423
|
- spec/watirspec/html/nested_frame_2.html
|
422
424
|
- spec/watirspec/html/nested_frame_3.html
|
@@ -480,6 +482,7 @@ test_files:
|
|
480
482
|
- spec/locator_spec_helper.rb
|
481
483
|
- spec/spec_helper.rb
|
482
484
|
- spec/special_chars_spec.rb
|
485
|
+
- spec/watirspec/adjacent_spec.rb
|
483
486
|
- spec/watirspec/after_hooks_spec.rb
|
484
487
|
- spec/watirspec/alert_spec.rb
|
485
488
|
- spec/watirspec/browser_spec.rb
|
@@ -606,6 +609,7 @@ test_files:
|
|
606
609
|
- spec/watirspec/html/keylogger.html
|
607
610
|
- spec/watirspec/html/modal_dialog.html
|
608
611
|
- spec/watirspec/html/multiple_ids.html
|
612
|
+
- spec/watirspec/html/nested_elements.html
|
609
613
|
- spec/watirspec/html/nested_frame_1.html
|
610
614
|
- spec/watirspec/html/nested_frame_2.html
|
611
615
|
- spec/watirspec/html/nested_frame_3.html
|
@@ -1,17 +0,0 @@
|
|
1
|
-
// Copyright 2011 Software Freedom Conservatory
|
2
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
-
// you may not use this file except in compliance with the License.
|
4
|
-
// You may obtain a copy of the License at
|
5
|
-
//
|
6
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
7
|
-
//
|
8
|
-
// Unless required by applicable law or agreed to in writing, software
|
9
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
-
// See the License for the specific language governing permissions and
|
12
|
-
// limitations under the License.
|
13
|
-
|
14
|
-
function(){return function(){var d=this;function e(a,b){function c(){}c.prototype=b.prototype;a.g=b.prototype;a.prototype=new c};function g(a){for(var b=1;b<arguments.length;b++)var c=String(arguments[b]).replace(/\$/g,"$$$$"),a=a.replace(/\%s/,c);return a}function h(a,b){if(a<b)return-1;else if(a>b)return 1;return 0};var i,l,m,n;function o(){return d.navigator?d.navigator.userAgent:null}n=m=l=i=!1;var p;if(p=o()){var q=d.navigator;i=p.indexOf("Opera")==0;l=!i&&p.indexOf("MSIE")!=-1;m=!i&&p.indexOf("WebKit")!=-1;n=!i&&!m&&q.product=="Gecko"}var r=l,s=n,v=m,w;
|
15
|
-
a:{var x="",y;if(i&&d.opera)var z=d.opera.version,x=typeof z=="function"?z():z;else if(s?y=/rv\:([^\);]+)(\)|;)/:r?y=/MSIE\s+([^\);]+)(\)|;)/:v&&(y=/WebKit\/(\S+)/),y)var A=y.exec(o()),x=A?A[1]:"";if(r){var B,C=d.document;B=C?C.documentMode:void 0;if(B>parseFloat(x)){w=String(B);break a}}w=x}var D={};
|
16
|
-
function E(a){var b;if(!(b=D[a])){b=0;for(var c=String(w).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),f=String(a).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),t=Math.max(c.length,f.length),u=0;b==0&&u<t;u++){var L=c[u]||"",M=f[u]||"",N=RegExp("(\\d*)(\\D*)","g"),O=RegExp("(\\d*)(\\D*)","g");do{var j=N.exec(L)||["","",""],k=O.exec(M)||["","",""];if(j[0].length==0&&k[0].length==0)break;b=h(j[1].length==0?0:parseInt(j[1],10),k[1].length==0?0:parseInt(k[1],10))||h(j[2].length==0,k[2].length==0)||
|
17
|
-
h(j[2],k[2])}while(b==0)}b=D[a]=b>=0}return b};function F(a){this.stack=Error().stack||"";if(a)this.message=String(a)}e(F,Error);e(function(a,b){b.unshift(a);F.call(this,g.apply(null,b));b.shift();this.f=a},F);!r||E("9");!s&&!r||r&&E("9")||s&&E("1.9.1");r&&E("9");function G(a,b,c,f,t){this.b=!!b;if(a&&(this.a=a))this.c=typeof f=="number"?f:this.a.nodeType!=1?0:this.b?-1:1;this.d=t!=void 0?t:this.c||0;this.b&&(this.d*=-1);this.e=!c}e(G,function(){});G.prototype.a=null;G.prototype.c=0;e(function(a,b,c,f){G.call(this,a,b,c,null,f)},G);function H(a){for(a=a.parentNode;a&&a.nodeType!=1&&a.nodeType!=9&&a.nodeType!=11;)a=a.parentNode;return a&&a.nodeType==1?a:null}var I="_".split("."),J=d;!(I[0]in J)&&J.execScript&&J.execScript("var "+I[0]);for(var K;I.length&&(K=I.shift());)!I.length&&H!==void 0?J[K]=H:J=J[K]?J[K]:J[K]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
|