Docker无头Chromium环境触发ChromeDriver IsSupportedClipboardBuffer崩溃求助
问题背景
目标为创建搭载无头Chromium的AWS DockerImageFunction,用于运行behave+Selenium+Python技术栈的测试用例。
版本信息
- Chrome版本:89.0.4389.128
- ChromeDriver版本:89.0.4389.23
- Selenium版本:3.141.0
运行环境
- RedHat Linux
- Docker容器
故障现象
向网站模态框内的输入框发送按键指令时ChromeDriver崩溃。单次发送LEFT指令后执行Keys.NUMPAD1无异常,发送多次LEFT指令后WebDriver就会崩溃。输入框存在入场动画,已等待动画执行完成仍无法解决问题。
触发故障的代码片段
input_field = self.driver.wait.for_clickability_of_element(MOBILE_NUM_INPUT) input_field.focus() input_field.click() input_field.send_keys(Keys.LEFT) input_field.send_keys(Keys.LEFT) input_field.send_keys(Keys.NUMPAD1) input_field.send_keys(Keys.NUMPAD0)
ChromeDriver错误日志
lambda_1 | [1624797899.659][DEBUG]: DevTools WebSocket Command: Input.dispatchKeyEvent (id=1263) 37EEB46F526E1B95F6DDDC7454E78A14 { lambda_1 | "code": "Numpad1", lambda_1 | "isKeypad": true, lambda_1 | "key": "1", lambda_1 | "modifiers": 0, lambda_1 | "text": "1", lambda_1 | "type": "keyDown", lambda_1 | "unmodifiedText": "1", lambda_1 | "windowsVirtualKeyCode": 97 lambda_1 | } lambda_1 | [0627/124459.630384:FATAL:headless_clipboard.cc(296)] Check failed: IsSupportedClipboardBuffer(buffer).
当前使用的Chrome启动参数
options.binary_location = '/opt/bin/headless-chromium' options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--disable-gpu-sandbox') options.add_argument('--disable-gpu') options.add_argument('--single-process') options.add_argument('--headless') options.add_argument('--user-data-dir=/tmp/user-data') options.add_argument('--data-path=/tmp/data-path') options.add_argument('--homedir=/tmp') options.add_argument('--disk-cache-dir=/tmp/cache-dir') options.add_argument('--use-system-clipboard') options.add_argument('--allow-no-sandbox-job') options.add_argument('--remote-debugging-port=9222')
解决方案
该故障为Chrome 89版本无头模式的已知bug:启用--use-system-clipboard参数后,多次触发键盘方向键操作会调用不支持的剪贴板缓冲区,导致进程直接崩溃,可按以下步骤修复:
- 移除
options.add_argument('--use-system-clipboard')配置,无头模式下无特殊需求不需要调用系统剪贴板,该参数是引发崩溃的直接诱因。 - 可选优化输入逻辑:避免多次单独调用
send_keys发送方向键,合并为单次调用减少I/O交互次数,修改后代码如下:
input_field = self.driver.wait.for_clickability_of_element(MOBILE_NUM_INPUT) input_field.click() # 合并按键操作 input_field.send_keys(Keys.LEFT * 2 + Keys.NUMPAD1 + Keys.NUMPAD0)
- 如确实需要使用系统剪贴板能力,可将Chrome/ChromeDriver版本升级到91及以上,该版本官方已修复
headless_clipboard.cc的缓冲区校验问题。
内容的提问来源于stack exchange,提问作者szombati_attila
相关产品推荐
相关产品推荐

