From 24bf2aff9d7adf5d6d08b3ff057c83051665e1c1 Mon Sep 17 00:00:00 2001 From: Dmitry Vorotilin Date: Tue, 27 Oct 2026 10:52:52 +0300 Subject: [PATCH 1/2] chore: bump ferrum --- Gemfile | 2 +- cuprite.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 26b28b6a..aeb15d81 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ source "https://rubygems.org" gem "byebug", "~> 11.1", platforms: %i[mri windows] gem "chunky_png", "~> 1.4" -gem "ferrum", github: "rubycdp/ferrum", branch: "main" +gem "ferrum" gem "image_size", "~> 3.0" gem "launchy", "~> 2.5" gem "logger" diff --git a/cuprite.gemspec b/cuprite.gemspec index 254dc18b..0c040f20 100644 --- a/cuprite.gemspec +++ b/cuprite.gemspec @@ -25,5 +25,5 @@ Gem::Specification.new do |s| s.required_ruby_version = ">= 3.2" s.add_dependency "capybara", "~> 3.0" - s.add_dependency "ferrum", "~> 0.19.1" + s.add_dependency "ferrum", "~> 0.20.0" end From 3797ca431fff0cc3fb1846d7906fa4ca56645b24 Mon Sep 17 00:00:00 2001 From: Dmitry Vorotilin Date: Tue, 27 Oct 2026 13:36:24 +0300 Subject: [PATCH 2/2] feat(driver): expose Ferrum console as Driver#console --- CHANGELOG.md | 2 ++ docs/7-javascript.md | 26 ++++++++++++++++++++++++++ lib/capybara/cuprite/driver.rb | 3 ++- spec/features/driver_spec.rb | 18 ++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6de3b093..de133466 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### Added - `Driver#downloads` to wait for downloads and list them, files are saved to `Capybara.save_path` [#181] +- `Driver#console` with the page's `console.*` calls, browser log entries and uncaught exceptions, no more parsing the + `:logger` output to get them [#113] ### Changed diff --git a/docs/7-javascript.md b/docs/7-javascript.md index 5b029775..67704d8e 100644 --- a/docs/7-javascript.md +++ b/docs/7-javascript.md @@ -27,6 +27,32 @@ Pass `js_errors: true` to re-raise JavaScript errors from the page as Capybara::Cuprite::Driver.new(app, js_errors: true) ``` +## Console + +`page.driver.console` is Ferrum's [console](/docs/ferrum/javascript#console) +for the current page: `console.*` calls, browser log entries (failed resource +loads, CSP violations, deprecations, ...) and uncaught exceptions. It's +`Enumerable` over the last 1000 messages and is cleared at the end of every +test. + +```ruby +visit "/" +page.driver.console.last.text # => "Hello world" +page.driver.console.select(&:error?) # => [#] +``` + +Fail a test on browser errors: + +```ruby +after { expect(page.driver.console.select(&:error?)).to be_empty } +``` + +Print what the page logged: + +```ruby +after { page.driver.console.each { |message| warn(message) } } +``` + ## Preloading scripts Use the `:extensions` option to load scripts into every page before any other diff --git a/lib/capybara/cuprite/driver.rb b/lib/capybara/cuprite/driver.rb index e1b07cf4..07cb38b8 100644 --- a/lib/capybara/cuprite/driver.rb +++ b/lib/capybara/cuprite/driver.rb @@ -14,7 +14,8 @@ class Driver < Capybara::Driver::Base delegate %i[restart quit status_code timeout timeout= current_url title body window_handles close_window switch_to_window within_window window_handle - back forward refresh wait_for_reload viewport_size device_pixel_ratio downloads] => :browser + back forward refresh wait_for_reload viewport_size device_pixel_ratio downloads + console] => :browser delegate %i[send_keys] => :active_element alias html body alias current_window_handle window_handle diff --git a/spec/features/driver_spec.rb b/spec/features/driver_spec.rb index 2555ba4e..0d99e04e 100644 --- a/spec/features/driver_spec.rb +++ b/spec/features/driver_spec.rb @@ -946,6 +946,24 @@ def create_screenshot(file, *args) end end + context "console" do + it "collects console messages of the page" do + @session.visit("/cuprite/console_log") + + message = @driver.console.last + expect(message.text).to eq("Hello world") + expect(message.type).to eq(:log) + expect(message.source).to eq(:console_api) + end + + it "forgets messages after reset" do + @session.visit("/cuprite/console_log") + @driver.reset! + + expect(@driver.console).to be_empty + end + end + context "cookies support" do it "returns set cookies" do @session.visit("/set_cookie")