Skip to content

Commit cf139cc

Browse files
committed
Implement logger option
1 parent 44222a3 commit cf139cc

File tree

5 files changed

+44
-14
lines changed

5 files changed

+44
-14
lines changed

lib/capybara/playwright/browser.rb

+10-8
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ class Browser
1515

1616
class NoSuchWindowError < StandardError ; end
1717

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)
1919
@driver = driver
20+
@internal_logger = internal_logger
2021
@playwright_browser = playwright_browser
2122
@page_options = page_options
2223
if record_video
@@ -36,6 +37,7 @@ def initialize(driver:, playwright_browser:, page_options:, record_video: false,
3637
unless @playwright_page
3738
@playwright_page = page
3839
end
40+
page.send(:_update_internal_logger, @internal_logger)
3941
})
4042
if @callback_on_save_trace
4143
browser_context.tracing.start(screenshots: true, snapshots: true)
@@ -95,15 +97,15 @@ def refresh
9597
def find_xpath(query, **options)
9698
assert_page_alive {
9799
@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)
99101
end
100102
}
101103
end
102104

103105
def find_css(query, **options)
104106
assert_page_alive {
105107
@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)
107109
end
108110
}
109111
end
@@ -185,7 +187,7 @@ def evaluate_async_script(script, *args)
185187
def active_element
186188
el = @playwright_page.capybara_current_frame.evaluate_handle('() => document.activeElement')
187189
if el
188-
Node.new(@driver, @playwright_page, el)
190+
Node.new(@driver, @internal_logger, @playwright_page, el)
189191
else
190192
nil
191193
end
@@ -252,7 +254,7 @@ def switch_to_frame(frame)
252254
/Cannot find context with specified id/,
253255
/Unable to adopt element handle from a different document/
254256
# ignore error for retry
255-
puts "[WARNING] #{err.message}"
257+
@internal_logger.warn(err.message)
256258
else
257259
raise
258260
end
@@ -324,7 +326,7 @@ def resize_window_to(handle, width, height)
324326
end
325327

326328
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")
328330
# incomplete in Playwright
329331
# ref: https://github.com/twalpole/apparition/blob/11aca464b38b77585191b7e302be2e062bdd369d/lib/capybara/apparition/page.rb#L346
330332
on_window(handle) do |page|
@@ -334,7 +336,7 @@ def maximize_window(handle)
334336
end
335337

336338
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")
338340
# incomplete in Playwright
339341
# ref: https://github.com/twalpole/apparition/blob/11aca464b38b77585191b7e302be2e062bdd369d/lib/capybara/apparition/page.rb#L341
340342
on_window(handle) do |page|
@@ -375,7 +377,7 @@ def dismiss_modal(dialog_type, **options, &block)
375377
[key, wrap_node(value)]
376378
end.to_h
377379
when ::Playwright::ElementHandle
378-
Node.new(@driver, @playwright_page, arg)
380+
Node.new(@driver, @internal_logger, @playwright_page, arg)
379381
when ::Playwright::JSHandle
380382
obj_type, is_array = arg.evaluate('obj => [typeof obj, Array.isArray(obj)]')
381383
if obj_type == 'object'

lib/capybara/playwright/driver.rb

+23
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def initialize(app, **options)
1818
if options[:default_navigation_timeout].is_a?(Numeric)
1919
@default_navigation_timeout = options[:default_navigation_timeout] * 1000
2020
end
21+
@internal_logger = options[:logger] || default_logger
2122
end
2223

2324
def wait?; true; end
@@ -26,6 +27,7 @@ def needs_server?; true; end
2627
private def browser
2728
@browser ||= ::Capybara::Playwright::Browser.new(
2829
driver: self,
30+
internal_logger: @internal_logger,
2931
playwright_browser: playwright_browser,
3032
page_options: @page_options.value,
3133
record_video: callback_on_save_screenrecord?,
@@ -52,6 +54,27 @@ def needs_server?; true; end
5254
@browser_runner.start
5355
end
5456

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+
5578
private def quit
5679
@playwright_browser&.close
5780
@playwright_browser = nil

lib/capybara/playwright/node.rb

+5-4
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ module Playwright
6767
# selenium: https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selenium/node.rb
6868
# apparition: https://github.com/twalpole/apparition/blob/master/lib/capybara/apparition/node.rb
6969
class Node < ::Capybara::Driver::Node
70-
def initialize(driver, page, element)
70+
def initialize(driver, internal_logger, page, element)
7171
super(driver, element)
72+
@internal_logger = internal_logger
7273
@page = page
7374
@element = element
7475
end
@@ -252,7 +253,7 @@ def set(value, **options)
252253
rescue ::Playwright::TimeoutError
253254
raise if @element.editable?
254255

255-
puts "[INFO] Node#set: element is not editable. #{@element}"
256+
@internal_logger.info("Node#set: element is not editable. #{@element}")
256257
end
257258
end
258259

@@ -940,15 +941,15 @@ def ==(other)
940941
def find_xpath(query, **options)
941942
assert_element_not_stale {
942943
@element.query_selector_all("xpath=#{query}").map do |el|
943-
Node.new(@driver, @page, el)
944+
Node.new(@driver, @internal_logger, @page, el)
944945
end
945946
}
946947
end
947948

948949
def find_css(query, **options)
949950
assert_element_not_stale {
950951
@element.query_selector_all(query).map do |el|
951-
Node.new(@driver, @page, el)
952+
Node.new(@driver, @internal_logger, @page, el)
952953
end
953954
}
954955
end

lib/capybara/playwright/page.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ def initialize(*args, **kwargs)
1212
capybara_initialize
1313
end
1414

15+
private def _update_internal_logger(internal_logger)
16+
@internal_logger = internal_logger
17+
end
18+
1519
private def capybara_initialize
1620
@capybara_all_responses = {}
1721
@capybara_last_response = nil
@@ -44,7 +48,7 @@ def initialize(*args, **kwargs)
4448
end
4549

4650
private def capybara_on_unexpected_modal(dialog)
47-
puts "[WARNING] Unexpected modal - \"#{dialog.message}\""
51+
@internal_logger.warn "Unexpected modal - \"#{dialog.message}\""
4852
if dialog.type == 'beforeunload'
4953
dialog.accept_async
5054
else

spec/spec_helper.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
}
6060

6161
Capybara.register_driver(:playwright) do |app|
62-
Capybara::Playwright::Driver.new(app, **driver_opts)
62+
Capybara::Playwright::Driver.new(app, **driver_opts, logger: Logger.new($stdout))
6363
end
6464

6565
Capybara.register_driver(:playwright_timeout_2) do |app|

0 commit comments

Comments
 (0)