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

Ale*_*lex 19 python firefox selenium jenkins geckodriver

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

  • Firefox:57.0.1
  • geckodriver:0.18.0
  • nosetests: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)
Run Code Online (Sandbox Code Playgroud)

其中,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
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 这里拒绝了什么联系?错误消息的含义是什么?
  2. 我怎样才能修复这个错误?

附录:

  • 当我在线time.sleep(10)前使用时webdriver.Firefox,错误不再出现了.我把那条线放在while-try-except循环中?

Deb*_*anB 7

您看到的错误是:

WebDriverException: Message: connection refused
Run Code Online (Sandbox Code Playgroud)

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

exception selenium.common.exceptions.WebDriverException(msg=None, screen=None, stacktrace=None)
Run Code Online (Sandbox Code Playgroud)

因此connection is refused here意味着Selenium无法通过以下方式建立您要建立的连接:

self.driver = webdriver.Firefox(profile, log_path = logfile)
Run Code Online (Sandbox Code Playgroud)

一种可能的解决办法是提供的完整名称logfile与沿logical locationlogfile(从Project Level)如下:

self.driver = webdriver.Firefox(firefox_profile=profile, log_path='./Log/geckodriver.log')
Run Code Online (Sandbox Code Playgroud)

在这里你可以找到类似的 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由前一交易日have't尚未公布新的会话.
  • 缺乏对CPU的访问权限
  • 缺乏物理内存
  • 缺乏交换记忆
  • 缺少光盘缓存
  • 缺乏网络带宽
  • Docker Image出来的内存

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

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

  • 始终使用最新发布的Selenium-Python客户端版本,WebDriver variant(GeckoDriver)和Web Browser(Firefox Browser)
  • 始终在方法中使用quit(),tearDown()以便正确销毁webdriverwebclient两者.
  • Clean您执行之前和之后的项目工作区.IDETest Suite
  • Clear浏览器缓存之前和执行后您的Tests
  • CCleaner定期使用工具擦除OS杂务,包括陈旧rust_mozprofile directories.


ale*_*cxe 5

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

Python webdriver API与Firefox Web浏览器之间的连接.好吧,不是连接本身,而是webdriver发送的单个请求被浏览器"拒绝".请注意,这可以通过JSON Wire协议 - 基于HTTP的JSON.

我怎样才能修复这个错误?

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