先闢謠!“新版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"
}
}