capybara-lockstep 0.3.2 → 0.3.3

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
  SHA256:
3
- metadata.gz: d0d733ed210e1ba465d9d612fcf461618ee91c88a71b09f9c0020271e4ac28ef
4
- data.tar.gz: 5f30713c033ebd57b30d37f27e545c2a4547f6d40cd013c15f4ebba50a1f3893
3
+ metadata.gz: 86fa6ca6223224f8ac4b53c973cf961287964d11b129d8aa89b7b4dc81d4bba4
4
+ data.tar.gz: f250e201b8ef467fd46d1e30654d8e2c88366c23ad8cb314e1031cb44268dcd7
5
5
  SHA512:
6
- metadata.gz: d8fcf72c9736d98a80661f282527f0f53affb22b5aa2b537f7e7fbc4ea246ca2886e4f798343654c984321ca3d7dfec25043fa8e70d4341558a9073ea69911fe
7
- data.tar.gz: c1f5144ed73a92f33e6ac36a0838401efae44d26ec199857f0e85a99b07afcd780d558ee6f3e859ac393db11649d186c8d56f72ddd6c2629fcddd68c2af907c0
6
+ metadata.gz: 846816f82797d02dc81869e449afaf99c3fdfe89682d6584a56b3416cbb5942138a38ae457dfebcbb4fc7f20ed2673766a02287911b258445c5a9b800d613f9c
7
+ data.tar.gz: 30064e290e2caed298e5868b0f1cb9c1f5aa34444895fa8cefd4d283b0433528dd1ee7793526f0652fbc11511ed3e50e9a6eb999b00f6a898411480616422199
data/Gemfile CHANGED
@@ -8,3 +8,5 @@ gemspec
8
8
  gem "rake", "~> 13.0"
9
9
 
10
10
  gem "rspec", "~> 3.0"
11
+
12
+ gem 'byebug'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- capybara-lockstep (0.3.2)
4
+ capybara-lockstep (0.3.3)
5
5
  activesupport (>= 3.2)
6
6
  capybara (>= 2.0)
7
7
  selenium-webdriver (>= 3)
@@ -17,6 +17,7 @@ GEM
17
17
  zeitwerk (~> 2.3)
18
18
  addressable (2.7.0)
19
19
  public_suffix (>= 2.0.2, < 5.0)
20
+ byebug (11.1.3)
20
21
  capybara (3.35.3)
21
22
  addressable
22
23
  mini_mime (>= 0.1.3)
@@ -70,6 +71,7 @@ PLATFORMS
70
71
  ruby
71
72
 
72
73
  DEPENDENCIES
74
+ byebug
73
75
  capybara-lockstep!
74
76
  rake (~> 13.0)
75
77
  rspec (~> 3.0)
data/README.md CHANGED
@@ -173,9 +173,9 @@ capybara-lockstep will automatically patch Capybara to wait for the browser afte
173
173
  Run your test suite to see if integration was successful and whether stability improves. During validation we recommend to activate `Capybara::Lockstep.debug = true` in your `spec_helper.rb` (RSpec) or `env.rb` (Cucumber). You should see messages like this in your console:
174
174
 
175
175
  ```text
176
- [Capybara::Lockstep] Synchronizing
177
- [Capybara::Lockstep] Finished waiting for JavaScript
178
- [Capybara::Lockstep] Synchronized successfully
176
+ [capybara-lockstep] Synchronizing
177
+ [capybara-lockstep] Finished waiting for JavaScript
178
+ [capybara-lockstep] Synchronized successfully
179
179
  ```
180
180
 
181
181
  Note that you may see some failures from tests with wrong assertions, which sometimes passed due to lucky timing.
@@ -201,9 +201,9 @@ Capybara::Lockstep.debug = true
201
201
  You should now see messages like this during your test runs:
202
202
 
203
203
  ```
204
- [Capybara::Lockstep] Synchronizing
205
- [Capybara::Lockstep] Finished waiting for JavaScript
206
- [Capybara::Lockstep] Synchronized successfully
204
+ [capybara-lockstep] Synchronizing
205
+ [capybara-lockstep] Finished waiting for JavaScript
206
+ [capybara-lockstep] Synchronized successfully
207
207
  ```
208
208
 
209
209
  You may also configure logging to an existing logger object:
@@ -95,19 +95,6 @@ window.CapybaraLockstep = (function() {
95
95
  startWorkForMicrotask()
96
96
  }
97
97
 
98
- function trackHistory() {
99
- ['popstate'].forEach(function(eventType) {
100
- document.addEventListener(eventType, onHistoryEvent)
101
- })
102
- }
103
-
104
- function onHistoryEvent() {
105
- // After calling history.back() or history.forward() the popstate event will *not*
106
- // fire synchronously. It will also not fire in the next task. Chrome sometimes fires
107
- // it after 10ms, but sometimes it takes longer.
108
- startWorkForTime(100)
109
- }
110
-
111
98
  function trackDynamicScripts() {
112
99
  if (!window.MutationObserver) {
113
100
  return
@@ -201,7 +188,6 @@ window.CapybaraLockstep = (function() {
201
188
  trackFetch()
202
189
  trackXHR()
203
190
  trackInteraction()
204
- trackHistory()
205
191
  trackDynamicScripts()
206
192
  trackJQuery()
207
193
  trackHydration()
@@ -1,10 +1,16 @@
1
1
  module Capybara
2
2
  module Lockstep
3
+ ERROR_SNIPPET_MISSING = 'Cannot synchronize: capybara-lockstep JavaScript snippet is missing'
4
+ ERROR_PAGE_MISSING = 'Cannot synchronize before initial Capybara visit'
5
+ ERROR_ALERT_OPEN = 'Cannot synchronize while an alert is open'
6
+ ERROR_NAVIGATED_AWAY = "Browser navigated away while synchronizing"
7
+
3
8
  class << self
4
9
  include Configuration
5
10
  include Logging
6
11
 
7
- attr_accessor :synchronized
12
+ attr_accessor :synchronizing
13
+ alias synchronizing? synchronizing
8
14
 
9
15
  def synchronized?
10
16
  value = page.instance_variable_get(:@lockstep_synchronized)
@@ -17,16 +23,19 @@ module Capybara
17
23
  page.instance_variable_set(:@lockstep_synchronized, value)
18
24
  end
19
25
 
20
- ERROR_SNIPPET_MISSING = 'Cannot synchronize: Capybara::Lockstep JavaScript snippet is missing on page'
21
- ERROR_PAGE_MISSING = 'Cannot synchronize before initial Capybara visit'
22
- ERROR_ALERT_OPEN = 'Cannot synchronize while an alert is open'
23
-
24
26
  def synchronize(lazy: false)
25
- if (lazy && synchronized?) || @synchronizing || disabled?
27
+ if (lazy && synchronized?) || synchronizing? || disabled?
26
28
  return
27
29
  end
28
30
 
29
- @synchronizing = true
31
+ synchronize_now
32
+ end
33
+
34
+ private
35
+
36
+ def synchronize_now
37
+ self.synchronizing = true
38
+ self.synchronized = false
30
39
 
31
40
  log 'Synchronizing'
32
41
 
@@ -54,10 +63,8 @@ module Capybara
54
63
  case message_from_js
55
64
  when ERROR_PAGE_MISSING
56
65
  log(message_from_js)
57
- self.synchronized = false
58
66
  when ERROR_SNIPPET_MISSING
59
67
  log(message_from_js)
60
- self.synchronized = false
61
68
  else
62
69
  log message_from_js
63
70
  log "Synchronized successfully"
@@ -66,19 +73,30 @@ module Capybara
66
73
  end
67
74
  rescue ::Selenium::WebDriver::Error::UnexpectedAlertOpenError
68
75
  log ERROR_ALERT_OPEN
69
- @synchronized = false
70
76
  # Don't raise an error, this will happen in an innocent test.
71
77
  # We will retry on the next Capybara synchronize call.
78
+ rescue ::Selenium::WebDriver::Error::JavascriptError => e
79
+ # When the URL changes while a script is running, my current selenium-webdriver
80
+ # raises a Selenium::WebDriver::Error::JavascriptError with the message:
81
+ # "javascript error: document unloaded while waiting for result".
82
+ # We will retry on the next Capybara synchronize call, by then we should see
83
+ # the new page.
84
+ if e.message.include?('unload')
85
+ log ERROR_NAVIGATED_AWAY
86
+ else
87
+ unhandled_synchronize_error(e)
88
+ end
72
89
  rescue StandardError => e
73
- log "#{e.class.name} while synchronizing: #{e.message}"
74
- @synchronized = false
75
- raise e
90
+ unhandled_synchronize_error(e)
76
91
  ensure
77
- @synchronizing = false
92
+ self.synchronizing = false
78
93
  end
79
94
  end
80
95
 
81
- private
96
+ def unhandled_synchronize_error(e)
97
+ log "#{e.class.name} while synchronizing: #{e.message}"
98
+ raise e
99
+ end
82
100
 
83
101
  def page
84
102
  Capybara.current_session
@@ -3,7 +3,7 @@ module Capybara
3
3
  module Logging
4
4
  def log(message)
5
5
  if debug? && message.present?
6
- message = "[Capybara::Lockstep] #{message}"
6
+ message = "[capybara-lockstep] #{message}"
7
7
  if @debug.respond_to?(:debug)
8
8
  # If someone set Capybara::Lockstep to a logger, use that
9
9
  @debug.debug(message)
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Lockstep
3
- VERSION = "0.3.2"
3
+ VERSION = "0.3.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-lockstep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-04 00:00:00.000000000 Z
11
+ date: 2021-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
@@ -100,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
100
  - !ruby/object:Gem::Version
101
101
  version: '0'
102
102
  requirements: []
103
- rubygems_version: 3.2.5
103
+ rubygems_version: 3.2.6
104
104
  signing_key:
105
105
  specification_version: 4
106
106
  summary: Synchronize Capybara commands with client-side JavaScript and AJAX requests