capybara-lockstep 0.4.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,13 +17,22 @@ module Capybara
17
17
  tag_options[:nonce] = options.fetch(:nonce, true)
18
18
  end
19
19
 
20
- full_js = capybara_lockstep_js
20
+ js = capybara_lockstep_js + capybara_lockstep_config_js(options)
21
+ javascript_tag(js, tag_options)
22
+ end
23
+
24
+ def capybara_lockstep_config_js(options = {})
25
+ js = ''
21
26
 
22
27
  if (debug = options.fetch(:debug, Lockstep.debug?))
23
- full_js += "\nCapybaraLockstep.debug = #{debug.to_json}"
28
+ js += "\nCapybaraLockstep.debug = #{debug.to_json}"
29
+ end
30
+
31
+ if (wait_tasks = options.fetch(:wait_tasks, Lockstep.wait_tasks))
32
+ js += "\nCapybaraLockstep.waitTasks = #{wait_tasks.to_json}"
24
33
  end
25
34
 
26
- javascript_tag(full_js, tag_options)
35
+ js
27
36
  end
28
37
 
29
38
  end
@@ -23,14 +23,26 @@ module Capybara
23
23
  page.instance_variable_set(:@lockstep_synchronized, value)
24
24
  end
25
25
 
26
- def synchronize(lazy: false)
27
- if (lazy && synchronized?) || synchronizing? || disabled?
26
+ def synchronize(lazy: false, log: nil)
27
+ if (lazy && synchronized?) || synchronizing? || mode == :off
28
28
  return
29
29
  end
30
30
 
31
+ # Allow passing a log message that is only logged
32
+ # when we're actually synchronizing.
33
+ if log
34
+ self.log(log)
35
+ end
36
+
31
37
  synchronize_now
32
38
  end
33
39
 
40
+ def auto_synchronize(**options)
41
+ if mode == :auto
42
+ synchronize(**options)
43
+ end
44
+ end
45
+
34
46
  private
35
47
 
36
48
  def synchronize_now
@@ -39,6 +51,8 @@ module Capybara
39
51
 
40
52
  log 'Synchronizing'
41
53
 
54
+ start_time = current_seconds
55
+
42
56
  begin
43
57
  with_max_wait_time(timeout) do
44
58
  message_from_js = evaluate_async_script(<<~JS)
@@ -54,6 +68,8 @@ module Capybara
54
68
  if (protocol === 'data:' || protocol == 'about:') {
55
69
  done(#{ERROR_PAGE_MISSING.to_json})
56
70
  } else if (document.readyState === 'complete') {
71
+ // WebDriver always waits for the `load` event after a visit(),
72
+ // unless a different page load strategy was configured.
57
73
  synchronize()
58
74
  } else {
59
75
  window.addEventListener('load', synchronize)
@@ -67,14 +83,21 @@ module Capybara
67
83
  log(message_from_js)
68
84
  else
69
85
  log message_from_js
70
- log "Synchronized successfully"
86
+ end_time = current_seconds
87
+ ms_elapsed = ((end_time.to_f - start_time) * 1000).round
88
+ log "Synchronized successfully [#{ms_elapsed} ms]"
71
89
  self.synchronized = true
72
90
  end
73
91
  end
74
92
  rescue ::Selenium::WebDriver::Error::ScriptTimeoutError
75
- log "Could not synchronize within #{timeout} seconds"
76
- # Don't raise an error, this may happen if the server is slow to respond.
77
- # We will retry on the next Capybara synchronize call.
93
+ timeout_message = "Could not synchronize within #{timeout} seconds"
94
+ log timeout_message
95
+ if timeout_with == :error
96
+ raise Timeout, timeout_message
97
+ else
98
+ # Don't raise an error, this may happen if the server is slow to respond.
99
+ # We will retry on the next Capybara synchronize call.
100
+ end
78
101
  rescue ::Selenium::WebDriver::Error::UnexpectedAlertOpenError
79
102
  log ERROR_ALERT_OPEN
80
103
  # Don't raise an error, this will happen in an innocent test.
@@ -124,6 +147,10 @@ module Capybara
124
147
  # no-op
125
148
  end
126
149
 
150
+ def current_seconds
151
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
152
+ end
153
+
127
154
  end
128
155
 
129
156
  end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Lockstep
3
- VERSION = "0.4.0"
3
+ VERSION = "1.1.0"
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.4.0
4
+ version: 1.1.0
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-05 00:00:00.000000000 Z
11
+ date: 2021-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby2_keywords
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description:
56
70
  email:
57
71
  - henning.koch@makandra.de
@@ -59,9 +73,11 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
76
+ - ".github/workflows/test.yml"
62
77
  - ".gitignore"
63
78
  - ".rspec"
64
79
  - ".ruby-version"
80
+ - CHANGELOG.md
65
81
  - Gemfile
66
82
  - Gemfile.lock
67
83
  - LICENSE.txt