watir 6.1.0 → 6.2.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/.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);}
|