Selenium driver.page_source导致错误检查错误消息

时间:2018-05-21 15:30:59

标签: python selenium selenium-chromedriver

我正在抓取一个大小为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)

它不可能是一个"内存不足"在我的笔记本电脑上

1 个答案:

答案 0 :(得分:0)

此错误消息...

selenium WebDriverException: Message: unknown error: bad inspector message

...表示 ChromeDriver 由于执行代码行时由于JSON编码/解码问题而无法解析某些非UTF-8字符:

html = driver.page_source

分析

在讨论comment中参考John Chen(Google Chrome浏览器WebDriver的所有者)的Issue 1860: "WebDriverException: Message: unknown error: bad inspector message:" when attempting to get page_source,您用例中网站的 Page Source 可能包含Unicode字符点FFFF,它是无效字符。在将其发送到ChromeDriver之前,Chrome会将其编码为\uFFFF,但是ChromeDriver会在解码时将其视为无效。

John Chen(Google Chrome浏览器的WebDriver所有者)进一步added

在将结果发送回ChromeDriver之前,JSON编码发生在DevTools的协议布局中。相关代码在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平台测试可能会通过此{{3 }} / revision

因此,一种快速的解决方案是确保以下各项并重新执行测试:


替代

作为替代方案,您可以使用 GeckoDriver / Firefox 组合,并且可以在ChromeDriver v79.0 release notes

中找到相关的讨论