{"record":{"id":"1cca5557745eeb26","repo":"teamcapybara/capybara","slug":"chromedriver-75-defaults-to-w3c-mode-please-upgr","errorCode":null,"errorMessage":"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.","messagePattern":"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\\.","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"lib/capybara/selenium/patches/logs.rb","lineNumber":25,"sourceCode":"        Chromedriver 75+ defaults to W3C mode. Please upgrade to chromedriver >= \\\n        75.0.3770.90 if you need to access logs while in W3C compliant mode.\n      MSG\n\n      COMMANDS = {\n        get_available_log_types: [:get, 'session/:session_id/se/log/types'],\n        get_log: [:post, 'session/:session_id/se/log'],\n        get_log_legacy: [:post, 'session/:session_id/log']\n      }.freeze\n\n      def commands(command)\n        COMMANDS[command] || super\n      end\n\n      def available_log_types\n        types = execute :get_available_log_types\n        Array(types).map(&:to_sym)\n      rescue ::Selenium::WebDriver::Error::UnknownCommandError\n        raise NotImplementedError, LOG_MSG\n      end\n\n      def log(type)\n        data = begin\n          execute :get_log, {}, type: type.to_s\n        rescue ::Selenium::WebDriver::Error::UnknownCommandError\n          execute :get_log_legacy, {}, type: type.to_s\n        end\n\n        Array(data).map do |l|\n          ::Selenium::WebDriver::LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')\n        rescue KeyError\n          next\n        end\n      rescue ::Selenium::WebDriver::Error::UnknownCommandError\n        raise NotImplementedError, LOG_MSG\n      end\n    end","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/teamcapybara/capybara/blob/15b5fdb76e972e9623d5af2123ed3755594f9732/lib/capybara/selenium/patches/logs.rb#L7-L43","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Upgrade chromedriver to >= 75.0.3770.90, matched to the installed Chrome major version (Selenium Manager, webdrivers gem, or pinned CI images)","Check which chromedriver is actually running: page.driver.browser.capabilities['chrome']['chromedriverVersion']","If logs are optional, rescue NotImplementedError and degrade (skip log assertions or fall back to CDP Runtime.consoleAPICalled)","Pin chrome and chromedriver together in CI so the versions cannot drift"],"exampleFix":"# before\nlog_types = page.driver.browser.manage.logs.available_log_types\n\n# after\ndef chromedriver_log_types\n  page.driver.browser.manage.logs.available_log_types\nrescue NotImplementedError\n  [] # chromedriver without se/log support in W3C mode\nend\n\nlog_types = chromedriver_log_types\n# plus: let Selenium Manager / webdrivers keep chromedriver matched to Chrome","handlingStrategy":"fallback","validationCode":"def chromedriver_supports_logs?\n  version = page.driver.browser.capabilities\n                .dig('chrome', 'chromedriverVersion').to_s.split.first\n  Gem::Version.new(version) >= Gem::Version.new('75.0.3770.90')\nrescue StandardError\n  false\nend\n\nlog_types = page.driver.browser.manage.logs.available_log_types if chromedriver_supports_logs?","typeGuard":null,"tryCatchPattern":"def safe_available_log_types\n  page.driver.browser.manage.logs.available_log_types\nrescue NotImplementedError, Selenium::WebDriver::Error::UnknownCommandError\n  Capybara.logger&.warn 'chromedriver log endpoint unavailable'\n  []\nend","preventionTips":["Let Selenium Manager or the webdrivers gem supply a chromedriver matched to installed Chrome","Wrap every manage.logs call in one helper that rescues NotImplementedError","Add a CI boot check asserting chromedriver >= 75.0.3770.90 when log assertions are required"],"tags":["chromedriver","logs","w3c","selenium","chrome","version-mismatch"],"backgroundTag":"driver-version-mismatch","analyzedSha":"15b5fdb76e972e9623d5af2123ed3755594f9732","analyzedAt":"2026-08-21T16:53:45.588Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}