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"
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章