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/也能看到一些相關信息
參考文章
- 更改了遠程調試開關以提高安全性 | Blog | Chrome for Developers
- ChromeDriver v136 Error: -user-data-dir - AutoIt General Help and Support - AutoIt Forums (autoitscript.com)
- python - Selenium 4.25 opens Chrome 136 with existing profile to "New Tab" instead of navigating with driver.get() - Stack Overflow