capybara-angular 0.2.5 → 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 +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
|