watir-dom-wait 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec015b0da5094d2d636dc167932acb2639d65554
4
- data.tar.gz: 9fed0593eec77385cecc7331fdcc14b33d22dc7b
3
+ metadata.gz: 93e9ba59672d1b85a9b7068e6423683c6dc32046
4
+ data.tar.gz: dfb2a55dec1e3cec71669f0d4ed201109c6833d5
5
5
  SHA512:
6
- metadata.gz: 2d1289a416ecab865fd4d6c237e74dc9a8aed91641529b326ad02a6ba4345475d6ae7c85ad3f7bedaea5a102a480131bdd3c22e69cc95844104cc1d9dc5e5771
7
- data.tar.gz: b716cb205b6efb46839ca38b6cf1aea3ff9f9c5c4af4570dcbe7f909de16908f4a3105e9c6d24700e3e039e30b7c49576dcca460019dd0f2dc5d7fd9ef2f6815
6
+ metadata.gz: 739f87a17b60dfcb303041633cb35fd91a25761942990dfe4d107cbd2147d25d382d39460d0519fa3f7276604603761aa2c0a9824983dfd1a61a857670bdf891
7
+ data.tar.gz: 47edb3d7bee52504afd61a4501d37bd9410f2ff61ca2933899029e6d88ccf78e90fe28325996f0ff676bdc5c2f51537b6daaf8ce0c17baf27254aebb451a4149
@@ -1,6 +1,8 @@
1
+ sudo: false
1
2
  rvm:
2
- - 1.9.3
3
- - 2.0.0
3
+ - 2.3.0
4
4
  before_install:
5
- - "export DISPLAY=:99.0"
6
- - "sh -e /etc/init.d/xvfb start"
5
+ - export DISPLAY=:99.0
6
+ - sh -e /etc/init.d/xvfb start
7
+ - spec/support/travis.sh
8
+ - export PATH="$(pwd)/bin:$PATH"
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Alex Rodionov
1
+ Copyright (c) 2016 Alex Rodionov
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # watir-dom-wait [![Build Status](https://travis-ci.org/p0deje/watir-dom-wait.png?branch=master)](https://travis-ci.org/p0deje/watir-dom-wait) [![Gem Version](https://badge.fury.io/rb/watir-dom-wait.png)](http://badge.fury.io/rb/watir-dom-wait)
1
+ # watir-dom-wait [![Build Status](https://travis-ci.org/p0deje/watir-dom-wait.svg?branch=master)](https://travis-ci.org/p0deje/watir-dom-wait) [![Gem Version](https://badge.fury.io/rb/watir-dom-wait.svg)](http://badge.fury.io/rb/watir-dom-wait)
2
2
 
3
- Watir extension which provides DOM-based waiting.
3
+ [Watir](https://github.com/watir/watir) extension which provides with method to check for DOM changes.
4
4
 
5
5
  ## Installation
6
6
 
@@ -30,58 +30,33 @@ Require to monkey patch `Watir::Element` instance:
30
30
  require 'watir-dom-wait'
31
31
  ```
32
32
 
33
- Simple DOM waiting:
33
+ There is only one method added:
34
34
 
35
35
  ```ruby
36
- browser.div(class: 'test').wait_until_dom_changed
36
+ browser.div(class: 'test').dom_changed?
37
37
  ```
38
38
 
39
- With element returned:
39
+ which returns `true` if DOM is changed inside element or `false`
40
+ if DOM is currently changing.
40
41
 
41
- ```ruby
42
- browser.div(class: 'test').when_dom_changed.a(class: 'link').click
43
- ```
44
-
45
- With passing block:
46
-
47
- ```ruby
48
- browser.div(class: 'test').when_dom_changed do |div|
49
- div.a(class: 'link').click
50
- end
51
- ```
52
-
53
- With timeout of 10 seconds:
54
-
55
- ```ruby
56
- browser.div(class: 'test').when_dom_changed(timeout: 10).a(class: 'link').click
57
- ```
58
-
59
- With interval of checking for subtree modifications of 2 seconds:
60
-
61
- ```ruby
62
- browser.div(class: 'test').when_dom_changed(interval: 2).a(class: 'link').click
63
- ```
64
-
65
- With 5 seconds delay of how long to waiting for DOM to start modifying:
42
+ Default delay of waiting until DOM starts changing is `1.1` seconds, but
43
+ can be changed:
66
44
 
67
45
  ```ruby
68
- browser.div(class: 'test').when_dom_changed(delay: 5).a(class: 'link').click
46
+ browser.div(class: 'test').dom_changed?(delay: 2.5)
69
47
  ```
70
48
 
71
- Timeouts can also be specified statically:
49
+ You probably don't want to use the method directly. Instead, you can combine
50
+ usage of the method with built-in Watir waiting mechanism:
72
51
 
73
52
  ```ruby
74
- Watir::Dom::Wait.timeout = 1
75
- Watir::Dom::Wait.delay = 1
76
- Watir::Dom::Wait.interval = 0.15
53
+ browser.div(class: 'test').wait_until(&:dom_changed?)
77
54
  ```
78
55
 
79
56
  ## How it works
80
57
 
81
58
  Using [MutationObserver](https://developer.mozilla.org/en/docs/Web/API/MutationObserver).
82
59
 
83
- Note, that it also rescues `Selenium::WebDriver::Error::StaleElementReferenceError`, `Selenium::WebDriver::Error::JavascriptError` and `Watir::Exception::UnknownObjectException` (only when its message contains `Element not found in the cache - perhaps the page has changed since it was looked up`) when waits for DOM.
84
-
85
60
  ## Contributors
86
61
 
87
62
  * [Alex Rodionov](https://github.com/p0deje)
@@ -1 +1,2 @@
1
- require 'watir/dom/wait'
1
+ require 'watir'
2
+ require 'watir/dom/elements/element'
@@ -1,60 +1,28 @@
1
1
  module Watir
2
2
  class Element
3
+ DOM_WAIT_JS = File.read("#{File.dirname(__FILE__)}/../extensions/js/waitForDom.js").freeze
3
4
 
4
5
  #
5
- # Waits until DOM is changed within the element and returns/yields self.
6
+ # Returns true if DOM is changed within the element.
6
7
  #
7
- # @example With self returned
8
- # browser.div(id: 'test').when_dom_changed.a(id: 'link').click
8
+ # @example Wait until DOM is changed inside element with default delay
9
+ # browser.div(id: 'test').wait_until(&:dom_changed?).click
9
10
  #
10
- # @example With passing block
11
- # browser.div(id: 'test').when_dom_changed do |div|
12
- # div.a(id: 'link').click
11
+ # @example Wait until DOM is changed inside element with default delay
12
+ # browser.div(id: 'test').wait_until do |element|
13
+ # element.dom_changed?(delay: 5)
13
14
  # end
14
15
  #
15
- # @example With timeout of 10 seconds
16
- # browser.div(id: 'test').when_dom_changed(timeout: 10).a(id: 'link').click
17
- #
18
- # @example With interval of checking for subtree modifications of 2 seconds
19
- # browser.div(id: 'test').when_dom_changed(interval: 2).a(id: 'link').click
20
- #
21
- # @example With 5 seconds delay of how long to waiting for DOM to start modifying
22
- # browser.div(id: 'test').when_dom_changed(delay: 5).a(id: 'link').click
23
- #
24
- # @param [Hash] opts
25
- # @option opts [Float] interval How long to wait between DOM nodes adding/removing in seconds. Defaults to 0.5
26
- # @option opts [Float] delay How long to wait for DOM modifications to start
27
- # @option opts [Fixnum] timeout seconds to wait before timing out
16
+ # @param delay [Integer, Float] how long to wait for DOM modifications to start
28
17
  #
29
18
 
30
- def when_dom_changed(opts = {})
31
- message = "waiting for DOM subtree to finish modifying in #{selector_string}"
32
- opts[:interval] ||= Dom::Wait.interval
33
- opts[:delay] ||= Dom::Wait.delay
34
- opts[:timeout] ||= Dom::Wait.timeout
35
-
36
- if block_given?
37
- Dom::Wait.wait_for_dom(self, opts, message)
38
- yield self
39
- else
40
- WhenDOMChangedDecorator.new(self, opts, message)
41
- end
19
+ def dom_changed?(delay: 1.1)
20
+ driver.manage.timeouts.script_timeout = delay + 1
21
+ driver.execute_async_script(DOM_WAIT_JS, wd, delay)
22
+ ensure
23
+ # TODO: make sure we rollback to user-defined timeout
24
+ # blocked by https://code.google.com/p/selenium/issues/detail?id=6608
25
+ driver.manage.timeouts.script_timeout = 1
42
26
  end
43
-
44
- #
45
- # Waits until DOM is changed within the element.
46
- #
47
- # @param [Hash] opts
48
- # @option opts [Float] interval How long to wait between DOM nodes adding/removing in seconds. Defaults to 0.5
49
- # @option opts [Float] delay How long to wait for DOM modifications to start
50
- # @option opts [Fixnum] timeout seconds to wait before timing out
51
- #
52
-
53
- def wait_until_dom_changed(opts = {})
54
- when_dom_changed(opts) do
55
- # just trigger waiting
56
- end
57
- end
58
-
59
27
  end # Element
60
28
  end # Watir
@@ -1,92 +1,33 @@
1
- // arguments from WebDriver
2
- var element = arguments[0];
3
- var interval = arguments[1] * 1000;
4
- var delay = arguments[2] * 1000;
5
- var timeout = arguments[3] * 1000;
6
- var exit = arguments[4];
7
-
8
- // flag that DOM has started modifying
9
- var startedModifying = false;
10
-
11
- // exits codes
12
- var exits = {
13
- modified: 0, // DOM modifications have started and successfully finished
14
- timeout: 1, // DOM modifications have started but exceeded timeout
15
- noop: 2, // DOM modifications have not started
16
- }
17
-
18
- /**
19
- * Copy-paste of Underscore.js debounce function.
20
- * @see http://underscorejs.org/docs/underscore.html#section-67
21
- */
22
- var _debounce = function(func, wait, immediate) {
23
- var timeout, args, context, timestamp, result;
24
- return function() {
25
- context = this;
26
- args = arguments;
27
- timestamp = new Date();
28
- var later = function() {
29
- var last = (new Date()) - timestamp;
30
- if (last < wait) {
31
- timeout = setTimeout(later, wait - last);
32
- } else {
33
- timeout = null;
34
- if (!immediate) result = func.apply(context, args);
35
- }
36
- };
37
- var callNow = immediate && !timeout;
38
- if (!timeout) {
39
- timeout = setTimeout(later, wait);
40
- }
41
- if (callNow) result = func.apply(context, args);
42
- return result;
43
- };
44
- };
45
-
46
1
  /**
47
- * Disconnects observer and
48
- * invokes WebDriver's callback function
49
- * to show that DOM has finished modifying.
2
+ * Disconnects observer and invokes WebDriver's callback function
3
+ * to show that DOM has started modifying.
50
4
  */
51
- var exitOnModified = _debounce(function() {
52
- clearTimeout(exitTimeout);
5
+ var exitOnStartedModifying = function() {
6
+ clearTimeout(exitOnNotStartedModifying);
53
7
  observer.disconnect();
54
- exit(exits.modified);
55
- }, interval);
8
+ callback(false);
9
+ }
56
10
 
57
11
  /**
58
- * Disconnects observer and
59
- * invokes WebDriver's callback function
60
- * to show that DOM has started modifying
61
- * but exceeded timeout.
12
+ * Disconnects observer and invokes WebDriver's callback function
13
+ * to show that DOM has not started modifying.
62
14
  */
63
- var exitOnTimeout = function() {
15
+ var exitOnNotStartedModifying = function() {
64
16
  return setTimeout(function() {
65
17
  observer.disconnect();
66
- exit(exits.timeout);
67
- }, timeout);
18
+ callback(true);
19
+ }, 1000);
68
20
  }
69
21
 
70
- /**
71
- * Disconnects observer and
72
- * invokes WebDriver's callback function
73
- * to show that DOM has not started modifying.
74
- */
75
- var exitNoop = function() {
76
- setTimeout(function() {
77
- if (!startedModifying) {
78
- clearTimeout(exitTimeout);
79
- observer.disconnect();
80
- exit(exits.noop);
81
- }
82
- }, delay);
83
- }
22
+ // arguments from WebDriver
23
+ var element = arguments[0];
24
+ var delay = arguments[1] * 1000;
25
+ var callback = arguments[2];
84
26
 
85
- var observer = new MutationObserver(function() {
86
- if (!startedModifying) startedModifying = true;
87
- exitOnModified();
88
- });
27
+ // start observer
28
+ var observer = new MutationObserver(exitOnStartedModifying);
89
29
  var config = { attributes: true, childList: true, characterData: true, subtree: true };
90
30
  observer.observe(element, config);
91
- var exitTimeout = exitOnTimeout();
92
- exitNoop();
31
+
32
+ // make sure we exit if DOM has not started modifying
33
+ var exitOnNotStartedModifying = exitOnNotStartedModifying();
@@ -1,10 +1,16 @@
1
- require "watir/dom/wait"
1
+ require "pry"
2
+ require "watir-dom-wait"
2
3
 
3
4
  RSpec.configure do |spec|
4
5
  spec.filter_run_excluding bug: /\d+/
5
6
 
6
7
  spec.before(:all) do
7
- @browser = Watir::Browser.new
8
+ opts = {}
9
+ if ENV['TRAVIS']
10
+ Selenium::WebDriver::Chrome.path = "#{File.dirname(__FILE__)}/../bin/google-chrome"
11
+ opts[:args] = ['no-sandbox']
12
+ end
13
+ @browser = Watir::Browser.new(:chrome, opts)
8
14
  @browser.goto "data:text/html,#{File.read('spec/support/html/wait_for_dom.html')}"
9
15
  end
10
16
 
@@ -12,7 +18,8 @@ RSpec.configure do |spec|
12
18
  @browser.quit
13
19
  end
14
20
 
15
- spec.after(:each) do
21
+ spec.after(:each) do |example|
22
+ binding.pry if example.exception && ENV['DEBUG']
16
23
  @browser.refresh
17
24
  end
18
25
  end
@@ -14,7 +14,7 @@
14
14
 
15
15
  setTimeout(function() {
16
16
  clearInterval(timer);
17
- }, number * timeout);
17
+ }, number * timeout + 10);
18
18
  }
19
19
 
20
20
  function staleDiv(parent_id, child_id) {
@@ -0,0 +1,14 @@
1
+ #!/bin/bash -ex
2
+
3
+ mkdir bin/
4
+
5
+ # https://omahaproxy.appspot.com
6
+ # https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/
7
+ CHROME_REVISION=386257
8
+ curl -L -O "http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/${CHROME_REVISION}/chrome-linux.zip"
9
+ unzip chrome-linux.zip
10
+ ln -s "$(pwd)/chrome-linux/chrome" "$(pwd)/bin/google-chrome"
11
+
12
+ curl -L -O "http://chromedriver.storage.googleapis.com/2.21/chromedriver_linux64.zip"
13
+ unzip chromedriver_linux64.zip
14
+ ln -s "$(pwd)/chromedriver" "$(pwd)/bin/chromedriver"
@@ -5,112 +5,58 @@ describe Watir::Element do
5
5
  context "when DOM is changed" do
6
6
  context "when block is not given" do
7
7
  it "waits using mutation observer" do
8
- @browser.button(:id => "quick").click
9
- expect(@browser.div.when_dom_changed).to have(20).spans
8
+ @browser.button(id: "quick").click
9
+ expect(@browser.div.wait_until(&:dom_changed?).spans.count).to eq(20)
10
10
  end
11
11
 
12
12
  it "waits using custom interval" do
13
- @browser.button(:id => "long").click
14
- expect(@browser.div.when_dom_changed(:interval => 1.1)).to have(5).spans
13
+ @browser.button(id: "long").click
14
+ expect(@browser.div.wait_until(&:dom_changed?).spans.count).to eq(5)
15
15
  end
16
16
 
17
17
  it "raises timeout error" do
18
- @browser.button(:id => "quick").click
19
- expect { @browser.div.when_dom_changed(:timeout => 2).spans }.to raise_error(Watir::Wait::TimeoutError)
18
+ @browser.button(id: "quick").click
19
+ expect { @browser.div.wait_until(timeout: 1, &:dom_changed?) }.to raise_error(Watir::Wait::TimeoutError)
20
20
  end
21
21
 
22
22
  context "when run more than one time" do
23
23
  it "waits for DOM consecutively" do
24
24
  3.times do |i|
25
25
  sleep 1
26
- @browser.button(:id => "quick").click
27
- expect(@browser.div.when_dom_changed(:timeout => 5, :delay => 2)).to have(20 * (i + 1)).spans
26
+ @browser.button(id: "quick").click
27
+ expect(@browser.div.wait_until(&:dom_changed?).spans.count).to eq(20 * (i + 1))
28
28
  end
29
29
  end
30
30
  end
31
31
  end
32
-
33
- context "when block given" do
34
- it "waits using mutation observer" do
35
- @browser.button(:id => "quick").click
36
- @browser.div.when_dom_changed do |div|
37
- expect(div).to have(20).spans
38
- end
39
- end
40
-
41
- it "waits using custom interval" do
42
- @browser.button(:id => "long").click
43
- @browser.div.when_dom_changed(:interval => 1.1) do |div|
44
- expect(div).to have(5).spans
45
- end
46
- end
47
-
48
- it "raises timeout error" do
49
- @browser.button(:id => "quick").click
50
- expect {
51
- @browser.div.when_dom_changed(:timeout => 2) { |div| div.spans }
52
- }.to raise_error(Watir::Wait::TimeoutError)
53
- end
54
-
55
- it "returns block evaluation" do
56
- @browser.button(:id => "quick").click
57
- size = @browser.div.when_dom_changed do |div|
58
- div.spans.size
59
- end
60
- expect(size).to eq(20)
61
- end
62
- end
63
32
  end
64
33
 
65
34
  context "when DOM is not changed" do
66
35
  it "doesn't raise any exception" do
67
- expect(@browser.div.when_dom_changed).to have(0).spans
36
+ expect(@browser.div.wait_until(&:dom_changed?).spans.count).to eq(0)
68
37
  end
69
38
  end
70
39
 
71
40
  context "when effects are used" do
72
41
  it "properly handles fading" do
73
- @browser.button(:id => 'fade').click
74
- text = @browser.div(:id => 'container3').when_dom_changed.span.text
42
+ @browser.button(id: 'fade').click
43
+ text = @browser.div(id: 'container3').wait_until(&:dom_changed?).span.text
75
44
  expect(text).to eq('Faded')
76
45
  end
77
46
  end
78
47
 
79
48
  context "when element goes stale" do
80
- before(:all) do
81
- Watir.always_locate = false
82
- end
83
-
84
- after(:all) do
85
- Watir.always_locate = true
86
- end
87
-
88
49
  it "relocates element" do
89
- div = @browser.div(:id => 'container2')
90
- div.exists?
91
- @browser.refresh
92
- expect { div.when_dom_changed.text }.not_to raise_error
50
+ @browser.button(id: 'stale').click
51
+ expect { @browser.div(id: 'container2').wait_until(&:dom_changed?) }.not_to raise_error
93
52
  end
94
53
  end
95
54
 
96
55
  context "when element cannot be located" do
97
- it "relocates element" do
98
- div = @browser.div(:id => 'doesnotexist')
99
- expect { div.when_dom_changed.text }.to raise_error(Watir::Exception::UnknownObjectException)
56
+ it "raises error" do
57
+ div = @browser.div(id: 'doesnotexist')
58
+ expect { div.wait_until(&:dom_changed?) }.to raise_error(Watir::Exception::UnknownObjectException)
100
59
  end
101
60
  end
102
61
  end
103
-
104
- describe "#wait_until_dom_changed" do
105
- it "calls #when_dom_changed" do
106
- div = @browser.div
107
- opts = { timeout: 1, interval: 2, delay: 3 }
108
- expect(div).to receive(:when_dom_changed).with(opts)
109
- div.wait_until_dom_changed(opts)
110
- end
111
-
112
- it "returns nil" do
113
- expect(@browser.div.wait_until_dom_changed).to eq(nil)
114
- end
115
- end
116
62
  end
@@ -1,15 +1,14 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'watir/dom/wait/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = "watir-dom-wait"
8
- spec.version = Watir::Dom::Wait::VERSION
7
+ spec.version = "0.3.0"
9
8
  spec.authors = ["Alex Rodionov"]
10
9
  spec.email = %w(p0deje@gmail.com)
11
- spec.description = "Watir extension providing with DOM-based waiting"
12
- spec.summary = "Watir extension providing with DOM-based waiting"
10
+ spec.description = "Watir extension which provides with method to check for DOM changes."
11
+ spec.summary = "Watir extension which provides with method to check for DOM changes."
13
12
  spec.homepage = "https://github.com/p0deje/watir-dom-wait"
14
13
  spec.license = "MIT"
15
14
 
@@ -18,9 +17,10 @@ Gem::Specification.new do |spec|
18
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
18
  spec.require_paths = ["lib"]
20
19
 
21
- spec.add_dependency "watir-webdriver"
20
+ spec.add_dependency "watir", ">= 6.0"
22
21
 
23
22
  spec.add_development_dependency "bundler", "~> 1.3"
24
23
  spec.add_development_dependency "rake"
25
24
  spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "pry"
26
26
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watir-dom-wait
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Rodionov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-13 00:00:00.000000000 Z
11
+ date: 2016-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: watir-webdriver
14
+ name: watir
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '6.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '6.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +66,21 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: Watir extension providing with DOM-based waiting
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Watir extension which provides with method to check for DOM changes.
70
84
  email:
71
85
  - p0deje@gmail.com
72
86
  executables: []
@@ -80,13 +94,11 @@ files:
80
94
  - README.md
81
95
  - Rakefile
82
96
  - lib/watir-dom-wait.rb
83
- - lib/watir/dom/decorator.rb
84
97
  - lib/watir/dom/elements/element.rb
85
98
  - lib/watir/dom/extensions/js/waitForDom.js
86
- - lib/watir/dom/wait.rb
87
- - lib/watir/dom/wait/version.rb
88
99
  - spec/spec_helper.rb
89
100
  - spec/support/html/wait_for_dom.html
101
+ - spec/support/travis.sh
90
102
  - spec/watir-dom-wait/element_spec.rb
91
103
  - watir-dom-wait.gemspec
92
104
  homepage: https://github.com/p0deje/watir-dom-wait
@@ -109,11 +121,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
121
  version: '0'
110
122
  requirements: []
111
123
  rubyforge_project:
112
- rubygems_version: 2.2.0
124
+ rubygems_version: 2.4.5.1
113
125
  signing_key:
114
126
  specification_version: 4
115
- summary: Watir extension providing with DOM-based waiting
127
+ summary: Watir extension which provides with method to check for DOM changes.
116
128
  test_files:
117
129
  - spec/spec_helper.rb
118
130
  - spec/support/html/wait_for_dom.html
131
+ - spec/support/travis.sh
119
132
  - spec/watir-dom-wait/element_spec.rb
@@ -1,28 +0,0 @@
1
- module Watir
2
- #
3
- # Wraps an Element so that any subsequent method calls are
4
- # put on hold until the DOM subtree is modified within the element.
5
- #
6
- class WhenDOMChangedDecorator
7
-
8
- def initialize(element, opts, message)
9
- @element = element
10
- @opts = opts
11
- @message = message
12
- end
13
-
14
- def method_missing(m, *args, &block)
15
- unless @element.respond_to?(m)
16
- raise NoMethodError, "undefined method `#{m}' for #{@element.inspect}:#{@element.class}"
17
- end
18
-
19
- Dom::Wait.wait_for_dom(@element, @opts, @message)
20
- @element.__send__(m, *args, &block)
21
- end
22
-
23
- def respond_to?(*args)
24
- @element.respond_to?(*args)
25
- end
26
-
27
- end # WhenDOMChangedDecorator
28
- end # Watir
@@ -1,91 +0,0 @@
1
- require "watir-webdriver"
2
- require "watir/dom/wait/version"
3
- require "watir/dom/decorator"
4
- require "watir/dom/elements/element"
5
-
6
- module Watir
7
- module Dom
8
- module Wait
9
-
10
- JAVASCRIPT = File.read("#{File.dirname(__FILE__)}/extensions/js/waitForDom.js")
11
- DOM_READY = "return watir.domReady;"
12
-
13
-
14
- class << self
15
-
16
- attr_writer :interval
17
- attr_writer :delay
18
- attr_writer :timeout
19
-
20
- def interval
21
- @interval ||= 0.5
22
- end
23
-
24
- def delay
25
- @delay ||= 1
26
- end
27
-
28
- def timeout
29
- @timeout ||= 30
30
- end
31
-
32
- #
33
- # Waits until DOM is changed.
34
- # @param [Watir::Element] element
35
- # @param [Hash] opts
36
- # @option opts [Float] interval How long to wait between DOM nodes adding/removing in seconds. Defaults to 0.5
37
- # @option opts [Float] delay How long to wait for DOM modifications to start
38
- # @option opts [Fixnum] timeout seconds to wait before timing out
39
- # @api private
40
- #
41
-
42
- def wait_for_dom(element, opts, message)
43
- response = self.rescue do
44
- js = JAVASCRIPT.dup
45
- driver = element.browser.driver
46
- # TODO make sure we rollback to user-defined timeout
47
- # blocked by https://code.google.com/p/selenium/issues/detail?id=6608
48
- driver.manage.timeouts.script_timeout = opts[:timeout] + 1
49
- response = driver.execute_async_script(js, element.wd, opts[:interval], opts[:delay], opts[:timeout])
50
- driver.manage.timeouts.script_timeout = 1
51
-
52
- response
53
- end
54
- # Response statuses:
55
- # 0: DOM modifications have started and successfully finished
56
- # 1: DOM modifications have started but exceeded timeout
57
- # 2: DOM modifications have not started
58
- if response == 1
59
- message = "timed out after #{opts[:timeout]} seconds, #{message}"
60
- raise Watir::Wait::TimeoutError, message
61
- end
62
- end
63
-
64
- #
65
- # Executes block rescuing all necessary exceptions.
66
- # @param [Proc] block
67
- # @api private
68
- #
69
-
70
- def rescue(&block)
71
- block.call
72
- rescue Selenium::WebDriver::Error::StaleElementReferenceError, Exception::UnknownObjectException => error
73
- msg = 'Element not found in the cache - perhaps the page has changed since it was looked up'
74
- if error.is_a?(Exception::UnknownObjectException) && !error.message.include?(msg)
75
- raise error
76
- else
77
- # element became stale so we just retry DOM waiting
78
- retry
79
- end
80
- rescue Selenium::WebDriver::Error::JavascriptError
81
- # in rare cases, args passed to execute script are not correct, for example:
82
- # correct: [#<Selenium::WebDriver::Element:0x..fd5f048838948a830 id="{bdfa905e-b666-354c-9bf1-4dc693fd15a8}">, 300, 3000] [el, interval, timeout]
83
- # incorrect: [0.3, 3000, nil] [interval, timeout, ??]
84
- # TODO there might be some logic (bug?) in Selenium which does this
85
- retry
86
- end
87
-
88
- end # << self
89
- end # Wait
90
- end # Dom
91
- end # Watir
@@ -1,7 +0,0 @@
1
- module Watir
2
- module Dom
3
- module Wait
4
- VERSION = "0.2.1"
5
- end # Wait
6
- end # Dom
7
- end # Watir