From 4e886ef968537c84b7346c5a49c0bb6b1916744c Mon Sep 17 00:00:00 2001 From: Dmitry Vorotilin Date: Fri, 30 Oct 2026 14:07:50 +0300 Subject: [PATCH] ref(page): handle :js_errors in Cuprite instead of passing it to Ferrum Ferrum deprecates :js_errors, so Cuprite keeps it out of Ferrum's options and subscribes to Runtime.exceptionThrown on its own pages. The setting is stored as raise_on_js_errors so Ferrum 0.20, which still reads js_errors, doesn't subscribe a second time. --- CHANGELOG.md | 2 ++ docs/2-customization.md | 4 +++- lib/capybara/cuprite/browser.rb | 3 ++- lib/capybara/cuprite/options.rb | 2 +- lib/capybara/cuprite/page.rb | 9 +++++++++ 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 636b3844..20685259 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### Changed - `Driver#current_url` and `Driver#title` read Ferrum's `url` and `title` of the window, not `current_url` and `current_title` deprecated in Ferrum 0.21 [rubycdp/ferrum#687] +- `:js_errors` is handled by Cuprite instead of being passed to Ferrum, which deprecates it. Behavior is the same + [rubycdp/ferrum#688] ### Fixed diff --git a/docs/2-customization.md b/docs/2-customization.md index a06e11c9..a5cf418e 100644 --- a/docs/2-customization.md +++ b/docs/2-customization.md @@ -13,12 +13,14 @@ end ``` Cuprite accepts all [Ferrum options](/docs/ferrum/customization), such as -`:headless`, `:timeout`, `:js_errors`, `:browser_path`, `:browser_options`, +`:headless`, `:timeout`, `:browser_path`, `:browser_options`, `:url`, `:proxy`, `:dockerize` and others. Cuprite-specific options are: * options `Hash` + * `:js_errors` (Boolean) - Re-raise JavaScript errors from the page as `Ferrum::JavaScriptError` in Ruby, `false` + by default. See [JavaScript errors](/docs/cuprite/javascript#javascript-errors). * `:screen_size` (Array) - Size used by `maximize_window`, `[1366, 768]` by default. * `:raise_on_unhandled_modal` (Boolean) - What to do when a JavaScript dialog is opened but not handled by `accept_*`/`dismiss_*`. When `false` (default) a warning is printed, when `true` diff --git a/lib/capybara/cuprite/browser.rb b/lib/capybara/cuprite/browser.rb index a25e8188..81611608 100644 --- a/lib/capybara/cuprite/browser.rb +++ b/lib/capybara/cuprite/browser.rb @@ -10,8 +10,9 @@ class Browser < Ferrum::Browser def initialize(options = nil) device = options&.dig(:emulate) options = Devices.fetch(device).except(:user_agent).merge(options) if device - super + super(options&.except(:js_errors)) + @options.raise_on_js_errors = options&.dig(:js_errors) @options.raise_on_unhandled_modal = options&.dig(:raise_on_unhandled_modal) @options.url_blacklist = prepare_wildcards(options&.dig(:url_blacklist)) @options.url_whitelist = prepare_wildcards(options&.dig(:url_whitelist)) diff --git a/lib/capybara/cuprite/options.rb b/lib/capybara/cuprite/options.rb index 42a09a8c..da67114b 100644 --- a/lib/capybara/cuprite/options.rb +++ b/lib/capybara/cuprite/options.rb @@ -4,7 +4,7 @@ module Ferrum class Browser class Options attr_writer :window_size - attr_accessor :url_blacklist, :url_whitelist, :raise_on_unhandled_modal + attr_accessor :url_blacklist, :url_whitelist, :raise_on_unhandled_modal, :raise_on_js_errors def mobile @options.fetch(:mobile, nil) diff --git a/lib/capybara/cuprite/page.rb b/lib/capybara/cuprite/page.rb index 971a33c0..22c21499 100644 --- a/lib/capybara/cuprite/page.rb +++ b/lib/capybara/cuprite/page.rb @@ -17,6 +17,15 @@ def set_viewport(width: 0, height: 0, scale_factor: @options.scale_factor, mobil private + def subscribe + super + return unless @options.raise_on_js_errors + + on("Runtime.exceptionThrown") do |params| + Thread.main.raise Ferrum::JavaScriptError, params["exceptionDetails"] + end + end + def prepare_page super execute(EXTENSION_JS)