web-dev-qa-db-ja.com

「WebDriverException:メッセージ:接続が拒否されました」の修正方法

非常に複雑なセットアップを使用して、さまざまな非公開Webページをテストしています。 jenkinsを使用して、dockerimage内で_python-Selenium_テストを実行します。そのようにして、私はジェンキンス環境から完全に独立しており、自分の環境を作成することができます。この環境では、次のソフトウェアがインストールされています。

  • Firefox:57.0.1
  • ヤモリ:0.18.0
  • 鼻テスト:1.3.7
  • セレン: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)
_

ここで、logfileおよび_self.downloadpath_は、Dockerセットアップの2つの有効なパスです。

テストスイート全体は、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
_

2つの質問があります。

  1. ここでどの接続が拒否されますか?エラーメッセージの意味は何ですか
  2. このエラーを修正するにはどうすればよいですか?

補遺

  • _webdriver.Firefox_行の直前でtime.sleep(10)を使用すると、エラーは表示されなくなりました。私はその行をwhile-try-exceptループに入れましたか?
18
Alex

表示されているエラーは次のとおりです。

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 locationProject 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について述べたように、GeckoDriverおよびFirefox Browserのインスタンスが以前にアクティブであったと仮定します。したがって、@ Florent B.が述べたのと同様に、スクリプトを直面 から保護する必要がありますRace Around Condition は、次のいずれかに起因します。

  • 以前のセッションがまだリリースしていない新しいセッションで同じlogfileにアクセスします。
  • 同じポート番号によるアクセスGeckoDriverまたはMarionette以前のセッションがまだリリースしていない新しいセッションによる。
  • [〜#〜] cpu [〜#〜]へのアクセスの欠如
  • 物理メモリの欠如
  • スワップメモリ​​の欠如
  • ディスクキャッシュの欠如
  • ネットワーク帯域幅の欠如
  • Docker Image ran メモリ不足

ここでは、同様の Discussion を見つけることができます。

上記の原因ごとに、次のいくつかの手順を実行する必要があります。

6
DebanjanB

ここでどの接続が拒否されますか?エラーメッセージの意味は何ですか

Python webdriver APIとFirefox Webブラウザの間の接続。まあ、接続自体ではなく、Webドライバが送信した単一のリクエストはブラウザによって「拒否」されました。 JSON Wire protocol -JSON over HTTP。

このエラーを修正するにはどうすればよいですか?

通常、このようなエラーの場合、最も一般的な理由は互換性の問題です。言い換えれば、あなたのgeckodriverバージョン0.18.0はFirefox 57には古すぎると思います。 geckodriverを最新の安定バージョン(現在は .19.1 )にアップグレードします。

5
alecxe

このエラーまたは同様のエラーに苦しんでいる他の誰かのために試してみるための簡単な修正-私はgeckodriver.logファイルを削除するとこのエラーがなくなることがわかりました。

これは、DebanjanBの回答の「プロジェクトワークスペースのクリーンアップ」の部分に含まれていますが、それを修正した具体的なアクションを共有したかっただけです。元のポスターのようなテストスイートを使用していないことに注意してください。

私が起こったのは、コードの別の部分のエラーのためにコードでdriver.close()に到達しなかった以前のwebdriver.Firefoxインスタンスがあり、それがまだデバッグ中であったことでした。ログファイルgeckodriver.logをリリースしていません。

したがって、ログファイルの名前を変更するか、別のログファイルに書き込むことで、この問題が解決される可能性があると思います。

2
Alta Fang