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:
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)
où 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:
Addendum:
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?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:
GeckoDriver
ou Marionette
par la nouvelle session que la session précédente n'a pas encore publiée.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:
Selenium-Python
client , WebDriver variant
( GeckoDriver
) et Web Browser
(Firefox Browser
)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
CCleaner
régulièrement pour effacer les tâches du système d'exploitation , y compris le périmé Rust_mozprofile directories
.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 ).
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.