操作系统:AWS EC2 Ubuntu 22.04.1 LTS
Python:3.10.6
火狐:Mozilla 火狐 107.0
壁虎驱动程序:0.32.0 (2022-11-10)
UFW(Ubuntu 防火墙):不活动
其他:最新版本
from selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.firefox.options import Options as FirefoxOption
from webdriver_manager.firefox import GeckoDriverManager
options = FirefoxOption()
options.headless = True
service = FirefoxService(GeckoDriverManager().install())
# <selenium.webdriver.firefox.service.Service object at 0x7f008f2a7c70>
driver = webdriver.Firefox(
service=service,
options=options
)
当我运行这段代码时
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/ubuntu/.local/share/virtualenvs/tool-lKp4P5xD/lib/python3.10/site-packages/selenium/webdriver/firefox/webdriver.py", line 197, in __init__
super().__init__(command_executor=executor, options=options, keep_alive=True)
File "/home/ubuntu/.local/share/virtualenvs/tool-lKp4P5xD/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 290, in __init__
self.start_session(capabilities, browser_profile)
File "/home/ubuntu/.local/share/virtualenvs/tool-lKp4P5xD/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 383, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/home/ubuntu/.local/share/virtualenvs/tool-lKp4P5xD/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 450, in execute
self.error_handler.check_response(response)
File "/home/ubuntu/.local/share/virtualenvs/tool-lKp4P5xD/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 249, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: Failed to read marionette port
我遇到了问题。
在我看来,我认为这是Geckodriver和Firefox之间的通信问题。
但我不知道如何解决。
此外,我已经尝试使用“pyvirtualdisplay”或“xvfb”。
但结果是一样的。
(https://azevedorafaela.com/tag/headless-browser-in-ubuntu/)
我找到了另一种方法。
我读了这篇文章。
https://github.com/SeleniumHQ/selenium/issues/10813
我认为这是你在 Ubuntu Snap 包管理器上安装 Firefox 时出现的问题。
它适用于 Ubuntu 20.04。
因为 Snap 不是该版本的默认包管理器。
这可能是在 Ubuntu 22.04 上删除 Snap 的另一种解决方案
我的解决方案是删除已安装的
geckodriver
的一个版本,因为我有两个版本:
用
whereis geckodriver
检查。就我而言,结果是:
geckodriver: /usr/bin/geckodriver /snap/bin/geckodriver
我用
sudo rm /usr/bin/geckodriver
删除了一个版本,您所描述的错误 (selenium.common.exceptions.TimeoutException: Message: Failed to read marionette port
) 不再出现。
我认为使用 apt/snap 安装的 Firefox 二进制文件存在错误,当我从 apt 软件包存储库安装 Firefox 时,我遇到了同样的问题。我通过从 official mozilla source 下载 firefox 并将符号链接二进制文件到 /usr/bin/firefox/
解决了这个问题首先从系统中删除 Firefox。
apt remove firefox
从官方来源下载 Firefox。 (您可能需要更换下载网址)
wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/116.0.3/linux-x86_64/en-US/firefox-116.0.3.tar.bz2
将下载的存档解压到您想要的位置。我正在使用 opt 来提取存档。
tar -xf firefox-116.0.3.tar.bz2 --directory /opt/
然后将 firefox 二进制文件符号链接到 /usr/bin
ln -s /opt/firefox/firefox /usr/bin/firefox