From f734482cd11ea37808c4ff1c8bf67ae40c4980f8 Mon Sep 17 00:00:00 2001 From: Jakub Raczek Date: Thu, 28 Nov 2024 12:44:47 +0100 Subject: [PATCH] Update chromedriver.sh --- chromedriver.sh | 89 ++++++++++++++----------------------------------- 1 file changed, 25 insertions(+), 64 deletions(-) diff --git a/chromedriver.sh b/chromedriver.sh index 5eb6ac3b..1ca7d195 100644 --- a/chromedriver.sh +++ b/chromedriver.sh @@ -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. @@ -10,33 +10,32 @@ 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 <&2 + if [ "$1" = '-h' ]; then + cat <&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) @@ -44,60 +43,22 @@ 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}"