一尘不染

如何修复“ WebDriverException:消息:连接被拒绝”?

selenium

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

  • Firefox:57.0.1
  • Firefox:0.18.0
  • 鼻子测试: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是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. 如何解决此错误?

附录

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

阅读 285

收藏
2020-06-26

共1个答案

一尘不染

您看到的错误是:

WebDriverException: Message: connection refused

根据文档
WebDriverException

基本webdriver异常 如下:

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 locationlogfile(从Project Level)如下:

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 和一个
Firefox Browser 客户端处于活动状态。因此,与@Florent B.所提到的类似,您必须屏蔽脚本以防止遇到“
竞跑条件” ,而后者可能源于以下任一情况:

  • 通过新会话访问相同的 日志文件 ,而先前的会话尚未释放。
  • 通过新会话或通过新会话访问相同的 端口号 ,而先前的会话尚未释放。 GeckoDriver Marionette
  • 缺少访问 CPU* 的权限 *
  • 缺乏 物理记忆
  • 交换内存* 不足 *
  • 光盘缓存* 不足 *
  • 缺乏 网络带宽
  • Docker Image出来的内存

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

  • 总是使用最新发布的版本 Selenium-Python 的客户端WebDriver variant GeckoDriver )和 Web BrowserFirefox Browser
  • 始终使用 退出()tearDown()方法,以便 webdriverwebclient 两者都正确销毁。
  • Clean项目工作 从你IDE之前和执行你的后Test Suite
  • Clear执行之前和之后的 浏览器缓存Tests
  • CCleaner定期使用工具抹去 OS琐事, 包括陈旧的东西rust_mozprofile directories
2020-06-26