如何解决" WebDriverException:消息:连接被拒绝"?

时间:2017-12-21 08:13:46

标签: python selenium firefox jenkins geckodriver

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

  • Firefox:57.0.1
  • geckodriver:0.18.0
  • nosetests:1.3.7
  • selenium:3.8.0

selenium测试以下列方式创建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是泊坞窗设置中的两个有效路径。

整个测试套件包含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. 我怎样才能修复此错误?
  3. 附录

    • 当我在time.sleep(10)行之前使用webdriver.Firefox时,错误不再显示。我把那条线放在了一个while-try-except循环中?

4 个答案:

答案 0 :(得分:5)

您看到的错误是:

WebDriverException: Message: connection refused

根据文档WebDriverException基本网络驱动程序例外,如下所示:

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的完整名称以及logical location的{​​{1}}(来自logfile),如下所示:

Project Level

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

同样,正如您提到的self.driver = webdriver.Firefox(firefox_profile=profile, log_path='./Log/geckodriver.log') ,我假设之前有一个 When I used a time.sleep(10) just before the webdriver.Firefox line, the error did not show up anymore GeckoDriver 客户端活动的实例。因此,与@Florent B.提到的一样,你必须保护你的脚本免受面临Race Around Condition的攻击,这可能源于以下任何一种情况:

  • 通过之前会话尚未发布的新会话访问相同的日志文件
  • 通过 Firefox Browser GeckoDriver 访问相同的端口号前一个会话所具有的新会话'尚未发布。
  • 无法访问 CPU
  • 缺乏物理内存
  • 缺少交换内存
  • 缺少光盘缓存
  • 缺乏网络带宽
  • Marionette运行内存不足

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

根据上述原因,您需要按照以下几个步骤操作:

  • 始终使用最新发布的Selenium-Python client版本, Docker Image GeckoDriver)和 WebDriver variant (<强> Web Browser
  • 始终在Firefox Browser方法中使用退出(),以便 tearDown() webdriver 两者都被妥善销毁。
  • 执行webclient之前和之后
  • Clean {{1>} 项目工作区
  • 执行IDE 之前和之后
  • Test Suite 浏览器缓存
  • 定期使用Clear工具清除操作系统杂项,包括陈旧的rust_mozprofile directories

答案 1 :(得分:5)

  

这里拒绝了什么联系?错误消息的含义是什么

Python webdriver API与Firefox Web浏览器之间的连接。好吧,不是连接本身,而是webdriver发送的一个请求被拒绝&#34;通过浏览器。请注意,这可以通过JSON Wire protocol - 基于HTTP的JSON。

来实现
  

我怎样才能修复此错误?

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

答案 2 :(得分:2)

一种快速修复方法,可以尝试解决存在此错误或类似错误的其他任何人-我发现删除我的geckodriver.log文件摆脱了该错误。

这在DebanjanB的答案的“清理项目工作区”部分中有隐含含义,但我只是想分享为我解决的具体操作。请注意,我没有使用像原始海报那样的测试套件。

我想对我来说,发生的事情是我以前的webdriver.Firefox实例由于我的代码另一部分的错误而一直无法进入driver.close(),而我仍在调试中,并且他们还没有发布日志文件geckodriver.log

因此,我想通过重命名日志文件或写入其他日志文件也可以解决此问题。

答案 3 :(得分:0)

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

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

chmod a+rwx /var/www/

上面的命令将起作用,但是由于它使每个人都可以访问该文件夹,因此它可能是不安全的。如果您想使其更加安全,请尝试:

chown www-data /var/www/

这都是快速的技巧,更好的方法是弄清楚geckodriver为什么要在文件夹中创建文件并更改该文件夹设置(我还没有这样做)。