自動檢查並更新 ChromeDriver 的完整 Python 程式解決方案
確保您的自動化環境始終使用相容的 ChromeDriver 版本
關鍵要點
- 版本檢查:自動檢測已安裝的 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()
使用說明
- 安裝必要的套件:在終端或命令提示字元中執行以下命令:
pip install selenium requests packaging webdriver_manager - 下載 ChromeDriver:請確保系統中已安裝 Google Chrome 瀏覽器,並且 Python 腳本能夠執行。
- 執行腳本:將上述完整程式碼保存為
update_chromedriver.py,並在終端或命令提示字元中運行:python update_chromedriver.py - 自動更新:腳本將自動檢查版本並在必要時下載並安裝最新相容的 ChromeDriver。
程式碼運作流程
- 獲取 Chrome 版本:根據作業系統不同,通過命令行或 subprocess 模組獲取已安裝的 Chrome 瀏覽器版本號。
- 獲取 ChromeDriver 版本:使用 Selenium 啟動 ChromeDriver,並通過其 capabilities 獲取版本號。
- 比較版本:使用
packaging.version模組解析版本號,僅比較主要版本部分(例如 "119")。 - 下載相容的 ChromeDriver:若主要版本不匹配,則從官方存儲庫下載相應版本的 ChromeDriver,並解壓縮至指定目錄。
- 設置權限:在 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