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 chromiumsnap安装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
不确定是否会出现这些问题,因为我在 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 的互操作性。
但是,您仍然有多种选择。我将按照我的偏好顺序列出这些:
我能够使用官方的 Google Chrome Debian 软件包和相应的 webdriver在 Ubuntu 下运行您的示例代码(经过无头修改) 。
这是迄今为止最简单的解决方案。
我也使用我的自定义 Artix 发行版成功地做到了这一点,但我相信 Arch Linux 也能工作,因为据我所知,它们使用相同的 Chromium 软件包。
作为额外的好处,该chromium软件包还包含在内chromedriver,无需找到匹配的版本来单独安装。
缺点是,您需要wsl --import根据此 Microsoft 指南手动创建 Artix 或 Arch rootfs ,并了解如何配置它。
虽然我不会在这里介绍所有步骤,但有许多适用于 WSL 的 Systemd 帮助程序,包括Genie、distrod等。
这些的核心工作方式都是相同的,即创建一个新的 Linux PID 命名空间,其中 Systemd是PID1,然后将您放入该命名空间内。我真的不推荐新用户使用它。您的 WSL 系统上有很多东西发生了变化,恕我直言,在将 Systemd 与 WSL 一起使用之前,您最好对 Systemd 有深入的了解。
但是,它作为一个选项存在。我相信您可以安装 Snap,但我个人还没有尝试过。但是,在 Windows 10 上,由于缺乏显示,您在安装 Chromium snap 时可能仍然会遇到问题,如果是这样,您需要单独解决此问题。