无法在 WSL 上使用 snap 安装 chromium

chi*_*ntu 1 python selenium chromium selenium-chromedriver windows-subsystem-for-linux

/usr/bin/chromium-browser我运行了它提到的使用 snap 安装 chromium 的命令
,当我这样做时,它抛出了一个新错误。以下是命令的输出snap version.

snap 2.51.1+20.04ubuntu2
snapd 不可用
系列 -

chromium-browser

命令“/usr/bin/chromium-browser”需要安装 chromium snap。请安装它:

snap install chromium

snap安装chromium错误:无法与服务器通信:发布http://localhost/v2/snaps/chromium:拨打unix /run/snapd.socket:连接:没有这样的文件或目录

whereis chromedriver
chromedriver: /usr/bin/chromedriver /usr/local/bin/chromedriver

我遇到了所有这些,因为我正在尝试测试一个简单的硒程序:

import requests
import unittest

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('/usr/bin/chromedriver')
driver.get("https://www.python.org")
print(driver.title)
Run Code Online (Sandbox Code Playgroud)

这引发了以下错误:

Traceback (most recent call last):
  File "test_ui.py", line 7, in <module>
    driver = webdriver.Chrome('/usr/bin/chromedriver')
  File "/home/chintu/anaconda3/lib/python3.8/site-packages/selenium/webdriver/chrome/webdriver.py", line 76, in __init__
    RemoteWebDriver.__init__(
  File "/home/chintu/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/chintu/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/chintu/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/chintu/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/chromium-browser is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
  (Driver info: chromedriver=2.41.578700 (2f1ed5f9343c13f73144538f15c00b370eda6706),platform=Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)
Run Code Online (Sandbox Code Playgroud)

不确定是否会出现这些问题,因为我在 windows-10 上使用 WSL

Not*_*1ds 9

不确定是否会出现这些问题,因为我在 Windows 10 上使用 WSL

嗯,是。虽然 WSL 功能非常强大,但它仍然有一些限制,需要了解这些限制才能充分利用它。您目前遇到的主要问题是WSL 不支持开箱即用的 Systemd。

您尚未遇到但将会遇到的第二个问题是Windows 10 上的 WSL 不支持开箱即用的 GUI 应用程序。

对于您的特定用途,第二部分最容易克服。只需以无头模式运行浏览器,这样它就不会尝试输出到显示器。执行此操作的代码示例位于此答案中,我已在 Windows 10 WSL/Ubuntu 系统上对其进行了测试。

请注意,这在 Windows 11 下不是问题,因为 WSLg 功能允许您运行 GUI 应用程序。正如我在这个超级用户答案中介绍的那样,也可以使用其他方法来克服。我还通过 xrdp 运行 Selenium,没有出现任何问题。

第一个问题有点棘手。在 Ubuntu 上,Chromium 是通过 Snap 安装的,这几乎需要 Systemd。不幸的是,Systemd 坚持作为主进程(PID 1)运行,否则它就无法工作。WSL 需要自己的 PID1 ('/init') 才能提供与 Windows 的互操作性。

但是,您仍然有多种选择。我将按照我的偏好顺序列出这些:

选项 1:使用 Google Chrome,而不是 Chromium

我能够使用官方的 Google Chrome Debian 软件包相应的 webdriver在 Ubuntu 下运行您的示例代码(经过无头修改) 。

这是迄今为止最简单的解决方案。

选项 2:使用不需要 Snap 的发行版来安装 Chromium

我也使用我的自定义 Artix 发行版成功地做到了这一点,但我相信 Arch Linux 也能工作,因为据我所知,它们使用相同的 Chromium 软件包。

作为额外的好处,该chromium软件包还包含在内chromedriver,无需找到匹配的版本来单独安装。

缺点是,您需要wsl --import根据此 Microsoft 指南手动创建 Artix 或 Arch rootfs ,并了解如何配置它。

选项 3:在 WSL/Ubuntu 上运行 Systemd

虽然我不会在这里介绍所有步骤,但有许多适用于 WSL 的 Systemd 帮助程序,包括Geniedistrod等。

这些的核心工作方式都是相同的,即创建一个新的 Linux PID 命名空间,其中 SystemdPID1,然后将您放入该命名空间内。我真的不推荐新用户使用它。您的 WSL 系统上有很多东西发生了变化,恕我直言,在将 Systemd 与 WSL 一起使用之前,您最好对 Systemd 有深入的了解。

但是,它作为一个选项存在。我相信您可以安装 Snap,但我个人还没有尝试过。但是,在 Windows 10 上,由于缺乏显示,您在安装 Chromium snap 时可能仍然会遇到问题,如果是这样,您需要单独解决此问题。