Ask me anything
Ithy Logo
Sign in to save

自動檢查並更新 ChromeDriver 的完整 Python 程式解決方案

確保您的自動化環境始終使用相容的 ChromeDriver 版本

chrome and chromedriver setup

關鍵要點

  • 版本檢查:自動檢測已安裝的 Google Chrome 和 ChromeDriver 版本。
  • 自動更新:當版本不匹配時,自動下載並安裝最新相容的 ChromeDriver。
  • 跨平台支援:支援 Windows、MacOS 和 Linux 系統,確保廣泛的應用性。

程式概述

在進行 Web 自動化或測試時,確保 Google Chrome 瀏覽器和 ChromeDriver 的版本相符是至關重要的。版本不匹配可能導致自動化腳本失敗或意外行為。本指南將提供一個完整的 Python 程式,能夠自動檢查兩者版本是否一致,並在需要時自動更新 ChromeDriver。

程式詳解

所需套件安裝

在開始之前,請確保已安裝以下 Python 套件:

pip install selenium requests packaging webdriver_manager

這些套件分別用於自動化瀏覽器操作、發送 HTTP 請求、版本管理以及自動管理 ChromeDriver。

主要功能模塊

1. 獲取安裝的 Chrome 版本

根據不同的作業系統,採用不同的方法來獲取已安裝的 Google Chrome 瀏覽器的版本號。

import sys
import subprocess
import os

def get_chrome_version():
    """獲取當前安裝的Chrome版本"""
    try:
        if sys.platform == "win32":
            # Windows系統
            output = subprocess.check_output(
                r'reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome" /v Version',
                shell=True, text=True
            )
            version = re.search(r"(\d+\.\d+\.\d+\.\d+)", output).group(1)
            return version
        elif sys.platform == "darwin":
            # MacOS系統
            output = subprocess.check_output(
                ["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", "--version"],
                text=True
            )
            version = output.strip().split()[-1]
            return version
        elif sys.platform == "linux":
            # Linux系統
            output = subprocess.check_output(["google-chrome", "--version"], text=True)
            version = re.search(r"(\d+\.\d+\.\d+\.\d+)", output).group(1)
            return version
    except Exception as e:
        print(f"取得Chrome版本失敗: {e}")
        return None

2. 獲取已安裝的 ChromeDriver 版本

使用 Selenium WebDriver 來啟動 ChromeDriver 並獲取其版本號。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

def get_chromedriver_version():
    """獲取ChromeDriver的版本"""
    try:
        service = Service('chromedriver')
        driver = webdriver.Chrome(service=service)
        version = driver.capabilities['chrome']['chromedriverVersion'].split(' ')[0]
        driver.quit()
        return version
    except Exception as e:
        print(f"取得ChromeDriver版本失敗: {e}")
        return None

3. 下載對應版本的 ChromeDriver

根據 Chrome 的主要版本號,從官方存儲庫下載相應版本的 ChromeDriver。

import requests
import zipfile

def download_chromedriver(chrome_version):
    """下載對應版本的ChromeDriver"""
    major_version = chrome_version.split('.')[0]
    url = f"https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{major_version}"
    response = requests.get(url)
    if response.status_code != 200:
        raise RuntimeError(f"無法取得ChromeDriver最新版本,HTTP狀態碼: {response.status_code}")
    driver_version = response.text.strip()
    
    # 根據作業系統選擇下載鏈接
    if sys.platform == "win32":
        platform = "win32"
        download_url = f"https://chromedriver.storage.googleapis.com/{driver_version}/chromedriver_{platform}.zip"
    elif sys.platform == "darwin":
        platform = "mac64"
        download_url = f"https://chromedriver.storage.googleapis.com/{driver_version}/chromedriver_{platform}.zip"
    elif sys.platform == "linux":
        platform = "linux64"
        download_url = f"https://chromedriver.storage.googleapis.com/{driver_version}/chromedriver_{platform}.zip"
    else:
        raise RuntimeError("不支援的作業系統")
    
    # 下載並解壓縮
    zip_path = "chromedriver.zip"
    with requests.get(download_url, stream=True) as r:
        with open(zip_path, "wb") as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)
    
    with zipfile.ZipFile(zip_path, "r") as zip_ref:
        zip_ref.extractall()
    
    os.remove(zip_path)
    
    # 設置執行權限(Unix系統)
    if sys.platform != "win32":
        os.chmod("chromedriver", 0o755)
    
    print(f"ChromeDriver {driver_version} 已成功下載和安裝。")

4. 比較版本並自動更新

將獲取到的 Chrome 和 ChromeDriver 版本進行比較,如果不一致則自動更新 ChromeDriver。

from packaging import version

def compare_versions(chrome_version, chromedriver_version):
    """比較Chrome和ChromeDriver的主要版本號是否一致"""
    if chrome_version and chromedriver_version:
        chrome_major = version.parse(chrome_version).major
        chromedriver_major = version.parse(chromedriver_version).major
        return chrome_major == chromedriver_major
    return False

def check_and_update():
    """檢查版本是否匹配,若不匹配則更新ChromeDriver"""
    chrome_version = get_chrome_version()
    chromedriver_version = get_chromedriver_version()
    
    print(f"已安裝的 Chrome 版本: {chrome_version}")
    print(f"已安裝的 ChromeDriver 版本: {chromedriver_version if chromedriver_version else '未安裝'}")
    
    if not compare_versions(chrome_version, chromedriver_version):
        print("版本不匹配,開始更新 ChromeDriver...")
        download_chromedriver(chrome_version)
    else:
        print("Chrome 和 ChromeDriver 版本相符,無需更新。")

完整程式碼示例

以下是整合上述功能模塊的完整 Python 程式碼,能夠自動檢查並更新 ChromeDriver:

import sys
import subprocess
import os
import re
import requests
import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from packaging import version

def get_chrome_version():
    """獲取當前安裝的Chrome版本"""
    try:
        if sys.platform == "win32":
            # Windows系統
            output = subprocess.check_output(
                r'reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome" /v Version',
                shell=True, text=True
            )
            version = re.search(r"(\d+\.\d+\.\d+\.\d+)", output).group(1)
            return version
        elif sys.platform == "darwin":
            # MacOS系統
            output = subprocess.check_output(
                ["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", "--version"],
                text=True
            )
            version = output.strip().split()[-1]
            return version
        elif sys.platform == "linux":
            # Linux系統
            output = subprocess.check_output(["google-chrome", "--version"], text=True)
            version = re.search(r"(\d+\.\d+\.\d+\.\d+)", output).group(1)
            return version
    except Exception as e:
        print(f"取得Chrome版本失敗: {e}")
        return None

def get_chromedriver_version():
    """獲取ChromeDriver的版本"""
    try:
        service = Service('chromedriver')
        driver = webdriver.Chrome(service=service)
        version_str = driver.capabilities['chrome']['chromedriverVersion']
        version_num = version_str.split(' ')[0]
        driver.quit()
        return version_num
    except Exception as e:
        print(f"取得ChromeDriver版本失敗: {e}")
        return None

def download_chromedriver(chrome_version):
    """下載對應版本的ChromeDriver"""
    major_version = chrome_version.split('.')[0]
    url = f"https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{major_version}"
    response = requests.get(url)
    if response.status_code != 200:
        raise RuntimeError(f"無法取得ChromeDriver最新版本,HTTP狀態碼: {response.status_code}")
    driver_version = response.text.strip()
    
    # 根據作業系統選擇下載鏈接
    if sys.platform == "win32":
        platform = "win32"
        download_url = f"https://chromedriver.storage.googleapis.com/{driver_version}/chromedriver_{platform}.zip"
    elif sys.platform == "darwin":
        platform = "mac64"
        download_url = f"https://chromedriver.storage.googleapis.com/{driver_version}/chromedriver_{platform}.zip"
    elif sys.platform == "linux":
        platform = "linux64"
        download_url = f"https://chromedriver.storage.googleapis.com/{driver_version}/chromedriver_{platform}.zip"
    else:
        raise RuntimeError("不支援的作業系統")
    
    # 下載並解壓縮
    zip_path = "chromedriver.zip"
    with requests.get(download_url, stream=True) as r:
        with open(zip_path, "wb") as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)
    
    with zipfile.ZipFile(zip_path, "r") as zip_ref:
        zip_ref.extractall()
    
    os.remove(zip_path)
    
    # 設置執行權限(Unix系統)
    if sys.platform != "win32":
        os.chmod("chromedriver", 0o755)
    
    print(f"ChromeDriver {driver_version} 已成功下載和安裝。")

def compare_versions(chrome_version, chromedriver_version):
    """比較Chrome和ChromeDriver的主要版本號是否一致"""
    if chrome_version and chromedriver_version:
        chrome_major = version.parse(chrome_version).major
        chromedriver_major = version.parse(chromedriver_version).major
        return chrome_major == chromedriver_major
    return False

def check_and_update():
    """檢查版本是否匹配,若不匹配則更新ChromeDriver"""
    chrome_version = get_chrome_version()
    chromedriver_version = get_chromedriver_version()
    
    print(f"已安裝的 Chrome 版本: {chrome_version}")
    print(f"已安裝的 ChromeDriver 版本: {chromedriver_version if chromedriver_version else '未安裝'}")
    
    if not compare_versions(chrome_version, chromedriver_version):
        print("版本不匹配,開始更新 ChromeDriver...")
        download_chromedriver(chrome_version)
    else:
        print("Chrome 和 ChromeDriver 版本相符,無需更新。")

if __name__ == "__main__":
    check_and_update()

使用說明

  1. 安裝必要的套件:在終端或命令提示字元中執行以下命令:
    pip install selenium requests packaging webdriver_manager
  2. 下載 ChromeDriver:請確保系統中已安裝 Google Chrome 瀏覽器,並且 Python 腳本能夠執行。
  3. 執行腳本:將上述完整程式碼保存為 update_chromedriver.py,並在終端或命令提示字元中運行:
    python update_chromedriver.py
  4. 自動更新:腳本將自動檢查版本並在必要時下載並安裝最新相容的 ChromeDriver。

程式碼運作流程

  1. 獲取 Chrome 版本:根據作業系統不同,通過命令行或 subprocess 模組獲取已安裝的 Chrome 瀏覽器版本號。
  2. 獲取 ChromeDriver 版本:使用 Selenium 啟動 ChromeDriver,並通過其 capabilities 獲取版本號。
  3. 比較版本:使用 packaging.version 模組解析版本號,僅比較主要版本部分(例如 "119")。
  4. 下載相容的 ChromeDriver:若主要版本不匹配,則從官方存儲庫下載相應版本的 ChromeDriver,並解壓縮至指定目錄。
  5. 設置權限:在 Unix 系統上,設置 ChromeDriver 執行權限。

示範表格:版本比較

項目 Chrome 版本 ChromeDriver 版本 狀態
檢查1 92.0.4515.159 92.0.4515.43 相符
檢查2 93.0.4577.63 92.0.4515.43 不相符
檢查3 94.0.4606.61 94.0.4606.41 相符

常見問題與解答

1. 為什麼需要保持 Chrome 和 ChromeDriver 版本一致?

ChromeDriver 是與 Chrome 瀏覽器進行溝通的橋樑,版本不一致可能導致功能失效或自動化腳本無法正常運行。保持版本一致可確保穩定性和兼容性。

2. 程式無法獲取 Chrome 版本,該怎麼辦?

請確認 Google Chrome 已正確安裝,並且可通過命令行訪問。如果您使用的是 Windows 系統,請檢查註冊表路徑是否正確;如果是 MacOS 或 Linux,請確保 Chrome 的執行檔路徑正確無誤。

3. 如何更改 ChromeDriver 的下載路徑?

在 download_chromedriver 函數中,可以修改 zip_ref.extractall() 的參數來指定解壓縮路徑,並在移動 ChromeDriver 時更改目標目錄。


結論

透過上述完整的 Python 程式碼,您可以自動檢查和更新 ChromeDriver,確保其與已安裝的 Google Chrome 瀏覽器版本相符。此自動化流程不僅提升了工作效率,還減少了因版本不匹配而引發的問題,適用於各種作業系統環境。


參考資料


Last updated January 24, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI