watir-dom-wait 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/lib/watir/dom/elements/element.rb +10 -2
- data/lib/watir/dom/extensions/js/waitForDom.js +10 -9
- data/lib/watir/dom/wait/version.rb +1 -1
- data/lib/watir-dom-wait.rb +1 -0
- data/spec/watir-dom-wait/element_spec.rb +16 -15
- metadata +5 -4
data/README.md
CHANGED
@@ -80,7 +80,7 @@ Watir::Dom::Wait.interval = 0.15
|
|
80
80
|
|
81
81
|
By attaching `DOMSubtreeModified` event to element. It's supported in all major browsers (except Presto-powered Opera).
|
82
82
|
|
83
|
-
Note, that it also rescues `Selenium::WebDriver::Error::StaleElementReferenceError` when waits for DOM.
|
83
|
+
Note, that it also rescues `Selenium::WebDriver::Error::StaleElementReferenceError` and `Selenium::WebDriver::Error::JavascriptError` when waits for DOM.
|
84
84
|
|
85
85
|
## Contributors
|
86
86
|
|
@@ -42,8 +42,16 @@ module Watir
|
|
42
42
|
WhenDOMChangedDecorator.new(self, opts, message)
|
43
43
|
end
|
44
44
|
|
45
|
-
rescue Selenium::WebDriver::Error::StaleElementReferenceError
|
46
|
-
|
45
|
+
rescue Selenium::WebDriver::Error::StaleElementReferenceError, Selenium::WebDriver::Error::JavascriptError
|
46
|
+
# StaleElementReferenceError
|
47
|
+
# element can become stale, so we just retry DOM waiting
|
48
|
+
#
|
49
|
+
# JavascriptError
|
50
|
+
# in rare cases, args passed to execute script are not correct, for example:
|
51
|
+
# correct: [#<Watir::Body:0x6bb2ccb9de06cb92 located=false selector={:element=>(webdriver element)}>, 300, 3000] [el, interval, delay]
|
52
|
+
# incorrect: [0.3, 3000, nil] [interval, delay, ?]
|
53
|
+
# TODO there might be some logic (bug?) in Selenium which does this
|
54
|
+
retry
|
47
55
|
end
|
48
56
|
|
49
57
|
#
|
@@ -56,19 +56,21 @@ function Watir(options) {
|
|
56
56
|
this.set(options);
|
57
57
|
|
58
58
|
this.startedModifying = false;
|
59
|
-
this.domReady
|
59
|
+
this.domReady = 1;
|
60
60
|
|
61
61
|
this.bindDOMEvents();
|
62
62
|
this.exitOnTimeout();
|
63
63
|
};
|
64
64
|
|
65
65
|
Watir.prototype.set = function (options) {
|
66
|
-
if (options == null)
|
66
|
+
if (options == null) {
|
67
|
+
options = {};
|
68
|
+
}
|
67
69
|
|
68
|
-
this.el
|
69
|
-
this.event
|
70
|
+
this.el = options.el;
|
71
|
+
this.event = options.event || 'DOMSubtreeModified';
|
70
72
|
this.interval = options.interval;
|
71
|
-
this.delay
|
73
|
+
this.delay = options.delay;
|
72
74
|
|
73
75
|
this.forceReady = this.wrappedForceReady();
|
74
76
|
this.startModifying = this.wrappedStartModifying();
|
@@ -120,7 +122,6 @@ Watir.prototype.addEventListener = (function() {
|
|
120
122
|
return function (fn) {
|
121
123
|
this.el.addEventListener(this.event, fn, false);
|
122
124
|
};
|
123
|
-
|
124
125
|
} else {
|
125
126
|
return function (fn) {
|
126
127
|
this.el.attachEvent('on' + this.event, fn)
|
@@ -133,7 +134,6 @@ Watir.prototype.removeEventListener = (function() {
|
|
133
134
|
return function (fn) {
|
134
135
|
this.el.removeEventListener(this.event, fn, false);
|
135
136
|
};
|
136
|
-
|
137
137
|
} else {
|
138
138
|
return function (fn) {
|
139
139
|
this.el.detachEvent('on' + this.event, fn)
|
@@ -142,7 +142,8 @@ Watir.prototype.removeEventListener = (function() {
|
|
142
142
|
})();
|
143
143
|
|
144
144
|
window.watir = new Watir({
|
145
|
-
el:
|
145
|
+
el: arguments[0],
|
146
146
|
interval: arguments[1] * 1000,
|
147
|
-
delay:
|
147
|
+
delay: arguments[2] * 1000,
|
148
148
|
});
|
149
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'watir/dom/wait'
|
@@ -6,24 +6,24 @@ describe Watir::Element do
|
|
6
6
|
context "when block is not given" do
|
7
7
|
it "waits using event handler" do
|
8
8
|
@browser.button(:id => "quick").click
|
9
|
-
@browser.div.when_dom_changed.
|
9
|
+
expect(@browser.div.when_dom_changed).to have(20).spans
|
10
10
|
end
|
11
11
|
|
12
12
|
it "may be run more than one time" do
|
13
13
|
3.times do |i|
|
14
14
|
@browser.button(:id => "quick").click
|
15
|
-
@browser.div.when_dom_changed.
|
15
|
+
expect(@browser.div.when_dom_changed).to have(20 * (i + 1)).spans
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
it "waits using custom interval" do
|
20
20
|
@browser.button(:id => "long").click
|
21
|
-
@browser.div.when_dom_changed(:interval => 1.1).
|
21
|
+
expect(@browser.div.when_dom_changed(:interval => 1.1)).to have(5).spans
|
22
22
|
end
|
23
23
|
|
24
24
|
it "raises timeout error" do
|
25
25
|
@browser.button(:id => "quick").click
|
26
|
-
|
26
|
+
expect { @browser.div.when_dom_changed(:timeout => 2).spans }.to raise_error(Watir::Wait::TimeoutError)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -31,36 +31,37 @@ describe Watir::Element do
|
|
31
31
|
it "waits using event handler" do
|
32
32
|
@browser.button(:id => "quick").click
|
33
33
|
@browser.div.when_dom_changed do |div|
|
34
|
-
div.
|
34
|
+
expect(div).to have(20).spans
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
it "waits using custom interval" do
|
39
39
|
@browser.button(:id => "long").click
|
40
40
|
@browser.div.when_dom_changed(:interval => 1.1) do |div|
|
41
|
-
div.
|
41
|
+
expect(div).to have(5).spans
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
it "raises timeout error" do
|
46
46
|
@browser.button(:id => "quick").click
|
47
|
-
|
47
|
+
expect {
|
48
48
|
@browser.div.when_dom_changed(:timeout => 2) { |div| div.spans }
|
49
|
-
|
49
|
+
}.to raise_error(Watir::Wait::TimeoutError)
|
50
50
|
end
|
51
51
|
|
52
52
|
it "returns block evaluation" do
|
53
53
|
@browser.button(:id => "quick").click
|
54
|
-
@browser.div.when_dom_changed do |div|
|
54
|
+
size = @browser.div.when_dom_changed do |div|
|
55
55
|
div.spans.size
|
56
|
-
end
|
56
|
+
end
|
57
|
+
expect(size).to eq(20)
|
57
58
|
end
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
61
62
|
context "when DOM is not changed" do
|
62
63
|
it "doesn't raise any exception" do
|
63
|
-
@browser.div.when_dom_changed.
|
64
|
+
expect(@browser.div.when_dom_changed).to have(0).spans
|
64
65
|
end
|
65
66
|
end
|
66
67
|
|
@@ -77,9 +78,9 @@ describe Watir::Element do
|
|
77
78
|
div = @browser.div(:id => 'container2')
|
78
79
|
div.exists?
|
79
80
|
@browser.refresh
|
80
|
-
|
81
|
+
expect {
|
81
82
|
div.when_dom_changed.text
|
82
|
-
|
83
|
+
}.not_to raise_error(Selenium::WebDriver::Error::StaleElementReferenceError)
|
83
84
|
end
|
84
85
|
end
|
85
86
|
end
|
@@ -88,12 +89,12 @@ describe Watir::Element do
|
|
88
89
|
it "calls #when_dom_changed" do
|
89
90
|
div = @browser.div
|
90
91
|
opts = { timeout: 1, interval: 2, delay: 3 }
|
91
|
-
div.
|
92
|
+
expect(div).to receive(:when_dom_changed).with(opts)
|
92
93
|
div.wait_until_dom_changed(opts)
|
93
94
|
end
|
94
95
|
|
95
96
|
it "returns nil" do
|
96
|
-
@browser.div.wait_until_dom_changed.
|
97
|
+
expect(@browser.div.wait_until_dom_changed).to eq(nil)
|
97
98
|
end
|
98
99
|
end
|
99
100
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watir-dom-wait
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: watir-webdriver
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- LICENSE.txt
|
89
89
|
- README.md
|
90
90
|
- Rakefile
|
91
|
+
- lib/watir-dom-wait.rb
|
91
92
|
- lib/watir/dom/elements/element.rb
|
92
93
|
- lib/watir/dom/extensions/js/waitForDom.js
|
93
94
|
- lib/watir/dom/wait.rb
|
@@ -111,7 +112,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
112
|
version: '0'
|
112
113
|
segments:
|
113
114
|
- 0
|
114
|
-
hash:
|
115
|
+
hash: -357748089059915628
|
115
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
117
|
none: false
|
117
118
|
requirements:
|
@@ -120,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
121
|
version: '0'
|
121
122
|
segments:
|
122
123
|
- 0
|
123
|
-
hash:
|
124
|
+
hash: -357748089059915628
|
124
125
|
requirements: []
|
125
126
|
rubyforge_project:
|
126
127
|
rubygems_version: 1.8.23
|