2

对于一些测试,我设置了一个全新的 TrueNAS 12.3 FreeBSD Jail 并启动它,然后安装,python3并使用以下命令:firefoxgeckodriverpip

pkg install python3 firefox geckodriver py38-pip
pip install --upgrade pip
setenv CRYPTOGRAPHY_DONT_BUILD_RUST 1
pip install cryptography==3.4.7
pip install selenium

之后,当我想在我的 Python 代码中使用 Selenium 和 Firefox 时,它不起作用:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
options = Options()
options.headless = True
driver = webdriver.Firefox(options=options)

带来

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/firefox/webdriver.py", line 174, in __init__
    self.service.start()
  File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/common/service.py", line 98, in start
    self.assert_process_still_running()
  File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/common/service.py", line 110, in assert_process_still_running
    raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: Service geckodriver unexpectedly exited. Status code was: 64

有趣的是,在我大约一年前设置的另一个监狱中(大约也以上述方式),它可以正常工作并且不会抛出错误(所以可能是不同的版本?)!

这是唯一的内容geckodriver.log

geckodriver: error: Found argument '--websocket-port' which wasn't expected, orisn't valid in this context

USAGE:
    geckodriver [FLAGS] [OPTIONS]

For more information try --help

有什么我可以尝试让它工作的吗?我已经看过这个问题,但它似乎已经过时了。

Firefox 95.0.2、geckodriver 0.26.0、Python 3.8.12、Selenium 4.1.0

4

1 回答 1

2

此错误消息...

selenium.common.exceptions.WebDriverException: Message: Service geckodriver unexpectedly exited. Status code was: 64

GeckoDriver日志...

geckodriver: error: Found argument '--websocket-port' which wasn't expected, orisn't valid in this context

...意味着GeckoDriver无法启动/产生新的浏览上下文,即会话。


您的主要问题是您使用的二进制文件版本之间的不兼容,如下所示:

  • 您的Selenium 客户端版本是4.1.0
  • 但是您的GeckoDriver版本是0.26.0

正如他们在评论@ernstki中提到的:

您正在运行早于 0.30.0 的 geckodriver,它缺少--websocket-port选项,Selenium 的较新/新版本似乎依赖于该选项。

简而言之,在之前的GeckoDriver v0.29.0版本之前,该选项未使用,现在Selenium v​​4.0.1强制使用该选项。--websocket-port

在他的评论中也进一步@whimboo证实:

正如已经证明的那样,这里的问题不是 geckodriver 而是 Selenium。因此,您应该在 Selenium 存储库上创建一个问题,以便可以添加一个选项以不总是传递 --websocket-port 参数。如果该请求被拒绝,如果确实需要使用较旧的 geckodriver 版本进行测试,您将不得不使用较旧的 Selenium 版本。


解决方案

确保这件事:


FreeBSD 版本

如果您使用的是GeckoDriver版本较旧的 FreeBSD 版本,那么您必须将Selenium降级到v3.x级别。

命令(礼貌:Kurtibert):

  • 卸载

    pip3 uninstall selenium;
    
  • 安装

    pip3 install 'selenium<4.0.0'
    
于 2022-01-23T12:43:12.163 回答