【问题标题】:Selenium remote driver unable to find geckodriverSelenium 远程驱动程序无法找到 geckodriver
【发布时间】:2019-01-14 00:36:53
【问题描述】:

我正在尝试使用 Selenium 启动远程 Firefox 会话。代码如下:

def Mozilla():
    from selenium.webdriver.firefox.options import Options as Options_Mozilla
    sys.path.append("/opt/app/venv/bin")
    ff_options = Options_Mozilla()
    ff_options.add_argument("--headless")
    ff_options.set_preference("network.proxy.type", 1)
    ff_options.set_preference("network.proxy.http", "some_address")
    ff_options.set_preference("network.proxy.http_port", 8080)
    ff_options.set_preference("network.proxy.ssl", "some_address")
    ff_options.set_preference("network.proxy.ssl_port", 8080)
    #profile.update_preferences()
    #builtins.browser = webdriver.Firefox(firefox_profile=profile, firefox_options=ff_options)
    #builtins.browser = webdriver.Firefox(firefox_options=ff_options)
    builtins.browser = webdriver.Remote(command_executor="http://some_other_address/wd/hub", desired_capabilities=ff_options.to_capabilities())

当代码执行时,我得到:

Traceback (most recent call last):
  File "Creditview_PL.py", line 15, in <module>
    DS.Mozilla()
  File "/home/ad.ing.net/ji34ix/Projects/DS/DziadowskieSelenium.py", line 35, in Mozilla
    builtins.browser = webdriver.Remote(command_executor="http://172.22.164.33:4444/wd/hub", desired_capabilities=ff_options.to_capabilities())
  File "/opt/app/venv/lib64/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 156, in __init__
    self.start_session(capabilities, browser_profile)
  File "/opt/app/venv/lib64/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 251, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/opt/app/venv/lib64/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 320, in execute
    self.error_handler.check_response(response)
  File "/opt/app/venv/lib64/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: The path to the driver executable must be set by the webdriver.gecko.driver system property; for more information, see https://github.com/jgraham/wires. The latest version can be downloaded from https://github.com/jgraham/wires

当我使用此代码(没有远程驱动程序)时令我惊讶:

def Mozilla():
    from selenium.webdriver.firefox.options import Options as Options_Mozilla
    sys.path.append("/opt/app/venv/bin")
    ff_options = Options_Mozilla()
    ff_options.add_argument("--headless")
    ff_options.set_preference("network.proxy.type", 1)
    ff_options.set_preference("network.proxy.http", "some_address")
    ff_options.set_preference("network.proxy.http_port", 8080)
    ff_options.set_preference("network.proxy.ssl", "some_address")
    ff_options.set_preference("network.proxy.ssl_port", 8080)
    builtins.browser = webdriver.Firefox(firefox_options=ff_options)

一切正常!找到 geckodriver 完全没有问题。

我还确认带有 geckodriver 的文件夹在 Path 中。它必须是,否则第二个代码将无法工作。常见的互联网知识建议设置 webdriver.gecko.driver 系统属性,但示例代码看起来不像 Python。如您所见,我使用了 sys.path.append 但它根本没有帮助。

Some versions:
Mozilla Firefox 60.1.0
geckodriver 0.21.0
selenium==3.13.0

网格节点的配置:

java -jar /opt/Selenium_grid/selenium-server-standalone-2.49.1.jar -role node -port 5555 -maxInstances=10 -Dwebdriver="opt/app/venv/bin" &> nodelog1.txt &

那么,谁能帮我弄清楚为什么远程驱动程序找不到壁虎驱动程序?

【问题讨论】:

    标签: python-3.x selenium-webdriver selenium-grid geckodriver


    【解决方案1】:

    当我使用这段代码(没有远程驱动程序)时,令我惊讶的是:一切 有效!找到 geckodriver 完全没有问题。我也确认 带有 geckodriver 的文件夹位于 Path 中。必须这样,否则 第二个代码将无法工作。

    您正在比较两种不同的执行模式。第二个变体基本上是尝试在你开始运行 python 测试用例的同一台机器上打开一个 firefox 浏览器。

    第一个变体基本上是尝试在远程机器上打开 Firefox 浏览器(这里我假设您的网格在另一台机器上运行)。所以这里发生的事情是 Selenium 基本上告诉你它在远程机器中找不到 geckodriver(具体来说是一个 selenium 节点)。

    要解决此问题,您有两种选择:

    1. 将 geckodriver 二进制文件的位置添加到远程 selenium 节点上的 PATH 变量中,杀死你的 selenium 节点,关闭终端并打开一个新的(以便新读取 PATH),然后重新启动你的节点。
    2. 在节点启动命令的开头添加 JVM 参数。类似java -Dwebdriver.gecko.driver=opt/app/venv/bin -jar /opt/Selenium_grid/selenium-server-standalone-2.49.1.jar -role node -port 5555 -maxInstances=10 &amp;&gt; nodelog1.txt &amp;

    PS:您在 selenium 网格端使用的是非常旧版本的 Selenium (2.49.1)。请考虑升级到最新版本(截至今天为 3.14.0)

    【讨论】:

    • 感谢您的付出。我已经解决了这个问题。因为我只是在测试网格,所以一切都设置在一台机器上。集线器和 geckodriver 试图在同一个端口上侦听,因此节点无法将指令传递给驱动程序。看起来它们被送回集线器:) 当我更改集线器的端口时,一切都开始正常工作。也感谢您指出网格的版本,现在已经升级了。
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 2017-07-09
    • 2017-09-11
    • 2013-12-19
    • 2023-04-04
    • 1970-01-01
    • 2016-12-16
    • 2016-08-05
    相关资源
    最近更新 更多