首页 > 解决方案 > selenium WebDriverException:消息:未知错误:使用 Selenium Python 使用 ChromeDriver Chrome 提取页面源时出现错误检查器消息

问题描述

我正在抓取一个包含 100MB 大小的大页面的网站。

驱动设置:

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("window-size=1920,1080")
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--ignore-certificate-errors')
driver = webdriver.Chrome(executable_path="chromedriver",  chrome_options=chrome_options)

以下代码

html = driver.page_source

导致错误:

selenium WebDriverException: Message: unknown error: bad inspector message
(Session info: headless chrome=66.0.3359.181)
(Driver info: chromedriver=2.38.552518 (183d19265345f54ce39cbb94cf81ba5f15905011),platform=Mac OS X 10.11.6 x86_64)

不可能是我的笔记本电脑上的“内存不足”

标签: pythonseleniumgoogle-chromeweb-scrapingselenium-chromedriver

解决方案


此错误消息...

selenium WebDriverException: Message: unknown error: bad inspector message

...意味着ChromeDriver在执行代码行时由于 JSON 编码/解码问题而无法解析一些非 UTF-8 字符:

html = driver.page_source

分析

参考John Chen(所有者 - Google Chrome 的 WebDriver)在讨论问题 1860 中的评论:“WebDriverException:消息:未知错误:错误的检查器消息:”在尝试获取 page_source 时可能是您的用例中网站的页面源FFFF包含无效字符的Unicode 字符点。Chrome\uFFFF在将其发送到 ChromeDriver 之前对其进行编码,但 ChromeDriver 然后在解码时将其拒绝为无效。

John Chen(所有者 - Google Chrome 的 WebDriver)进一步补充说

JSON 编码发生在 DevTools 的协议布局中,就在结果被发送回 ChromeDriver 之前。相关代码在https://cs.chromium.org/chromium/src/out/Debug/gen/v8/src/inspector/protocol/Protocol.cpp中。特别是,escapeStringForJSON 函数负责对字符串进行编码。其实挺保守的。任何高于 126 的内容都以 \uXXXX 格式编码。(注意 Protocol.cpp 是一个生成的文件,真正的来源是https://cs.chromium.org/chromium/src/v8/third_party/inspector_protocol/lib/Values_cpp.template。)

该错误发生在 ChromeDriver 使用的 JSON 解析器中。\uXXXX 序列的解码发生在https://cs.chromium.org/chromium/src/base/json/json_parser.cc?l=564https://cs.chromium.org/chromium/src/base/ json/json_parser.cc?l=670。解码转义序列后,解码器会拒绝任何不是有效 Unicode 字符的内容。

我注意到最近发生了一项更改,以防止 JSON 编码器发出无效的 Unicode 代码点:https ://crrev.com/478900 。不幸的是,该错误所涉及的代码不是使用 JSON 编码器,因此它不能直接帮助我们,但这表明我们并不是唯一受此类问题影响的人。


解决方案

此问题已在 chromedriver 中解码无效 UTF 字符串时替换无效 UTF-16 转义序列得到解决,因为 Web 平台测试可能使用 ECMAScript 字符串,这些字符串在此修订/提交中不一定是 utf-16 字符

因此,一个快速的解决方案是确保以下内容并重新执行您的测试:


选择

作为替代方案,您可以使用GeckoDriver / Firefox组合,您可以在 Chromedriver 中找到相关讨论,仅支持 BMP 错误中的字符,同时使用 Selenium Python 将带有 ChromeDriver Chrome 的表情符号发送到 Tkinter 的 label() 文本框


推荐阅读