watir_angular 0.3.0 → 0.4.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: 92861e78110e040eac6d0d6cc163a51a39b246ff
4
- data.tar.gz: 42f962e3e5e58a6b399ceaf8b7a5dfcf88a10924
3
+ metadata.gz: db2980821eced85f9586c90b94ce85f1f5c867ce
4
+ data.tar.gz: 5d3c3432cc04cc41d066f76a471445a20f7b2e1a
5
5
  SHA512:
6
- metadata.gz: 5b9c5ddf6de13251fcc8a4f8b098e5c161f6fd1e9f428da08f9cf916232d2250d48429f1386380537d72fa55654579e2b2243f32fc5e3eb2c69ad45de08efc7f
7
- data.tar.gz: e3fe8f2eb14adf70b99db6eeaeb404a9db47f95d7fa1dbb6f77533344b8ff66885b3e2dbf66f0d4ea94f23c8146b40ab513d93f03eb2960fba858d2fb20886bb
6
+ metadata.gz: 7ea3f508654b0c6d077161376151a1dcacf966240d787c0303507900952e90f1464e8c09b57320a824811f18d99e77e1b1aac852e35b3c72e7ef5e84731c7365
7
+ data.tar.gz: b3673e5b26784d379a9625d4c9346262c4fa79a588e497c80c7126da68bbfa8e05c85665828a4acb691c8de9edf798fdd3c82de50c582a1213ba65a3f133d5b9
@@ -0,0 +1,133 @@
1
+ // Code from: https://github.com/angular/protractor/blob/a62efc6e401bc1aa7408e3008ccdaa219b528636/lib/clientsidescripts.js
2
+
3
+ function(rootSelector, callback) {
4
+ try {
5
+ // Wait for both angular1 testability and angular2 testability.
6
+ var ng1Hooks = function getNg1Hooks(selector, injectorPlease) {
7
+ function tryEl(el) {
8
+ try {
9
+ if (!injectorPlease && angular.getTestability) {
10
+ var $$testability = angular.getTestability(el);
11
+ if ($$testability) {
12
+ return {$$testability: $$testability};
13
+ }
14
+ } else {
15
+ var $injector = angular.element(el).injector();
16
+ if ($injector) {
17
+ return {$injector: $injector};
18
+ }
19
+ }
20
+ } catch(err) {}
21
+ }
22
+ function trySelector(selector) {
23
+ var els = document.querySelectorAll(selector);
24
+ for (var i = 0; i < els.length; i++) {
25
+ var elHooks = tryEl(els[i]);
26
+ if (elHooks) {
27
+ return elHooks;
28
+ }
29
+ }
30
+ }
31
+
32
+ if (selector) {
33
+ return trySelector(selector);
34
+ } else if (window.__TESTABILITY__NG1_APP_ROOT_INJECTOR__) {
35
+ var $injector = window.__TESTABILITY__NG1_APP_ROOT_INJECTOR__;
36
+ var $$testability = null;
37
+ try {
38
+ $$testability = $injector.get('$$testability');
39
+ } catch (e) {}
40
+ return {$injector: $injector, $$testability: $$testability};
41
+ } else {
42
+ return tryEl(document.body) ||
43
+ trySelector('[ng-app]') || trySelector('[ng\\:app]') ||
44
+ trySelector('[ng-controller]') || trySelector('[ng\\:controller]');
45
+ }
46
+ }
47
+
48
+ var testCallback = callback;
49
+
50
+ // Wait for angular1 testability first and run waitForAngular2 as a callback
51
+ var waitForAngular1 = function(callback) {
52
+
53
+ if (window.angular) {
54
+ var hooks = ng1Hooks(rootSelector);
55
+ if (!hooks){
56
+ callback(); // not an angular1 app
57
+ }
58
+ else{
59
+ if (hooks.$$testability) {
60
+ hooks.$$testability.whenStable(callback);
61
+ } else if (hooks.$injector) {
62
+ hooks.$injector.get('$browser')
63
+ .notifyWhenNoOutstandingRequests(callback);
64
+ } else if (!!rootSelector) {
65
+ throw new Error(
66
+ 'Could not automatically find injector on page: "' +
67
+ window.location.toString() + '". Consider using config.rootEl');
68
+ } else {
69
+ throw new Error(
70
+ 'root element (' + rootSelector + ') has no injector.' +
71
+ ' this may mean it is not inside ng-app.');
72
+ }
73
+ }
74
+ }
75
+ else {callback();} // not an angular1 app
76
+ };
77
+
78
+ // Wait for Angular2 testability and then run test callback
79
+ var waitForAngular2 = function() {
80
+ if (window.getAngularTestability) {
81
+ if (rootSelector) {
82
+ var testability = null;
83
+ var el = document.querySelector(rootSelector);
84
+ try{
85
+ testability = window.getAngularTestability(el);
86
+ }
87
+ catch(e){}
88
+ if (testability) {
89
+ return testability.whenStable(function() { testCallback(); });
90
+ }
91
+ }
92
+
93
+ // Didn't specify root element or testability could not be found
94
+ // by rootSelector. This may happen in a hybrid app, which could have
95
+ // more than one root.
96
+ var testabilities = window.getAllAngularTestabilities();
97
+ var count = testabilities.length;
98
+
99
+ // No angular2 testability, this happens when
100
+ // going to a hybrid page and going back to a pure angular1 page
101
+ if (count === 0) {
102
+ return testCallback();
103
+ }
104
+
105
+ var decrement = function() {
106
+ count--;
107
+ if (count === 0) {
108
+ testCallback();
109
+ }
110
+ };
111
+ testabilities.forEach(function(testability) {
112
+ testability.whenStable(decrement);
113
+ });
114
+
115
+ }
116
+ else {testCallback();} // not an angular2 app
117
+ };
118
+
119
+ if (!(window.angular) && !(window.getAngularTestability)) {
120
+ // no testability hook
121
+ throw new Error(
122
+ 'both angularJS testability and angular testability are undefined.' +
123
+ ' This could be either ' +
124
+ 'because this is a non-angular page or because your test involves ' +
125
+ 'client-side navigation, which can interfere with Protractor\'s ' +
126
+ 'bootstrapping. See http://git.io/v4gXM for details');
127
+ } else {waitForAngular1(waitForAngular2);} // Wait for angular1 and angular2
128
+ // Testability hooks sequentially
129
+
130
+ } catch (err) {
131
+ callback(err.message);
132
+ }
133
+ }
data/lib/watir_angular.rb CHANGED
@@ -1,28 +1,17 @@
1
- # Code on this page is based on code by westlm1@NW110283.nwie.net
2
- # From https://github.com/watir/watir/pull/387
3
-
4
1
  require "watir"
5
2
 
6
3
  Watir::Locators::Element::SelectorBuilder.send(:remove_const, :WILDCARD_ATTRIBUTE)
7
4
  Watir::Locators::Element::SelectorBuilder::WILDCARD_ATTRIBUTE = /^(aria|data|ng)_(.+)$/
8
5
 
9
6
  module WatirAngular
10
- def self.wait_for_angular(browser, timeout: Watir.default_timeout)
11
- wd = browser.wd
12
- angular_element = "document.querySelectorAll('[ng-app]')[0]"
13
- wd.execute_script("angular.element(#{angular_element}).scope().pageFinishedRendering = false")
14
- wd.execute_script("angular.getTestability(#{angular_element}).whenStable(function(){angular.element(#{angular_element}).scope().pageFinishedRendering = true})")
15
- browser.wait_until(timeout: timeout, message: "waiting for angular to render") do
16
- wd.execute_script("return angular.element(#{angular_element}).scope().pageFinishedRendering")
17
- end
18
- rescue Selenium::WebDriver::Error::InvalidElementStateError
19
- # no ng-app found on page, continue as normal
20
- rescue Selenium::WebDriver::Error::JavascriptError
21
- # angular not used in the application, continue as normal
22
- rescue Selenium::WebDriver::Error::UnknownError => ex
23
- # TODO - this may be a bug in chromedriver that it is not a JavaScriptError
24
- raise unless ex.message.include? "angular is not defined"
25
- # angular not used in the application, continue as normal
7
+ def self.wait_for_angular(browser, timeout = nil)
8
+ browser.wd.manage.timeouts.script_timeout = timeout if timeout
9
+ file = File.expand_path("../waitForAngular.js", __FILE__)
10
+ js = File.read(file)
11
+ script = "return (#{js}).apply(null, arguments)"
12
+
13
+ error = browser.wd.execute_async_script(script, 'body')
14
+ Watir.logger.warn error if error
26
15
  end
27
16
 
28
17
  def self.inject_wait(browser)
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "watir_angular"
7
- spec.version = "0.3.0"
7
+ spec.version = "0.4.0"
8
8
  spec.authors = ["Titus Fortner"]
9
9
  spec.email = ["titusfortner@gmail.com"]
10
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watir_angular
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Titus Fortner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-22 00:00:00.000000000 Z
11
+ date: 2017-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: watir
@@ -95,6 +95,7 @@ files:
95
95
  - LICENSE.txt
96
96
  - README.md
97
97
  - Rakefile
98
+ - lib/waitForAngular.js
98
99
  - lib/watir_angular.rb
99
100
  - watir_angular.gemspec
100
101
  homepage: http://github.com/titusfortner/watir_angular