capybara-angular 0.2.5 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/test-suite.yml +46 -0
- data/.gitignore +1 -0
- data/README.md +7 -0
- data/capybara-angular.gemspec +4 -1
- data/gemfiles/Gemfile.rails-5.2.x +5 -0
- data/gemfiles/Gemfile.rails-6.0.x +5 -0
- data/gemfiles/Gemfile.rails-6.1.x +5 -0
- data/gemfiles/Gemfile.rails-7.0.x +5 -0
- data/gemfiles/Gemfile.rails-edge +5 -0
- data/lib/capybara/angular/dsl.rb +2 -2
- data/lib/capybara/angular/version.rb +1 -1
- data/lib/capybara/angular/waiter.js +53 -0
- data/lib/capybara/angular/waiter.rb +16 -37
- data/spec/capybara/angular_spec.rb +24 -0
- data/spec/public/non-angular-page-with-angular-javascript.html +8 -0
- data/spec/public/non-angular-page.html +6 -0
- metadata +62 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: bcb03c75ee5122b2ac0feb6410f7592a00a7058539fa4d1a1c0911108a2024bf
|
4
|
+
data.tar.gz: 62b1d29e8b1561694249b40efce0804d827814fdf6c468349536ea84135f7b0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a230af009fe1cc36312d9ac5877549cc5377ec7f2eccb03355ef34c00bc862b75353ff6a5c4d2b74dc30681309ef2806605c034fd53b7c8a57f9f85bb35cecc
|
7
|
+
data.tar.gz: d8bb3cbfcfea3594475f67d1a5dab917a0c452b349a5cf4af213c7006fbef20ee338254d86bb94d7d261275032b84756794d3be50cf947f31a96e4638c951f87
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: test-suite
|
9
|
+
|
10
|
+
on: [push, pull_request]
|
11
|
+
|
12
|
+
jobs:
|
13
|
+
test:
|
14
|
+
runs-on: ubuntu-20.04
|
15
|
+
strategy:
|
16
|
+
fail-fast: false
|
17
|
+
matrix:
|
18
|
+
gemfile: ["rails-7.0.x"]
|
19
|
+
ruby: [3.2]
|
20
|
+
include:
|
21
|
+
- gemfile: rails-7.0.x
|
22
|
+
ruby: '3.1'
|
23
|
+
- gemfile: rails-7.0.x
|
24
|
+
ruby: '3.0'
|
25
|
+
- gemfile: rails-7.0.x
|
26
|
+
ruby: '2.7'
|
27
|
+
- gemfile: rails-6.1.x
|
28
|
+
ruby: '3.1'
|
29
|
+
- gemfile: rails-6.1.x
|
30
|
+
ruby: '3.0'
|
31
|
+
- gemfile: rails-6.1.x
|
32
|
+
ruby: 2.7
|
33
|
+
- gemfile: rails-6.0.x
|
34
|
+
ruby: 2.7
|
35
|
+
- gemfile: rails-5.2.x
|
36
|
+
ruby: 2.7
|
37
|
+
|
38
|
+
env:
|
39
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/Gemfile.${{ matrix.gemfile }}
|
40
|
+
steps:
|
41
|
+
- uses: actions/checkout@v2
|
42
|
+
- uses: ruby/setup-ruby@v1
|
43
|
+
with:
|
44
|
+
ruby-version: ${{ matrix.ruby }}
|
45
|
+
bundler-cache: true
|
46
|
+
- run: bundle exec rspec
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -18,6 +18,13 @@ Use it as you would use regular Capybara API, however this time, you won't face
|
|
18
18
|
include Capybara::Angular::DSL
|
19
19
|
```
|
20
20
|
|
21
|
+
If you need to run some code without caring about AngularJS, you can use `ignoring_angular` like this:
|
22
|
+
```ruby
|
23
|
+
ignoring_angular do
|
24
|
+
# Your AngularJS agnostic code goes here
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
21
28
|
## Limitations
|
22
29
|
|
23
30
|
At the moment it works with AngularJS applications initialized with `ng-app`.
|
data/capybara-angular.gemspec
CHANGED
@@ -17,11 +17,14 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
|
+
spec.required_ruby_version = ">= 2.7"
|
20
21
|
|
21
22
|
spec.add_dependency 'capybara', '>= 2.5.0'
|
22
23
|
|
23
|
-
spec.add_development_dependency "bundler", "
|
24
|
+
spec.add_development_dependency "bundler", "> 1.17", "< 3"
|
25
|
+
spec.add_development_dependency "rails", "> 5.2", "< 7.1"
|
24
26
|
spec.add_development_dependency "rake"
|
25
27
|
spec.add_development_dependency "rspec"
|
26
28
|
spec.add_development_dependency "poltergeist"
|
29
|
+
spec.add_development_dependency "puma", "< 6"
|
27
30
|
end
|
data/lib/capybara/angular/dsl.rb
CHANGED
@@ -4,8 +4,8 @@ module Capybara
|
|
4
4
|
include Capybara::DSL
|
5
5
|
|
6
6
|
Capybara::Session::DSL_METHODS.each do |method|
|
7
|
-
define_method(method) do |*args, &block|
|
8
|
-
page.send(method, *args, &block)
|
7
|
+
define_method(method) do |*args, **kwargs, &block|
|
8
|
+
page.send(method, *args, **kwargs, &block)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
// This script is injected from waiter.rb. It is responsible for setting
|
2
|
+
// window.capybaraAngularReady when either a) angular is ready, or b)
|
3
|
+
// it determines the page is not an angular page.
|
4
|
+
|
5
|
+
(function () {
|
6
|
+
"use strict";
|
7
|
+
|
8
|
+
window.capybaraAngularReady = false;
|
9
|
+
|
10
|
+
function ready() {
|
11
|
+
window.capybaraAngularReady = true;
|
12
|
+
}
|
13
|
+
|
14
|
+
function angularPresent() {
|
15
|
+
return window.angular !== undefined;
|
16
|
+
}
|
17
|
+
|
18
|
+
function element() {
|
19
|
+
return document.querySelector("[ng-app], [data-ng-app]") || document.querySelector("body");
|
20
|
+
}
|
21
|
+
|
22
|
+
function elementPresent() {
|
23
|
+
return element() !== undefined;
|
24
|
+
}
|
25
|
+
|
26
|
+
function setupTestability() {
|
27
|
+
try {
|
28
|
+
angular.getTestability(element()).whenStable(ready);
|
29
|
+
} catch (err) {
|
30
|
+
ready();
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
function setupInjector() {
|
35
|
+
try {
|
36
|
+
angular.element(element()).injector().get("$browser").notifyWhenNoOutstandingRequests(ready);
|
37
|
+
} catch (err) {
|
38
|
+
ready();
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
function setup() {
|
43
|
+
if (!angularPresent() || !elementPresent()) {
|
44
|
+
ready();
|
45
|
+
} else if (angular.getTestability) {
|
46
|
+
setupTestability();
|
47
|
+
} else {
|
48
|
+
setupInjector();
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
setup();
|
53
|
+
}());
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Capybara
|
2
2
|
module Angular
|
3
3
|
class Waiter
|
4
|
+
WAITER_JS = IO.read(File.expand_path "../waiter.js", __FILE__)
|
5
|
+
|
4
6
|
attr_accessor :page
|
5
7
|
|
6
8
|
def initialize(page)
|
@@ -8,23 +10,24 @@ module Capybara
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def wait_until_ready
|
11
|
-
return unless
|
12
|
-
|
13
|
-
setup_ready
|
14
|
-
|
13
|
+
return unless driver_supports_js?
|
15
14
|
start = Time.now
|
15
|
+
|
16
16
|
until ready?
|
17
|
+
inject_waiter
|
17
18
|
timeout! if timeout?(start)
|
18
|
-
if page_reloaded_on_wait?
|
19
|
-
return unless angular_app?
|
20
|
-
setup_ready
|
21
|
-
end
|
22
19
|
sleep(0.01)
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
26
23
|
private
|
27
24
|
|
25
|
+
def driver_supports_js?
|
26
|
+
page.evaluate_script "true"
|
27
|
+
rescue Capybara::NotSupportedByDriverError
|
28
|
+
false
|
29
|
+
end
|
30
|
+
|
28
31
|
def timeout?(start)
|
29
32
|
Time.now - start > Capybara::Angular.default_max_wait_time
|
30
33
|
end
|
@@ -33,37 +36,13 @@ module Capybara
|
|
33
36
|
raise Timeout::Error.new("timeout while waiting for angular")
|
34
37
|
end
|
35
38
|
|
36
|
-
def
|
37
|
-
page.evaluate_script("window.
|
38
|
-
|
39
|
-
|
40
|
-
def angular_app?
|
41
|
-
js = '!!window.angular'
|
42
|
-
page.evaluate_script js
|
43
|
-
|
44
|
-
rescue Capybara::NotSupportedByDriverError
|
45
|
-
false
|
46
|
-
end
|
47
|
-
|
48
|
-
def setup_ready
|
49
|
-
page.execute_script <<-JS
|
50
|
-
var el = document.querySelector('[ng-app], [data-ng-app]') || document.querySelector('body');
|
51
|
-
|
52
|
-
window.angularReady = false;
|
53
|
-
|
54
|
-
if (angular.getTestability) {
|
55
|
-
angular.getTestability(el).whenStable(function() { window.angularReady = true; });
|
56
|
-
} else {
|
57
|
-
var $browser = angular.element(el).injector().get('$browser');
|
58
|
-
|
59
|
-
if ($browser.outstandingRequestCount > 0) { window.angularReady = false; }
|
60
|
-
$browser.notifyWhenNoOutstandingRequests(function() { window.angularReady = true; });
|
61
|
-
}
|
62
|
-
JS
|
39
|
+
def inject_waiter
|
40
|
+
return if page.evaluate_script("window.capybaraAngularReady !== undefined")
|
41
|
+
page.execute_script WAITER_JS
|
63
42
|
end
|
64
43
|
|
65
|
-
def
|
66
|
-
page.evaluate_script("window.
|
44
|
+
def ready?
|
45
|
+
page.evaluate_script("window.capybaraAngularReady === true")
|
67
46
|
end
|
68
47
|
end
|
69
48
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'rack'
|
2
|
+
require 'puma'
|
3
|
+
require 'rack/handler/puma'
|
2
4
|
require 'capybara'
|
3
5
|
require 'capybara/rspec'
|
4
6
|
require 'capybara/poltergeist'
|
@@ -27,6 +29,16 @@ feature 'Waiting for angular' do
|
|
27
29
|
timeout_page_should_have_waited
|
28
30
|
end
|
29
31
|
|
32
|
+
scenario 'when visiting a non-angular page' do
|
33
|
+
open_non_angular_page
|
34
|
+
non_angular_page_should_load
|
35
|
+
end
|
36
|
+
|
37
|
+
scenario 'when visiting a non-angular page that loads angular javascript' do
|
38
|
+
open_non_angular_page_with_angular_javascript
|
39
|
+
non_angular_page_should_load
|
40
|
+
end
|
41
|
+
|
30
42
|
def open_manual_bootstrap_page
|
31
43
|
visit '/manual.html'
|
32
44
|
end
|
@@ -39,7 +51,19 @@ feature 'Waiting for angular' do
|
|
39
51
|
visit '/ng-app-not-on-body.html'
|
40
52
|
end
|
41
53
|
|
54
|
+
def open_non_angular_page
|
55
|
+
visit '/non-angular-page.html'
|
56
|
+
end
|
57
|
+
|
58
|
+
def open_non_angular_page_with_angular_javascript
|
59
|
+
visit '/non-angular-page-with-angular-javascript.html'
|
60
|
+
end
|
61
|
+
|
42
62
|
def timeout_page_should_have_waited
|
43
63
|
expect(page).to have_content('waited')
|
44
64
|
end
|
65
|
+
|
66
|
+
def non_angular_page_should_load
|
67
|
+
expect(page).to have_content('non-angular page')
|
68
|
+
end
|
45
69
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-angular
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pawel Pierzchala
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capybara
|
@@ -28,16 +28,42 @@ dependencies:
|
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.17'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '3'
|
34
37
|
type: :development
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
|
-
- - "
|
41
|
+
- - ">"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.17'
|
44
|
+
- - "<"
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
46
|
+
version: '3'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rails
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '5.2'
|
54
|
+
- - "<"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '7.1'
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '5.2'
|
64
|
+
- - "<"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '7.1'
|
41
67
|
- !ruby/object:Gem::Dependency
|
42
68
|
name: rake
|
43
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +106,20 @@ dependencies:
|
|
80
106
|
- - ">="
|
81
107
|
- !ruby/object:Gem::Version
|
82
108
|
version: '0'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: puma
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - "<"
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '6'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - "<"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '6'
|
83
123
|
description: Capybara API that knows how to wait for Angular in end to end specs
|
84
124
|
email:
|
85
125
|
- pawelpierzchala@gmail.com
|
@@ -87,6 +127,7 @@ executables: []
|
|
87
127
|
extensions: []
|
88
128
|
extra_rdoc_files: []
|
89
129
|
files:
|
130
|
+
- ".github/workflows/test-suite.yml"
|
90
131
|
- ".gitignore"
|
91
132
|
- ".travis.yml"
|
92
133
|
- Gemfile
|
@@ -94,9 +135,15 @@ files:
|
|
94
135
|
- README.md
|
95
136
|
- Rakefile
|
96
137
|
- capybara-angular.gemspec
|
138
|
+
- gemfiles/Gemfile.rails-5.2.x
|
139
|
+
- gemfiles/Gemfile.rails-6.0.x
|
140
|
+
- gemfiles/Gemfile.rails-6.1.x
|
141
|
+
- gemfiles/Gemfile.rails-7.0.x
|
142
|
+
- gemfiles/Gemfile.rails-edge
|
97
143
|
- lib/capybara/angular.rb
|
98
144
|
- lib/capybara/angular/dsl.rb
|
99
145
|
- lib/capybara/angular/version.rb
|
146
|
+
- lib/capybara/angular/waiter.js
|
100
147
|
- lib/capybara/angular/waiter.rb
|
101
148
|
- spec/capybara/angular_spec.rb
|
102
149
|
- spec/public/js/angular-1.5.8.js
|
@@ -104,11 +151,13 @@ files:
|
|
104
151
|
- spec/public/manual.html
|
105
152
|
- spec/public/ng-app-not-on-body.html
|
106
153
|
- spec/public/ng-app.html
|
154
|
+
- spec/public/non-angular-page-with-angular-javascript.html
|
155
|
+
- spec/public/non-angular-page.html
|
107
156
|
homepage: ''
|
108
157
|
licenses:
|
109
158
|
- MIT
|
110
159
|
metadata: {}
|
111
|
-
post_install_message:
|
160
|
+
post_install_message:
|
112
161
|
rdoc_options: []
|
113
162
|
require_paths:
|
114
163
|
- lib
|
@@ -116,16 +165,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
165
|
requirements:
|
117
166
|
- - ">="
|
118
167
|
- !ruby/object:Gem::Version
|
119
|
-
version: '
|
168
|
+
version: '2.7'
|
120
169
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
170
|
requirements:
|
122
171
|
- - ">="
|
123
172
|
- !ruby/object:Gem::Version
|
124
173
|
version: '0'
|
125
174
|
requirements: []
|
126
|
-
|
127
|
-
|
128
|
-
signing_key:
|
175
|
+
rubygems_version: 3.1.6
|
176
|
+
signing_key:
|
129
177
|
specification_version: 4
|
130
178
|
summary: Stable Capybara API for AngularJS applications
|
131
179
|
test_files:
|
@@ -135,3 +183,5 @@ test_files:
|
|
135
183
|
- spec/public/manual.html
|
136
184
|
- spec/public/ng-app-not-on-body.html
|
137
185
|
- spec/public/ng-app.html
|
186
|
+
- spec/public/non-angular-page-with-angular-javascript.html
|
187
|
+
- spec/public/non-angular-page.html
|