web-dev-qa-db-fra.com

Comment corriger «WebDriverException: Message: connexion refusée»?

J'utilise une configuration très complexe pour tester diverses pages Web non publiques. J'utilise jenkins pour exécuter les tests python-Selenium Dans une image docker. De cette façon, je suis complètement indépendant de l'environnement jenkins et je peux créer mon propre environnement. Dans cet environnement, les logiciels suivants sont installés:

  • Firefox: 57.0.1
  • geckodriver: 0.18.0
  • nosetests: 1.3.7
  • Sélénium: 3.8.0

Les tests Selenium créent le WebDriver de la manière suivante:

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 et self.downloadpath sont deux chemins valides dans la configuration du docker.

L'ensemble de la suite de tests se compose de 6 cas de test indépendants, chacun avec la même configuration que ci-dessus. Ils fonctionnent normalement très bien et sans problème.

Mais sans aucune modification aux tests ou à la configuration générale, un test échoue parfois avec le message d'erreur suivant:

  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

J'ai deux questions:

  1. Quelle connexion est refusée ici? Quelle est la signification du message d'erreur
  2. Comment puis-je éventuellement corriger cette erreur?

Addendum:

  • Lorsque j'ai utilisé une time.sleep(10) juste avant la ligne webdriver.Firefox, L'erreur ne s'est plus affichée. Dois-je mettre cette ligne dans une boucle while-try-except?
18
Alex

L'erreur que vous voyez est:

WebDriverException: Message: connection refused

Selon la documentation (WebDriverException est l'exception Base Webdriver qui est comme suit:

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

Donc connection is refused here Signifie que Selenium ne peut pas établir la connexion que vous vouliez établir via:

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

Une solution possible serait de fournir le nom complet du logfile avec le logical location Du logfile (de Project Level) Comme suit:

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

Ici vous pouvez trouver un similaire Discussion

Encore une fois, comme vous l'avez mentionné When I used a time.sleep(10) just before the webdriver.Firefox line, the error did not show up anymore, je suppose donc qu'il y avait une instance de GeckoDriver et Firefox Browser client actif précédemment. Par conséquent, de la même manière que @Florent B. l'a mentionné, vous devez protéger votre script contre l'affrontement Condition de course qui peut découler de l'un des éléments suivants:

  • Accès au même fichier journal par la nouvelle session que la session précédente n'a pas encore publiée.
  • Accès au même numéro de port par GeckoDriver ou Marionette par la nouvelle session que la session précédente n'a pas encore publiée.
  • Manque d'accès à [~ # ~] cpu [~ # ~]
  • Manque de mémoire physique
  • Manque de Swap Memory
  • Manque de cache disque
  • Manque de bande passante réseau
  • Docker Image A manqué de mémoire

Ici vous pouvez trouver un similaire Discussion .

Selon les causes mentionnées ci-dessus, vous devez suivre quelques étapes comme suit:

  • Utilisez toujours la dernière version publiée de Selenium-Python client , WebDriver variant ( GeckoDriver ) et Web Browser (Firefox Browser)
  • Utilisez toujours quit () dans la méthode tearDown() pour que la webdriver et le webclient les deux sont correctement détruits.
  • Clean l'espace de travail du projet de votre IDE avant et après l'exécution de votre Test Suite.
  • Clear le cache du navigateur avant et après l'exécution de votre Tests
  • Utilisez l'outil CCleaner régulièrement pour effacer les tâches du système d'exploitation , y compris le périmé Rust_mozprofile directories .
6
DebanjanB

Quelle connexion est refusée ici? Quelle est la signification du message d'erreur

La connexion entre le Python webdriver et votre navigateur Web Firefox. Eh bien, pas la connexion elle-même, mais une seule demande envoyée par le webdriver a été "rejetée" par le navigateur. Notez que cela fonctionne via le protocole JSON Wire - JSON sur HTTP.

Comment puis-je éventuellement corriger cette erreur?

Habituellement, en cas d'erreur comme celle-ci, la raison la plus courante est un problème de compatibilité . En d'autres termes, je soupçonne que votre geckodriver version 0.18.0 est trop ancienne pour Firefox 57 . Mettez à niveau geckodriver vers la dernière version stable (actuellement .19.1 ).

5
alecxe

Une solution rapide à essayer pour toute autre personne aux prises avec cette erreur ou des erreurs similaires - J'ai trouvé que la suppression de mon fichier geckodriver.log S'est débarrassée de cette erreur.

Cela est impliqué dans la partie "Nettoyer l'espace de travail du projet" de la réponse de DebanjanB, mais je voulais juste partager l'action concrète qui l'a corrigé pour moi. Notez que je n'utilisais pas une suite de tests comme l'affiche originale.

J'imagine que ce qui s'est passé pour moi, c'est que j'avais des instances précédentes de webdriver.Firefox Qui ne sont jamais arrivées à driver.close() dans mon code en raison d'une erreur dans une autre partie de mon code, que je déboguais toujours, et ils n'avaient pas publié le fichier journal geckodriver.log.

Ainsi, j'imagine que ce problème pourrait également être résolu en renommant le fichier journal ou en écrivant dans un fichier journal différent.

2
Alta Fang