Skip to content

Commit 11a984a

Browse files
committed
Implement logger option
1 parent 44222a3 commit 11a984a

File tree

5 files changed

+42
-11
lines changed

5 files changed

+42
-11
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

+3-2
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

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
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
playwright_cli_executable_path: ENV['PLAYWRIGHT_CLI_EXECUTABLE_PATH'],
5757
browser_type: (ENV['BROWSER'] || 'chromium').to_sym,
5858
headless: ENV['CI'] ? true : false,
59+
logger: Logger.new($stdout),
5960
}
6061

6162
Capybara.register_driver(:playwright) do |app|

0 commit comments

Comments
 (0)