watir-dom-wait 0.2.1 → 0.3.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 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