Skip to content

Commit

Permalink
Update chromedriver.sh
Browse files Browse the repository at this point in the history
  • Loading branch information
raczeja authored Nov 28, 2024
1 parent 78b8772 commit f734482
Showing 1 changed file with 25 additions and 64 deletions.
89 changes: 25 additions & 64 deletions chromedriver.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/sh -e

# This implements https://chromedriver.chromium.org/downloads/version-selection
# to install the latest version of ChromeDriver that's compatible with the
# to install the latest version of ChromeDriver that's compatible
# current google-chrome binary.

# Default location where the chromedriver executable will be installed.
Expand All @@ -10,94 +10,55 @@ destlink=${HOME}/local/bin/chromedriver

# The destination can be overridden via the command line.
if [ $# -ge 1 ]; then
if [ "$1" = '-h' ] || [ "$1" = '-help' ] || [ "$1" = '--help' ]; then
cat <<EOF >&2
if [ "$1" = '-h' ]; then
cat <<EOF >&2
Usage: ${0} [dest-symlink]
Download the appropriate version of ChromeDriver.
The executable will be placed alongside a symlink at
${destlink} by default.
EOF
exit 2
fi
destlink=$1
exit 2
fi
destlink=$1
fi

# Check that we'll be able to run the linux64 version of ChromeDriver.
# Check that we'll be able to run the linux64
hwname=$(uname -m)
if [ "$hwname" != x86_64 ]; then
echo "Unsupported hardware name '${hwname}' from 'uname -m'"
exit 1
echo "Unsupported hardware name '${hwname}' from 'uname -m'"
exit 1
fi

# google-chrome --version prints a line like "Google Chrome 96.0.4664.93 " (yes,
# with a trailing space): https://www.chromium.org/developers/version-numbers/
# google-chrome --version prints a line like "Google Chrome 96.0.4664.93"
vstring=$(google-chrome --version)
cver=$(echo "$vstring" | sed -nre 's/^Google Chrome ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s*$/\1/p')
if [ -z "$cver" ]; then
echo "Failed parsing Chrome version '${vstring}'"
exit 1
echo "Failed parsing Chrome version '${vstring}'"
exit 1
fi

major=$(echo "$cver" | cut -d. -f 1)
minor=$(echo "$cver" | cut -d. -f 2)
build=$(echo "$cver" | cut -d. -f 3)

if [ "$major" -ge 115 ]; then
# Starting with Chrome 115, there's an endpoint at that returns a massive JSON
# object listing all releases.
re=^${major}\\\\.${minor}\\\\.${build}\\\\.
url=$(
wget --quiet -O- https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json |
jq -r '.versions[] | select(.version | test("'"${re}"'")) | .downloads.chromedriver[] | select(.platform == "linux64") | .url' |
tail -1
)
if [ -z "$url" ]; then
echo "Failed finding latest release matching /${re}/"
exit 1
fi

# Extract the release from a URL like this:
# https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.0/linux64/chrome-linux64.zip
rel=$(echo "$url" | sed -nre 's!.*/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/.*!\1!p')
if [ -z "$url" ]; then
echo "Failed getting version number from '${url}'"
exit 1
fi

# The executable also seems to be located in a subdirectory now.
srcfile=chromedriver-linux64/chromedriver
# Starting with ChromeDriver 115.0.5790.98, we follow the new naming convention.
url="https://storage.googleapis.com/chrome-for-testing/${cver}/linux64/chromedriver-linux64.zip"
else
# We need "MAJOR.MINOR.BUILD", e.g. "96.0.4664". Get the file containing the
# latest compatible ChromeDriver release number.
short=$(echo "$build" | sed -re 's/\.[0-9]+$//')
rel=$(wget --quiet -O- "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${short}")
url=https://chromedriver.storage.googleapis.com/${rel}/chromedriver_linux64.zip
srcfile=chromedriver
url="https://chromedriver.storage.googleapis.com/${cver}/chromedriver_linux64.zip"
fi

echo "Need ChromeDriver ${rel} for Chrome ${cver}"

# Download the appropriate version if we don't already have it.
destfile=${destlink}.${rel}
if [ ! -e "$destfile" ]; then
tmpdir=$(mktemp --directory -t chromedriver.XXXXXXXXXX)
zipfile=${tmpdir}/$(basename "$url")
echo "Downloading ${url} to ${tmpdir}"
wget --quiet -O "$zipfile" "$url"
tempdir=$(mktemp -d)
trap "rm -rf ${tempdir}" EXIT

echo "Extracting archive to ${destfile}"
unzip -q "$zipfile" -d "$tmpdir"
mv "${tmpdir}/${srcfile}" "$destfile"
chmod 0755 "$destfile"
rm -rf "$tmpdir"
fi
# Download and extract the ChromeDriver
curl -sSL "$url" -o "${tempdir}/chromedriver.zip"
unzip -q "${tempdir}/chromedriver.zip" -d "${tempdir}"

# If there's already a regular file in place of the link, move it away.
if [ -e "$destlink" ] && [ ! -L "$destlink" ]; then
echo "Moving ${destlink} to ${destlink}.old"
mv "$destlink" "${destlink}.old"
fi
# Ensure the destination directory exists
mkdir -p "$(dirname "${destlink}")"

ln -sf "$(basename "$destfile")" "$destlink"
echo "ChromeDriver ${rel} installed to ${destlink}"
# Move the ChromeDriver to the destination directory
mv "${tempdir}/chromedriver-linux64/chromedriver" "${destlink}.${cver}"
ln -sf "${destlink}.${cver}" "${destlink}"

0 comments on commit f734482

Please sign in to comment.