teamcapybara/capybara · error · NotImplementedError

Chromedriver 75+ defaults to W3C mode. Please upgrade to chr

Error message

Chromedriver 75+ defaults to W3C mode. Please upgrade to chromedriver >= 75.0.3770.90 if you need to access logs while in W3C compliant mode.

What it means

Capybara patches the Selenium Chrome driver bridge to expose manage.logs against chromedriver's se/log endpoints. Chromedriver 75+ defaults to W3C mode and the log endpoints only exist from 75.0.3770.90; when the endpoint reports an unknown command, available_log_types converts Selenium's UnknownCommandError into this NotImplementedError with the upgrade message.

Source

Thrown at lib/capybara/selenium/patches/logs.rb:25

        Chromedriver 75+ defaults to W3C mode. Please upgrade to chromedriver >= \
        75.0.3770.90 if you need to access logs while in W3C compliant mode.
      MSG

      COMMANDS = {
        get_available_log_types: [:get, 'session/:session_id/se/log/types'],
        get_log: [:post, 'session/:session_id/se/log'],
        get_log_legacy: [:post, 'session/:session_id/log']
      }.freeze

      def commands(command)
        COMMANDS[command] || super
      end

      def available_log_types
        types = execute :get_available_log_types
        Array(types).map(&:to_sym)
      rescue ::Selenium::WebDriver::Error::UnknownCommandError
        raise NotImplementedError, LOG_MSG
      end

      def log(type)
        data = begin
          execute :get_log, {}, type: type.to_s
        rescue ::Selenium::WebDriver::Error::UnknownCommandError
          execute :get_log_legacy, {}, type: type.to_s
        end

        Array(data).map do |l|
          ::Selenium::WebDriver::LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
        rescue KeyError
          next
        end
      rescue ::Selenium::WebDriver::Error::UnknownCommandError
        raise NotImplementedError, LOG_MSG
      end
    end

View on GitHub (pinned to 15b5fdb76e)

Solutions

  1. Upgrade chromedriver to >= 75.0.3770.90, matched to the installed Chrome major version (Selenium Manager, webdrivers gem, or pinned CI images)
  2. Check which chromedriver is actually running: page.driver.browser.capabilities['chrome']['chromedriverVersion']
  3. If logs are optional, rescue NotImplementedError and degrade (skip log assertions or fall back to CDP Runtime.consoleAPICalled)
  4. Pin chrome and chromedriver together in CI so the versions cannot drift

Example fix

# before
log_types = page.driver.browser.manage.logs.available_log_types

# after
def chromedriver_log_types
  page.driver.browser.manage.logs.available_log_types
rescue NotImplementedError
  [] # chromedriver without se/log support in W3C mode
end

log_types = chromedriver_log_types
# plus: let Selenium Manager / webdrivers keep chromedriver matched to Chrome
Defensive patterns

Strategy: fallback

Validate before calling

def chromedriver_supports_logs?
  version = page.driver.browser.capabilities
                .dig('chrome', 'chromedriverVersion').to_s.split.first
  Gem::Version.new(version) >= Gem::Version.new('75.0.3770.90')
rescue StandardError
  false
end

log_types = page.driver.browser.manage.logs.available_log_types if chromedriver_supports_logs?

Try / catch

def safe_available_log_types
  page.driver.browser.manage.logs.available_log_types
rescue NotImplementedError, Selenium::WebDriver::Error::UnknownCommandError
  Capybara.logger&.warn 'chromedriver log endpoint unavailable'
  []
end

Prevention

When it happens

Trigger: Calling page.driver.browser.manage.logs.available_log_types with a chromedriver older than 75.0.3770.90 running in W3C mode, or a chromedriver/headless-shell build where the se/log endpoints are unavailable; also triggered indirectly by console-log helper gems that enumerate log types.

Common situations: Upgrading selenium-webdriver/Capybara while CI keeps a stale pinned chromedriver; Docker images with mismatched chrome/chromedriver versions; headless-shell or Chrome-for-Testing images lacking logging endpoints; log assertions written before the W3C default flip.

Related errors


AI-assisted analysis of teamcapybara/capybara@15b5fdb76e (2026-08-21). Data as JSON: /api/errors/1cca5557745eeb26. Report an issue: GitHub.