capybara-playwright-driver 0.5.4 → 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 +4 -4
- data/Gemfile +11 -0
- data/capybara-playwright.gemspec +0 -10
- data/lib/capybara/playwright/browser.rb +10 -8
- data/lib/capybara/playwright/browser_options.rb +1 -0
- data/lib/capybara/playwright/driver.rb +23 -0
- data/lib/capybara/playwright/node.rb +9 -7
- data/lib/capybara/playwright/page.rb +7 -3
- data/lib/capybara/playwright/shadow_root_node.rb +1 -1
- data/lib/capybara/playwright/version.rb +1 -1
- metadata +6 -146
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 518d6724c448e420fa844cbd57d30859ad8cc8bdc20348c9d9dc5ffdf819866f
|
4
|
+
data.tar.gz: 61ca17f8d89db0c48b4fe5a95b57462b389f2307e9185108779d5bcb5cb075b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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'
|
data/capybara-playwright.gemspec
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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'
|
@@ -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
|
@@ -67,8 +67,9 @@ module Capybara
|
|
67
67
|
# selenium: https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selenium/node.rb
|
68
68
|
# apparition: https://github.com/twalpole/apparition/blob/master/lib/capybara/apparition/node.rb
|
69
69
|
class Node < ::Capybara::Driver::Node
|
70
|
-
def initialize(driver, page, element)
|
70
|
+
def initialize(driver, internal_logger, page, element)
|
71
71
|
super(driver, element)
|
72
|
+
@internal_logger = internal_logger
|
72
73
|
@page = page
|
73
74
|
@element = element
|
74
75
|
end
|
@@ -212,15 +213,16 @@ module Capybara
|
|
212
213
|
end
|
213
214
|
end
|
214
215
|
|
215
|
-
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)
|
216
217
|
rescue ::Playwright::TimeoutError => err
|
217
218
|
raise NotActionableError.new(err)
|
218
219
|
end
|
219
220
|
|
220
221
|
class Settable
|
221
|
-
def initialize(element, timeout)
|
222
|
+
def initialize(element, timeout, internal_logger)
|
222
223
|
@element = element
|
223
224
|
@timeout = timeout
|
225
|
+
@internal_logger = internal_logger
|
224
226
|
end
|
225
227
|
end
|
226
228
|
|
@@ -252,7 +254,7 @@ module Capybara
|
|
252
254
|
rescue ::Playwright::TimeoutError
|
253
255
|
raise if @element.editable?
|
254
256
|
|
255
|
-
|
257
|
+
@internal_logger.info("Node#set: element is not editable. #{@element}")
|
256
258
|
end
|
257
259
|
end
|
258
260
|
|
@@ -924,7 +926,7 @@ module Capybara
|
|
924
926
|
# Node.new(@driver, @page, @element.evaluate_handle('el => el.shadowRoot'))
|
925
927
|
#
|
926
928
|
# does not work well because of the Playwright Error 'Element is not attached to the DOM'
|
927
|
-
ShadowRootNode.new(@driver, @page, @element)
|
929
|
+
ShadowRootNode.new(@driver, @internal_logger, @page, @element)
|
928
930
|
end
|
929
931
|
|
930
932
|
def inspect
|
@@ -940,7 +942,7 @@ module Capybara
|
|
940
942
|
def find_xpath(query, **options)
|
941
943
|
assert_element_not_stale {
|
942
944
|
@element.query_selector_all("xpath=#{query}").map do |el|
|
943
|
-
Node.new(@driver, @page, el)
|
945
|
+
Node.new(@driver, @internal_logger, @page, el)
|
944
946
|
end
|
945
947
|
}
|
946
948
|
end
|
@@ -948,7 +950,7 @@ module Capybara
|
|
948
950
|
def find_css(query, **options)
|
949
951
|
assert_element_not_stale {
|
950
952
|
@element.query_selector_all(query).map do |el|
|
951
|
-
Node.new(@driver, @page, el)
|
953
|
+
Node.new(@driver, @internal_logger, @page, el)
|
952
954
|
end
|
953
955
|
}
|
954
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
|
-
|
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}\"
|
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}\"
|
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
|
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.
|
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:
|
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
|
-
|
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
|
@@ -242,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
242
102
|
version: '0'
|
243
103
|
requirements: []
|
244
104
|
rubygems_version: 3.5.22
|
245
|
-
signing_key:
|
105
|
+
signing_key:
|
246
106
|
specification_version: 4
|
247
107
|
summary: Playwright driver for Capybara
|
248
108
|
test_files: []
|