我正在使用一个非常复杂的设置来测试各种非公共网页。我使用jenkins
在python-selenium
image中运行docker
测试。这样,我完全独立于jenkins环境,可以创建自己的环境。在这种环境中,我安装了以下软件:
硒测试通过以下方式创建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设置中的两个有效路径。
整个测试套件包含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
我有两个问题:
附录:
time.sleep(10)
线之前使用webdriver.Firefox
时,错误不再出现了。我把那条线放在while-try-except循环中?您看到的错误是:
WebDriverException: Message: connection refused
根据文档WebDriverException
是Base 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 location
的logfile
(来自Project 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,这可能源于以下任何一种情况:
GeckoDriver
或Marionette
通过之前会话尚未发布的新会话访问相同的端口号。Docker Image
失去记忆在这里您可以找到类似的Discussion
。
根据上述原因,您需要按照以下几个步骤操作:
Selenium-Python
client,WebDriver variant
(GeckoDriver
)和Web Browser
(Firefox Browser
)的最新发布版本tearDown()
方法中使用quit(),以便正确销毁webdriver
和webclient
。Clean
执行你的IDE
之前和之后你的Test Suite
项目工作区。Clear
执行Tests
之前和之后的浏览器缓存CCleaner
工具擦除OS杂务,包括陈旧的rust_mozprofile directories
。这里拒绝了什么联系?错误消息的含义是什么?
Python webdriver API与Firefox Web浏览器之间的连接。好吧,不是连接本身,而是webdriver发送的单个请求被浏览器“拒绝”。请注意,这可以通过JSON Wire protocol - HTTP上的JSON工作。
我怎样才能修复这个错误?
通常,如果出现此类错误,最常见的原因是兼容性问题。换句话说,我怀疑你的geckodriver
版本0.18.0对于Firefox 57而言太旧了。将geckodriver
升级到最新的稳定版本(目前为0.19.1)。
一个快速解决方案,尝试其他人在这里或类似的错误挣扎 - 我发现删除我的geckodriver.log
文件摆脱了这个错误。
这隐含在DebanjanB答案的“清理项目工作区”部分,但我只是想分享为我修复它的具体行动。请注意,我没有使用像原始海报那样的测试套件。
我想我之前发生的事情是我之前有webdriver.Firefox
实例,由于我的代码的另一部分出错,我的代码中没有得到driver.close()
,我还在调试,他们还没有发布日志文件geckodriver.log
。
因此,我想这个问题也可以通过重命名日志文件或写入不同的日志文件来解决。