capybara-playwright-driver 0.5.2 → 0.5.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff2e156c0f77ca328e9f95266e2b3ec6bf5a8250dbdbdb4d8c5e58b6590c042b
4
- data.tar.gz: 252a5c70de1364cde5fd3996466d166deb3d17639476731c63e24c362a3f46bd
3
+ metadata.gz: 518d6724c448e420fa844cbd57d30859ad8cc8bdc20348c9d9dc5ffdf819866f
4
+ data.tar.gz: 61ca17f8d89db0c48b4fe5a95b57462b389f2307e9185108779d5bcb5cb075b2
5
5
  SHA512:
6
- metadata.gz: fcfa998db2aa8701ba465be17b67df0164e9fdb4cb9c7c087342256143dde984573f7627d20297f6dc1b9680d9b6bfa5b3e2227f4bbc91eea3bfd878c76ad01a
7
- data.tar.gz: f792c1dd299fc9d257c6a38311a270979da849f4617d5827bbcfe7b186ccbca80cb92f27b1f4b6e6684a9443f8751af18501d4857f22031754ded783b6519219
6
+ metadata.gz: a873fe231de97cdcc86a541c3eb462b438cafe4d8582f2e3050b3e75e60d7dc8b79420dd81dbcf746ce637f5f834636c35f43b0534b3638d78ca67f4bdc91656
7
+ data.tar.gz: f4455bf145a28e9e102ff21b0f75fbfe026d1d0f888d55b874bdc6d38bec287a4fd1e6402d3623154c10f18377a3fa2bfdf383e1c8bc0bb888eb5712f9123211
data/Gemfile CHANGED
@@ -6,3 +6,14 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
7
7
  # Specify your gem's dependencies in capybara-playwright.gemspec
8
8
  gemspec
9
+
10
+ gem 'allure-rspec'
11
+ gem 'bundler'
12
+ gem 'launchy', '>= 2.0.4'
13
+ gem 'pry-byebug'
14
+ gem 'rack-test_server'
15
+ gem 'rake', '~> 13.0.3'
16
+ gem 'rspec', '~> 3.11.0'
17
+ gem 'rubocop-rspec'
18
+ gem 'sinatra', '>= 1.4.0'
19
+ gem 'webrick'
@@ -28,14 +28,4 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency 'addressable'
29
29
  spec.add_dependency 'capybara'
30
30
  spec.add_dependency 'playwright-ruby-client', '>= 1.16.0'
31
- spec.add_development_dependency 'allure-rspec'
32
- spec.add_development_dependency 'bundler'
33
- spec.add_development_dependency 'launchy', '>= 2.0.4'
34
- spec.add_development_dependency 'pry-byebug'
35
- spec.add_development_dependency 'rack-test_server'
36
- spec.add_development_dependency 'rake', '~> 13.0.3'
37
- spec.add_development_dependency 'rspec', '~> 3.11.0'
38
- spec.add_development_dependency 'rubocop-rspec'
39
- spec.add_development_dependency 'sinatra', '>= 1.4.0'
40
- spec.add_development_dependency 'webrick'
41
31
  end
@@ -15,8 +15,9 @@ module Capybara
15
15
 
16
16
  class NoSuchWindowError < StandardError ; end
17
17
 
18
- def initialize(driver:, playwright_browser:, page_options:, record_video: false, callback_on_save_trace: nil, default_timeout: nil, default_navigation_timeout: nil)
18
+ def initialize(driver:, internal_logger:, playwright_browser:, page_options:, record_video: false, callback_on_save_trace: nil, default_timeout: nil, default_navigation_timeout: nil)
19
19
  @driver = driver
20
+ @internal_logger = internal_logger
20
21
  @playwright_browser = playwright_browser
21
22
  @page_options = page_options
22
23
  if record_video
@@ -36,6 +37,7 @@ module Capybara
36
37
  unless @playwright_page
37
38
  @playwright_page = page
38
39
  end
40
+ page.send(:_update_internal_logger, @internal_logger)
39
41
  })
40
42
  if @callback_on_save_trace
41
43
  browser_context.tracing.start(screenshots: true, snapshots: true)
@@ -95,7 +97,7 @@ module Capybara
95
97
  def find_xpath(query, **options)
96
98
  assert_page_alive {
97
99
  @playwright_page.capybara_current_frame.query_selector_all("xpath=#{query}").map do |el|
98
- Node.new(@driver, @playwright_page, el)
100
+ Node.new(@driver, @internal_logger, @playwright_page, el)
99
101
  end
100
102
  }
101
103
  end
@@ -103,7 +105,7 @@ module Capybara
103
105
  def find_css(query, **options)
104
106
  assert_page_alive {
105
107
  @playwright_page.capybara_current_frame.query_selector_all(query).map do |el|
106
- Node.new(@driver, @playwright_page, el)
108
+ Node.new(@driver, @internal_logger, @playwright_page, el)
107
109
  end
108
110
  }
109
111
  end
@@ -185,7 +187,7 @@ module Capybara
185
187
  def active_element
186
188
  el = @playwright_page.capybara_current_frame.evaluate_handle('() => document.activeElement')
187
189
  if el
188
- Node.new(@driver, @playwright_page, el)
190
+ Node.new(@driver, @internal_logger, @playwright_page, el)
189
191
  else
190
192
  nil
191
193
  end
@@ -252,7 +254,7 @@ module Capybara
252
254
  /Cannot find context with specified id/,
253
255
  /Unable to adopt element handle from a different document/
254
256
  # ignore error for retry
255
- puts "[WARNING] #{err.message}"
257
+ @internal_logger.warn(err.message)
256
258
  else
257
259
  raise
258
260
  end
@@ -324,7 +326,7 @@ module Capybara
324
326
  end
325
327
 
326
328
  def maximize_window(handle)
327
- puts "[WARNING] maximize_window is not supported in Playwright driver"
329
+ @internal_logger.warn("maximize_window is not supported in Playwright driver")
328
330
  # incomplete in Playwright
329
331
  # ref: https://github.com/twalpole/apparition/blob/11aca464b38b77585191b7e302be2e062bdd369d/lib/capybara/apparition/page.rb#L346
330
332
  on_window(handle) do |page|
@@ -334,7 +336,7 @@ module Capybara
334
336
  end
335
337
 
336
338
  def fullscreen_window(handle)
337
- puts "[WARNING] fullscreen_window is not supported in Playwright driver"
339
+ @internal_logger.warn("fullscreen_window is not supported in Playwright driver")
338
340
  # incomplete in Playwright
339
341
  # ref: https://github.com/twalpole/apparition/blob/11aca464b38b77585191b7e302be2e062bdd369d/lib/capybara/apparition/page.rb#L341
340
342
  on_window(handle) do |page|
@@ -375,7 +377,7 @@ module Capybara
375
377
  [key, wrap_node(value)]
376
378
  end.to_h
377
379
  when ::Playwright::ElementHandle
378
- Node.new(@driver, @playwright_page, arg)
380
+ Node.new(@driver, @internal_logger, @playwright_page, arg)
379
381
  when ::Playwright::JSHandle
380
382
  obj_type, is_array = arg.evaluate('obj => [typeof obj, Array.isArray(obj)]')
381
383
  if obj_type == 'object'
@@ -20,6 +20,7 @@ module Capybara
20
20
  headless: nil,
21
21
  ignoreDefaultArgs: nil,
22
22
  proxy: nil,
23
+ reducedMotion: nil,
23
24
  slowMo: nil,
24
25
  # timeout: nil,
25
26
  tracesDir: nil,
@@ -18,6 +18,7 @@ module Capybara
18
18
  if options[:default_navigation_timeout].is_a?(Numeric)
19
19
  @default_navigation_timeout = options[:default_navigation_timeout] * 1000
20
20
  end
21
+ @internal_logger = options[:logger] || default_logger
21
22
  end
22
23
 
23
24
  def wait?; true; end
@@ -26,6 +27,7 @@ module Capybara
26
27
  private def browser
27
28
  @browser ||= ::Capybara::Playwright::Browser.new(
28
29
  driver: self,
30
+ internal_logger: @internal_logger,
29
31
  playwright_browser: playwright_browser,
30
32
  page_options: @page_options.value,
31
33
  record_video: callback_on_save_screenrecord?,
@@ -52,6 +54,27 @@ module Capybara
52
54
  @browser_runner.start
53
55
  end
54
56
 
57
+ private def default_logger
58
+ if defined?(Rails)
59
+ Rails.logger
60
+ else
61
+ PutsLogger.new
62
+ end
63
+ end
64
+
65
+ # Since existing user already monkey-patched Kernel#puts,
66
+ # (https://gist.github.com/searls/9caa12f66c45a72e379e7bfe4c48405b)
67
+ # Logger.new(STDOUT) should be avoided to use.
68
+ class PutsLogger
69
+ def info(message)
70
+ puts "[INFO] #{message}"
71
+ end
72
+
73
+ def warn(message)
74
+ puts "[WARNING] #{message}"
75
+ end
76
+ end
77
+
55
78
  private def quit
56
79
  @playwright_browser&.close
57
80
  @playwright_browser = nil
@@ -46,7 +46,7 @@ module Capybara
46
46
  def with_playwright_page(&block)
47
47
  raise ArgumentError.new('block must be given') unless block
48
48
 
49
- @browser&.with_playwright_page(&block)
49
+ browser.with_playwright_page(&block)
50
50
  end
51
51
 
52
52
  # Start Playwright tracing (doc: https://playwright.dev/docs/api/class-tracing#tracing-start)
@@ -8,7 +8,10 @@ module Capybara
8
8
 
9
9
  # Playwright has own auto-waiting feature.
10
10
  # So disable Capybara's retry logic.
11
- options[:wait] = 0
11
+ if driver.is_a?(Capybara::Playwright::Driver)
12
+ options[:wait] = 0
13
+ end
14
+
12
15
  super
13
16
  end
14
17
  end
@@ -21,7 +24,7 @@ module Capybara
21
24
  if native.is_a?(::Playwright::ElementHandle)
22
25
  block.call(native)
23
26
  else
24
- raise "#{native.inspect} is not a Playwirght::ElementHandle"
27
+ raise "#{native.inspect} is not a Playwright::ElementHandle"
25
28
  end
26
29
  end
27
30
  end
@@ -64,8 +67,9 @@ module Capybara
64
67
  # selenium: https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selenium/node.rb
65
68
  # apparition: https://github.com/twalpole/apparition/blob/master/lib/capybara/apparition/node.rb
66
69
  class Node < ::Capybara::Driver::Node
67
- def initialize(driver, page, element)
70
+ def initialize(driver, internal_logger, page, element)
68
71
  super(driver, element)
72
+ @internal_logger = internal_logger
69
73
  @page = page
70
74
  @element = element
71
75
  end
@@ -131,7 +135,7 @@ module Capybara
131
135
  }
132
136
  }
133
137
  JAVASCRIPT
134
- text.to_s.gsub(/\A[[:space:]&&[^\u00a0]]+/, '')
138
+ text.to_s.scrub.gsub(/\A[[:space:]&&[^\u00a0]]+/, '')
135
139
  .gsub(/[[:space:]&&[^\u00a0]]+\z/, '')
136
140
  .gsub(/\n+/, "\n")
137
141
  .tr("\u00a0", ' ')
@@ -209,15 +213,16 @@ module Capybara
209
213
  end
210
214
  end
211
215
 
212
- settable_class.new(@element, capybara_default_wait_time).set(value, **options)
216
+ settable_class.new(@element, capybara_default_wait_time, @internal_logger).set(value, **options)
213
217
  rescue ::Playwright::TimeoutError => err
214
218
  raise NotActionableError.new(err)
215
219
  end
216
220
 
217
221
  class Settable
218
- def initialize(element, timeout)
222
+ def initialize(element, timeout, internal_logger)
219
223
  @element = element
220
224
  @timeout = timeout
225
+ @internal_logger = internal_logger
221
226
  end
222
227
  end
223
228
 
@@ -249,7 +254,7 @@ module Capybara
249
254
  rescue ::Playwright::TimeoutError
250
255
  raise if @element.editable?
251
256
 
252
- puts "[INFO] Node#set: element is not editable. #{@element}"
257
+ @internal_logger.info("Node#set: element is not editable. #{@element}")
253
258
  end
254
259
  end
255
260
 
@@ -548,7 +553,7 @@ module Capybara
548
553
  _key = key.last
549
554
  code =
550
555
  if _key.is_a?(String) && _key.length == 1
551
- _key.upcase
556
+ _key
552
557
  elsif _key.is_a?(Symbol)
553
558
  key_for(_key)
554
559
  else
@@ -567,7 +572,7 @@ module Capybara
567
572
  when String
568
573
  key.each_char do |char|
569
574
  executables << PressKey.new(
570
- key: char.upcase,
575
+ key: char,
571
576
  modifiers: modifiers,
572
577
  )
573
578
  end
@@ -600,6 +605,10 @@ module Capybara
600
605
 
601
606
  class PressKey
602
607
  def initialize(key:, modifiers:)
608
+ # Shift requires an explicitly uppercase a-z key to produce the correct output
609
+ # See https://playwright.dev/docs/input#keys-and-shortcuts
610
+ key = key.upcase if modifiers == [MODIFIERS[:shift]] && key.match?(/^[a-z]$/)
611
+
603
612
  # puts "PressKey: key=#{key} modifiers: #{modifiers}"
604
613
  if modifiers.empty?
605
614
  @key = key
@@ -917,7 +926,7 @@ module Capybara
917
926
  # Node.new(@driver, @page, @element.evaluate_handle('el => el.shadowRoot'))
918
927
  #
919
928
  # does not work well because of the Playwright Error 'Element is not attached to the DOM'
920
- ShadowRootNode.new(@driver, @page, @element)
929
+ ShadowRootNode.new(@driver, @internal_logger, @page, @element)
921
930
  end
922
931
 
923
932
  def inspect
@@ -933,7 +942,7 @@ module Capybara
933
942
  def find_xpath(query, **options)
934
943
  assert_element_not_stale {
935
944
  @element.query_selector_all("xpath=#{query}").map do |el|
936
- Node.new(@driver, @page, el)
945
+ Node.new(@driver, @internal_logger, @page, el)
937
946
  end
938
947
  }
939
948
  end
@@ -941,7 +950,7 @@ module Capybara
941
950
  def find_css(query, **options)
942
951
  assert_element_not_stale {
943
952
  @element.query_selector_all(query).map do |el|
944
- Node.new(@driver, @page, el)
953
+ Node.new(@driver, @internal_logger, @page, el)
945
954
  end
946
955
  }
947
956
  end
@@ -12,6 +12,10 @@ module Capybara
12
12
  capybara_initialize
13
13
  end
14
14
 
15
+ private def _update_internal_logger(internal_logger)
16
+ @internal_logger = internal_logger
17
+ end
18
+
15
19
  private def capybara_initialize
16
20
  @capybara_all_responses = {}
17
21
  @capybara_last_response = nil
@@ -44,7 +48,7 @@ module Capybara
44
48
  end
45
49
 
46
50
  private def capybara_on_unexpected_modal(dialog)
47
- puts "[WARNING] Unexpected modal - \"#{dialog.message}\""
51
+ @internal_logger.warn "Unexpected modal - \"#{dialog.message}\""
48
52
  if dialog.type == 'beforeunload'
49
53
  dialog.accept_async
50
54
  else
@@ -99,7 +103,7 @@ module Capybara
99
103
  message_promise.fulfill(message)
100
104
  acceptor.handle(dialog)
101
105
  else
102
- message_promise.reject(Capybara::ModalNotFound.new("Dialog message=\"#{message}\" dowsn't match"))
106
+ message_promise.reject(Capybara::ModalNotFound.new("Dialog message=\"#{message}\" doesn't match"))
103
107
  dialog.dismiss
104
108
  end
105
109
  }
@@ -125,7 +129,7 @@ module Capybara
125
129
  if matcher.matches?(message)
126
130
  message_promise.fulfill(message)
127
131
  else
128
- message_promise.reject(Capybara::ModalNotFound.new("Dialog message=\"#{message}\" dowsn't match"))
132
+ message_promise.reject(Capybara::ModalNotFound.new("Dialog message=\"#{message}\" doesn't match"))
129
133
  end
130
134
  dialog.dismiss
131
135
  }
@@ -3,7 +3,7 @@ require_relative './node'
3
3
  module Capybara
4
4
  module Playwright
5
5
  class ShadowRootNode < Node
6
- def initialize(driver, page, element)
6
+ def initialize(driver, internal_logger, page, element)
7
7
  super
8
8
  @shadow_roow_element = element.evaluate_handle('el => el.shadowRoot')
9
9
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Capybara
4
4
  module Playwright
5
- VERSION = '0.5.2'
5
+ VERSION = '0.5.5'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-playwright-driver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - YusukeIwaki
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-25 00:00:00.000000000 Z
11
+ date: 2025-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -52,147 +52,7 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.16.0
55
- - !ruby/object:Gem::Dependency
56
- name: allure-rspec
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: bundler
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: launchy
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: 2.0.4
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: 2.0.4
97
- - !ruby/object:Gem::Dependency
98
- name: pry-byebug
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rack-test_server
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: rake
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: 13.0.3
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: 13.0.3
139
- - !ruby/object:Gem::Dependency
140
- name: rspec
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: 3.11.0
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: 3.11.0
153
- - !ruby/object:Gem::Dependency
154
- name: rubocop-rspec
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: sinatra
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: 1.4.0
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: 1.4.0
181
- - !ruby/object:Gem::Dependency
182
- name: webrick
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
195
- description:
55
+ description:
196
56
  email:
197
57
  - q7w8e9w8q7w8e9@yahoo.co.jp
198
58
  executables: []
@@ -226,7 +86,7 @@ homepage: https://github.com/YusukeIwaki/capybara-playwright-driver
226
86
  licenses:
227
87
  - MIT
228
88
  metadata: {}
229
- post_install_message:
89
+ post_install_message:
230
90
  rdoc_options: []
231
91
  require_paths:
232
92
  - lib
@@ -241,8 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
101
  - !ruby/object:Gem::Version
242
102
  version: '0'
243
103
  requirements: []
244
- rubygems_version: 3.5.11
245
- signing_key:
104
+ rubygems_version: 3.5.22
105
+ signing_key:
246
106
  specification_version: 4
247
107
  summary: Playwright driver for Capybara
248
108
  test_files: []