I was surprised when a Capybara test that's been running fine for weeks, suddenly threw this error:
Selenium::WebDriver::Error::SessionNotCreatedError: session not created: This version of ChromeDriver only supports Chrome version 131 Current browser version is 133.0.6943.54
I think my local Chrome instance updated itself, because this error indicates that chromedriver has gotten out of sync with the local version of Google Chrome.
As an aside, in this project, I run my CI locally, as DHH and crew at 37signals have recently begun doing. Part of running the signoff script includes running our E2E tests locally against a locally-installed version of Google Chrome, rather than something version-pinned in a ci.yml file. This does slightly increase the maintenance burden, but the trade-offs are well worth it.
There were quite a few, not-so-obvious steps to fix the version mismatch. So I wrote a tiny bash script to automate this process which will inevitably bite me again in the future:
# Purpose: # When using chromedriver for anything (like capybara tests in Rails), you have this annoying # dance where you need to keep chromedriver up-to-date with Chrome itself. This script just # aims to make life a bit easier here. # First kill existing chromedriver, if any ps auwwx | ag chromedriver | ag -v ag | awk '{ print $2 }' | xargs kill # Update brew itself, which pulls latest cask references brew update brew upgrade chromedriver # Get the installed version and binary path from brew info path_info=$(brew info --json=v2 --casks chromedriver | jq -r ' .casks[0] | [.installed, .artifacts[0].binary[0]] | @tsv ') # Split the output into version and binary path read -r version binary_path <<< "$path_info" # Construct the full path full_path="/opt/homebrew/Caskroom/chromedriver/$version/$binary_path" # Turn off Apple's quarantine otherwise it will not let you run the new version of chromedriver echo xattr -d com.apple.quarantine "$full_path"
🙌🏻 🎉