DevTools remote debugging requires a non-default data directory. Specify this using --user-data-dir. Created TensorFlow Lite XNNPACK delegate for CPU.
上述标题是控制台完整报错
问题描述
- 笔者使用
Python 3.12.8
的selenium = "^4.29.0"
库搭配对应版本的chrome-driver
进行自动化测试 - 当浏览器版本更新到
136.0.7103.93 (正式版本) (64 位) (cohort: Stable)
后 - 出现无法导航到指定网站的情况(但是可以打开浏览器)
- 同时控制台报错,报错信息如下:
DevTools remote debugging requires a non-default data directory. Specify this using --user-data-dir.
Created TensorFlow Lite XNNPACK delegate for CPU.
Message: session not created
from chrome not reachable
Stacktrace:
GetHandleVerifier [0x00007FF76567CF25+75717]
GetHandleVerifier [0x00007FF76567CF80+75808]
(No symbol) [0x00007FF765448DCC]
(No symbol) [0x00007FF765439C21]
(No symbol) [0x00007FF76548BFD2]
(No symbol) [0x00007FF765486518]
(No symbol) [0x00007FF765481ADD]
(No symbol) [0x00007FF7654D52D8]
(No symbol) [0x00007FF7654D48B0]
(No symbol) [0x00007FF7654C7153]
(No symbol) [0x00007FF765490421]
(No symbol) [0x00007FF7654911B3]
GetHandleVerifier [0x00007FF76597D6FD+3223453]
GetHandleVerifier [0x00007FF765977CA2+3200322]
GetHandleVerifier [0x00007FF765995AD3+3322739]
GetHandleVerifier [0x00007FF7656969FA+180890]
GetHandleVerifier [0x00007FF76569E0FF+211359]
GetHandleVerifier [0x00007FF765685274+109332]
GetHandleVerifier [0x00007FF765685422+109762]
GetHandleVerifier [0x00007FF76566BA39+4825]
BaseThreadInitThunk [0x00007FF9221F259D+29]
RtlUserThreadStart [0x00007FF923BAAF38+40]
报错原因分析
- 上述报错的主要信息是:
DevTools remote debugging requires a non-default data directory. Specify this using --user-data-dir.
(翻译:DevTools 远程调试需要一个非默认的数据目录。请使用--user-data-dir
来指定) - 但是,我代码中,是指定了
--user-data-dir
这个参数的,如下代码:
# 设置当前工作目录
current_dir = os.path.dirname(os.path.abspath(__file__))
print(f"当前工作目录: {current_dir}")
# ChromeDriver路径
chromedriver_path = os.path.join(current_dir, 'chromedriver-win64', 'chromedriver.exe')
print(f"ChromeDriver路径: {chromedriver_path}")
# Chrome用户数据目录
user_data_dir = os.path.expandvars('%LOCALAPPDATA%\\Google\\Chrome\\User Data')
print(f"Chrome用户数据目录: {user_data_dir}")
profile_name = 'Default' # 具体文件夹名
# 创建Chrome选项对象参数
chrome_options = Options()
chrome_options.add_argument(f'--user-data-dir={user_data_dir}')
chrome_options.add_argument(f'--profile-directory={profile_name}')
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--remote-debugging-port=9222')
print('正在创建WebDriver服务实例...')
service = Service(executable_path=chromedriver_path)
print('正在创建WebDriver对象,启动浏览器...')
driver = webdriver.Chrome(service=service, options=chrome_options)
print('正在打开测试ip地址...')
driver.get('http://10.0.11.111:11111')
- 事实上,之前是一直可以正常运行的,但是由于谷歌浏览器会自动更新
- 导致,当浏览器更新了以后,就没法跑自动化测试任务了
- 所以,通过一番查找,找到了谷歌浏览器136版本的重大更新:
- 更改了远程调试开关以提高安全性
- 就是以前的谷歌浏览器版本,可以直接使用默认的谷歌浏览器的安装文件夹中的用户数据文件夹(个人资料路径),如下图
- 【使用个人资料路径的话,当我们使用selenium打开浏览器的时候,我们一些默认收藏的书签啥的就都有的】
- 自从136版本开始,这个文件夹就不允许直接指定使用了(出于安全考虑)
- 自从136版本开始,这个文件夹就不允许直接指定使用了(出于安全考虑)
- 自从136版本开始,这个文件夹就不允许直接指定使用了(出于安全考虑)
- 也就是
chrome_options.add_argument(f'--user-data-dir={user_data_dir}')
- 这个
user_data_dir
必须要自己指定一个文件夹了 - 比如,我指定
chrome_options.add_argument(r"--user-data-dir=C:\test-chrome")
- 如果C盘有这个文件夹,就直接使用,没有的话,就会自动创建这个名字的文件夹
- 【我们只能在自己指定的文件夹中,即测试浏览器打开的时候,进行一些收藏操作等】
- 如下图:
- 上图中的
test-chrome
文件夹,就相当于C:\Users\user\AppData\Local\Google\Chrome\User Data
(打开这两个文件夹对比一下内容就知道了)
至此,问题解决
--user-data-dir
和 --profile-directory
的回顾
--user-data-dir
文件夹是浏览器存储用户配置文件的目录--profile-directory
文件夹是我们要与启动的用户配置文件里面的具体哪个文件夹--profile-directory
文件内部存储了很多信息,比如 收藏的地址栏信息、登录信息、cookies、sessionStoarge
等...user-data-dir
可以有多个profile-directory
- 浏览器每登录一个新的user后,浏览器就会自动新增一个
profile-directory
文件夹 - 默认就是
user-data-dir\Default
、新增的就是user-data-dir\Profile 2
和user-data-dir\Profile 3
- 大家可以在地址栏输入:
chrome://version/
也能看到一些相关信息
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。