【问题标题】:How to fix "WebDriverException: Message: connection refused"?如何修复“WebDriverException:消息:连接被拒绝”?
【发布时间】:2018-06-03 21:01:07
【问题描述】:

我正在使用非常复杂的设置来测试各种非公开网页。我使用jenkinsdockerimage 中运行python-selenium 测试。这样,我就完全独立于 jenkins 环境,可以创建自己的环境。在这种环境下,我安装了以下软件:

  • 火狐:57.0.1
  • 壁虎驱动:0.18.0
  • 鼻子测试:1.3.7
  • 硒:3.8.0

硒测试通过以下方式创建WebDriver

profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.dir", self.downloadpath)
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.useDownloadDir", True)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("pdfjs.disabled", True)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk",
"application/force-download, image/png, text/html, text/plain, "
"image/tiff, text/csv, application/zip, application/octet-stream")
profile.set_preference("browser.download.manager.alertOnEXEOpen", False)
profile.set_preference("browser.download.manager.focusWhenStarting", False)
profile.set_preference("browser.helperApps.alwaysAsk.force", False)
profile.set_preference("browser.download.manager.alertOnEXEOpen", False)
profile.set_preference("browser.download.manager.closeWhenDone", True)
profile.set_preference("browser.download.manager.showAlertOnComplete", False)
profile.set_preference("browser.download.manager.useWindow", False)
profile.set_preference("services.sync.prefs.sync.browser.download.manager.showWhenStarting",
False)
self.driver = webdriver.Firefox(profile, log_path = logfile)

logfileself.downloadpath 是 docker 设置中的两个有效路径。

整个测试套件由 6 个独立的测试用例组成,每个测试用例的设置与上述相同。它们通常运行良好且完整,没有问题。

但是如果没有对测试或常规设置进行任何更改,测试有时会失败并显示以下错误消息:

  File "/root/tests/bsp_usecase_tests/tools/basicsuite.py", line 210, in set_driver_firefox
    self.driver = webdriver.Firefox(profile, log_path = logfile)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 158, in __init__
    keep_alive=True)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 154, in __init__
    self.start_session(desired_capabilities, browser_profile)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 243, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 311, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
    raise exception_class(message, screen, stacktrace)
WebDriverException: Message: connection refused

我有两个问题:

  1. 这里拒绝什么连接?报错信息是什么意思
  2. 如何才能修复此错误?

附录

  • 当我在webdriver.Firefox 行之前使用time.sleep(10) 时,错误不再出现。我应该把那行放在一个 while-try-except 循环中吗?

【问题讨论】:

  • 您是否使用虚拟显示器来运行硒测试? Afaik jenkins 在无头环境中运行,因此您需要 Xvfb 来实例化 firefox 驱动程序。较新版本的 Firefox 也可以在无头环境中工作 - 要使用它,您必须在选项中传递标志:opts = selenium.webdriver.firefox.options.Options(); opts.add_argument('-headless');driver = webdriver.Firefox(firefox_profile=profile, firefox_options=opts)
  • 此错误/堆栈跟踪表明驱动程序无法启动其内部服务器以与 python 客户端通信。这可能是生成的端口号上的竞争条件,或者可能是 docker 映像缺少内存,在下一次测试开始时没有按时回收。在任何情况下,您的问题都需要一个可重现的示例,并分析来自您的帖子中不存在的操作系统、浏览器和驱动程序的日志。

标签: python selenium firefox jenkins geckodriver


【解决方案1】:

您看到的错误是:

WebDriverException: Message: connection refused

根据文档WebDriverExceptionBase webdriver exception,如下所示:

exception selenium.common.exceptions.WebDriverException(msg=None, screen=None, stacktrace=None)

所以connection is refused here表示Selenium无法建立你想通过的连接:

self.driver = webdriver.Firefox(profile, log_path = logfile)

一种可能的解决方案是提供logfile 的完整名称以及logfilelogical location(来自Project Level),如下所示:

self.driver = webdriver.Firefox(firefox_profile=profile, log_path='./Log/geckodriver.log')

在这里你可以找到类似的Discussion

同样,正如您提到的 When I used a time.sleep(10) just before the webdriver.Firefox line, the error did not show up anymore,所以我假设之前有一个 GeckoDriverFirefox Browser 客户端实例处于活动状态。因此,与@Florent B. 提到的类似,您必须保护您的脚本免受Race Around Condition 的影响,这可能源于以下任何一种情况:

  • 新会话访问相同的日志文件,而之前的会话尚未发布。
  • 通过 GeckoDriverMarionette 访问相同的端口号 由上一个会话尚未发布的新会话。
  • 无法访问 CPU
  • 缺乏物理记忆
  • 缺少交换内存
  • 缺少光盘缓存
  • 缺乏网络带宽
  • Docker Image 内存不足

您可以在这里找到类似的Discussion

根据上述原因,您需要遵循以下几个步骤:

  • 始终使用最新发布的Selenium-Python clientWebDriver variant (GeckoDriver) 和 Web Browser (Firefox Browser >)
  • 始终在 tearDown() 方法中使用 quit(),以便正确销毁 webdriverwebclient .
  • Clean 执行Test Suite 之前和之后的IDE 中的项目工作区
  • Clear 执行您的Tests 之前和之后的浏览器缓存
  • 定期使用CCleaner 工具清除操作系统杂务,包括陈旧的rust_mozprofile directories

【讨论】:

  • 我可以改变它。但是,您的回答并不简单,WebDriverException 是什么,您的回答也没有讨论可能的合适原因,为什么我只是偶尔会收到此错误...
【解决方案2】:

这里拒绝什么连接?错误信息是什么意思

Python webdriver API 和您的 Firefox 网络浏览器之间的连接。好吧,不是连接本身,而是 webdriver 发送的单个请求被浏览器“拒绝”。请注意,这通过JSON Wire protocol - JSON over HTTP 起作用。

我该如何解决这个错误?

通常,如果出现此类错误,最常见的原因是兼容性问题。换句话说,我怀疑您的 geckodriver 版本 0.18.0 对于 Firefox 57 来说太旧了。将geckodriver升级到最新的稳定版本(当前为0.19.1)。

【讨论】:

    【解决方案3】:

    一个快速修复尝试为其他任何人在此或类似错误中苦苦挣扎 - 我发现删除我的 geckodriver.log 文件摆脱了这个错误。

    DebanjanB 的回答的“清理项目工作区”部分暗示了这一点,但我只是想分享为我修复它的具体操作。请注意,我没有使用像原始海报那样的测试套件。

    我想发生在我身上的是,由于我仍在调试的另一部分代码中的错误,我的代码中有以前的 webdriver.Firefox 实例从未到达 driver.close()日志文件geckodriver.log

    因此我想这个问题也可以通过重命名日志文件或写入不同的日志文件来解决。

    【讨论】:

    • 您使用的是哪个操作系统?如果我在 Spring 上使用 geckodriver(部署在 tomcat 上),你能猜到日志文件的位置是什么
    • @MihirJoshi,我使用的是 Linux。我不确定在您的情况下日志文件的位置在哪里。很早以前我就这样做了,所以不太记得细节了,不幸的是。
    【解决方案4】:

    我遇到了同样的问题,发现是权限问题。我在 apache 中运行 Selenium,而 apache 文件夹没有正确的权限。 selenium、geckodriver 或 firefox 尝试在 /var/www/ 目录中创建文件和文件夹,但它没有这样做的权限。

    您可以使用以下命令解决此问题:

    chmod a+rwx /var/www/
    

    上面的命令可以工作,但可能不安全,因为它让每个人都可以访问该文件夹。如果你想让它更安全一点,试试:

    chown www-data /var/www/
    

    这都是快速破解,更好的方法是找出 geckodriver 在文件夹中创建文件的原因,并更改该文件夹设置(我没有这样做)。

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 2017-01-25
      • 1970-01-01
      • 2021-10-04
      • 2021-09-23
      • 2015-04-25
      • 2023-03-21
      • 2022-10-20
      相关资源
      最近更新 更多