python selenium 4.9 自動下載chromedriver.exe

先闢謠!“新版selenium不用driver也能控制chrome!”假的!依然需要driver,只是.........它自動匹配下載而已。而且存放位置很迷......

先上一段代碼,大家覺得是否會報錯?(本測試不存在driver.exe文件

# -*- coding: utf-8 -*-
from selenium.webdriver.chrome.webdriver import WebDriver as Chrome
# 此測試沒有driver.exe文件存在
filepath = r'C:\Users\Administrator\Desktop\driver.exe'
C = Chrome(executable_path=filepath)
print('lol')

A、相信大部分人會報錯

'needs to be in PATH'

'needs to be available in the path'

'This version of ChromeDriver only supports Chrome version'

大概是這幾種異常中的一種。對於selenium4.9以下的版本應該都會出現的。

B、但到了selenium4.9,很神奇它正常啓動了瀏覽器。(這是控制檯提示)

tx.py:5: DeprecationWarning: executable_path has been deprecated, please pass in
 a Service object
  C = Chrome(executable_path=filepath)

DevTools listening on ws://127.0.0.1:50773/devtools/browser/792c6c13-b864-4d1b-8
962-9d7ef1a2fd31
lol

哇!新版selenium可以不用driver了!!!

先別激動。我先說結論,現在driver它自動下載到以下路徑。

C:\Users\{windows用戶名}\.cache\selenium\chromedriver\win32\{瀏覽器版本號}\chromedriver.exe

這意味着瀏覽器每次升級都會多個driver,需要手動清理。而且executable_path的指定失效了。

一、自動下載driver代碼定位

【經過不斷打斷點嘗試。😑】當執行到文件selenium_manager.py 的 result = self.run(args) 時會下載chromedriver.exe。

其中 args是

['C:\\Program Files\\Python39\\lib\\site-packages\\selenium\\webdriver\\common\\windows\\selenium-manager.exe', '--browser', 'chrome', '--output', 'json', '--browser-path', 'C:\\Users\\Administrator\\Desktop\\driver.exe']

result返回了

'C:\\Users\\Administrator\\.cache\\selenium\\chromedriver\\win32\\113.0.5672.63\\chromedriver.exe'

既然對方是exe那代表我們只能通過參數使用manager,沒辦法"黑"代碼庫了。根據上下文,我們需要在options中定義binary_location才能設置driver路徑

同時,由於“executable_path has been deprecated”,已經棄用。我們需要同步更新driver.exe的指定方法。

 

二、指定chromedriver.exe路徑

【經過複雜的斷點和調試和查資料...................)😣】

需要指定driver路徑應該這樣寫

# -*- coding: utf-8 -*-
from selenium.webdriver.chrome.webdriver import WebDriver as Chrome
from selenium.webdriver.chrome.options import Options

# 此測試沒有driver.exe文件存在
filepath = r'C:\Users\Administrator\Desktop\driver.exe'
option = Options()
option.binary_location = filepath
C = Chrome(options=option)
print('lol')

但是!driver.exe必須自己下載好對應版本!它不再幫你自動下載!!!

 

三、總結

1、其實新版依然要chromedriver.exe。只是它自動幫你匹配瀏覽器下載。不考慮緩存問題,是個不錯的升級。但要控制"chrome內核"的其他瀏覽器就是噩夢。

2、我暫時不建議升級到新版selenium4.9+的。很多寫法進行強制升級,不向下兼容!例如Service和Options的優先初始化再作爲參數給WebDriver。

再例如Options不再支持實例化時賦值。

(其實官方selenium-manager.exe應該加個參數,讓這參數判斷是否應該"自動下載driver",或者更改自動下載的文件路徑)

 

後記:

像我以前有自己包裝自動下載driver的,這是個很煩人的升級。但對於小白來說簡直是春天,不再需要爲“chrome自動升級,driver又對應不上”而困擾

但參數傳遞的方式同時是個大變動!舊教材和資料基本一半用不上了。

如果需要自行包裝"自動下載driver到指定路徑",可以 selenium-manager.exe -h 查看對應的調用方法。返回的是json裏面包含driver的路徑可以提取。

selenium-manager 1.0.0-M3
Selenium Manager is a CLI tool that automatically manages the browser/driver infrastructure required by Selenium.


Usage: selenium-manager.exe [OPTIONS]
Options:
  -b, --browser <BROWSER>
          Browser name (chrome, firefox, edge, iexplorer, safari, or safaritp)
  -d, --driver <DRIVER>
          Driver name (chromedriver, geckodriver, msedgedriver, IEDriverServer, or safaridriver)
  -v, --driver-version <DRIVER_VERSION>
          Driver version (e.g., 106.0.5249.61, 0.31.0, etc.)
  -B, --browser-version <BROWSER_VERSION>
          Major browser version (e.g., 105, 106, etc. Also: beta, dev, canary -or nightly- is accepted)
  -P, --browser-path <BROWSER_PATH>
          Browser path (absolute) for browser version detection (e.g., /usr/bin/google-chrome, "/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe")
  -O, --output <OUTPUT>
          Output type: LOGGER (using INFO, WARN, etc.), JSON (custom JSON notation), or SHELL (Unix-like) [default: LOGGER]
  -p, --proxy <PROXY>
          HTTP proxy for network connection (e.g., https://myproxy.net:8080)
  -t, --timeout <TIMEOUT>
          Timeout for network requests (in seconds) [default: 120]
  -D, --debug
          Display DEBUG messages
  -T, --trace
          Display TRACE messages
  -c, --clear-cache
          Clear driver cache
      --driver-ttl <DRIVER_TTL>
          Set default driver ttl [default: 86400]
      --browser-ttl <BROWSER_TTL>
          Set default browser ttl [default: 0]
      --clear-metadata
          Clear metadata file
  -h, --help
          Print help
  -V, --version
          Print version

selenium內部調用的返回樣例

C:\Windows\System32>"C:\Program Files\Python39\Lib\site-packages\selenium\webdriver\common\windows\selenium-manager.exe" --browser chrome --output json
{
  "logs": [
    {
      "level": "INFO",
      "timestamp": 1683613144,
      "message": "C:\\Users\\Administrator\\.cache\\selenium\\chromedriver\\win32\\112.0.5615.49\\chromedriver.exe"
    }
  ],
  "result": {
    "code": 0,
    "message": "C:\\Users\\Administrator\\.cache\\selenium\\chromedriver\\win32\\112.0.5615.49\\chromedriver.exe"
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章