先辟谣!“新版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"
}
}