开发笔记

返回首页

2021 年

终端 Chrome 启动失败

如下错误:

selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
(unknown error: DevToolsActivePort file doesn't exist)

代码如下:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--headless')

browser = webdriver.Chrome(
    executable_path = "/usr/lib64/chromium-browser/chromedriver", 
    options = options, 
    service_log_path='/tmp/ch.txt')
browser.get('http://www.baidu.com/')
print(browser.title)

分析

存在两个 chromedriver 程序:

$ whereis chromedriver
chromedriver: /usr/bin/chromedriver /www/42as/pythonenv/bin/chromedriver

/usr/bin/chromedriver 是个软连接,指向 /usr/lib64/chromium-browser/chromedriver — 代码里直接用的这个绝对路径,且其权限是普通用户 — 因此不需要用 --no-sandbox 选项。

查看日志:

$ cat /tmp/ch.txt
...
Launching chrome: /usr/bin/google-chrome --allow-pre-commit-input --disable-background-networking --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-hang-monitor --disable-popup-blocking --disable-prompt-on-repost --disable-sync --enable-automation --enable-blink-features=ShadowDOMV0 --enable-logging --headless --log-level=0 --no-first-run --no-service-autorun --password-store=basic --remote-debugging-port=0 --test-type=webdriver --use-mock-keychain --user-data-dir=/tmp/.org.chromium.Chromium.KkIivO data:,

由此可见 --headless, --disable-dev-shm-usage 这两个参数已正确配置。尝试在终端下直接运行这个命令,有两个错误提示:

  1. --allow-pre-commit-input — 删除它
  2. --log-level=0 — 修改为 --log-level=DEBUG

即可在终端正常运行,注意到 ChromeDriver 默认在 9515 端口监听

通过 $ chromedriver --help 命令查看:

  1. --disable-dev-shm-usage 的含义为如果发现是共享内存错误,使用此参数可避免使用 /dev/shm 共享内存
  2. --log-level 的合法取值为 ALL, DEBUG, INFO, WARNING, SEVERE, OFF

因此怀疑可能是版本问题?

尝试另一种方式:

from selenium.webdriver.chrome.service import Service
service = Service('/usr/lib64/chromium-browser/chromedriver')
service.start()
browser = webdriver.Remote('http://127.0.0.1:9515')

报错:

urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=9515): Max retries exceeded with url: /session (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fa0df6e1828>: Failed to establish a new connection: [Errno 111] Connection refused',))

在另一终端手工启动 ChromeDriver,再次运行脚本,则依然是 DevToolsActivePort 错误。

最终解决: 同事忘了安装 Chrome,yum 安装即可。

Selenium

Selenium 的组成:

  1. WebDriver 对网站进行自动化操作,模拟人类行为
  2. Grid 跨平台测试
安装 Selenium 库

Python 安装:

$ pip install selenium
安装浏览器驱动

WebDriver 的工作模式:WebDriver — Driver — 浏览器

Driver 是指:ChromeDriver, GeckoDriver (Firefox) 等。

其他
Mock browsers
模拟浏览器。
HtmlUnit
一个 Java 无 GUI 浏览器。
PhantomJS
基于 Webkit 的 headless 浏览器。自 2017 年 8 月以来就不再更新,缘故是 Google 发布了 headless 版本的 Chrome。

笔记于 2021 年 11 月 2 日

京ICP备12052177号-1