如何修复 "WebDriverException: Message: connection refused"?
How to fix "WebDriverException: Message: connection refused"?
我正在使用非常复杂的设置来测试各种非 public 网页。我在 docker
图像中使用 jenkins
到 运行 python-selenium
测试。这样,我就完全独立于 jenkins 环境,可以创建自己的环境。在此环境中,我安装了以下软件:
- 火狐: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 设置中的两个有效路径。
整个测试套件由 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
我有两个问题:
- 这里拒绝了什么连接?错误信息是什么意思
- 我怎样才能解决这个错误?
附录:
- 当我在
webdriver.Firefox
行之前使用 time.sleep(10)
时,错误不再出现。我应该将该行放在 while-try-except 循环中吗?
您看到的错误是:
WebDriverException: Message: connection refused
根据文档,WebDriverException
是 Base 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
的完整名称以及 logfile
的 logical location
(来自 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 的影响,这可能源于以下任一情况:
- 通过新的 session 访问相同的 日志文件 ,之前的 session 尚未发布。
- 通过
GeckoDriver
或Marionette
[=103访问相同的端口号 =] 之前的 session 尚未发布的新 session。
- 无法访问 CPU
- 物理内存不足
- 缺少交换内存
- 缺少 磁盘缓存
- 网络带宽不足
Docker Image
运行 内存不足
在这里你可以找到类似的Discussion
。
针对上述原因,您需要按照以下几个步骤进行操作:
- 始终使用最新发布的
Selenium-Python
client, WebDriver variant
(GeckoDriver
) 和 Web Browser
(Firefox Browser
)
- 始终在
tearDown()
方法中使用 quit() 以便 webdriver
和 webclient
两个都被正确销毁了。
Clean
Project Workspace 来自 IDE
之前和之后执行 Test Suite
.
Clear
Browser Cache执行你的Tests
前后
- 定期使用
CCleaner
工具清除 OS 琐事,包括陈旧的 rust_mozprofile directories
.
What connection is refused here? What is the meaning of the error message
Python 网络驱动程序 API 与您的 Firefox 网络浏览器之间的连接。好吧,不是连接本身,而是网络驱动程序发送的单个请求是由浏览器 "rejected" 发出的。请注意,这通过 HTTP 上的 JSON Wire protocol - JSON 起作用。
How can I possibly fix this error?
通常,如果出现此类错误,最常见的原因是 兼容性问题。换句话说,我怀疑你的 geckodriver
版本 0.18.0 对于 Firefox 57 来说太旧了。升级 geckodriver
到最新的稳定版本(目前 0.19.1)。
一个快速修复,可以尝试为那些正在努力解决这个或类似错误的其他人——我发现删除我的 geckodriver.log
文件可以消除这个错误。
DebanjanB 回答的 "Clean the Project Workspace" 部分暗示了这一点,但我只是想分享为我修复它的具体操作。请注意,我没有像原始海报那样使用测试套件。
我想象发生在我身上的事情是,由于我仍在调试的代码的另一部分出错,我之前的 webdriver.Firefox
个实例在我的代码中从未达到 driver.close()
, 他们还没有发布日志文件 geckodriver.log
.
因此我想这个问题也可以通过重命名日志文件或写入不同的日志文件来解决。
我遇到了同样的问题,发现这是一个权限问题。我是 运行 apache 中的 Selenium,而 apache 文件夹没有正确的权限。 selenium、geckodriver 或 firefox 尝试在 /var/www/
目录中创建文件和文件夹,但它没有这样做的权限。
您可以使用以下命令解决此问题:
chmod a+rwx /var/www/
上述命令可以运行,但可能不安全,因为它允许每个人访问该文件夹。如果你想让它更安全一点,试试:
chown www-data /var/www/
这都是快速破解,更好的方法是弄清楚 geckodriver 为什么在文件夹中创建文件,然后更改该文件夹设置(我没有这样做)。
我正在使用非常复杂的设置来测试各种非 public 网页。我在 docker
图像中使用 jenkins
到 运行 python-selenium
测试。这样,我就完全独立于 jenkins 环境,可以创建自己的环境。在此环境中,我安装了以下软件:
- 火狐: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 设置中的两个有效路径。
整个测试套件由 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
我有两个问题:
- 这里拒绝了什么连接?错误信息是什么意思
- 我怎样才能解决这个错误?
附录:
- 当我在
webdriver.Firefox
行之前使用time.sleep(10)
时,错误不再出现。我应该将该行放在 while-try-except 循环中吗?
您看到的错误是:
WebDriverException: Message: connection refused
根据文档,WebDriverException
是 Base 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
的完整名称以及 logfile
的 logical location
(来自 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 的影响,这可能源于以下任一情况:
- 通过新的 session 访问相同的 日志文件 ,之前的 session 尚未发布。
- 通过
GeckoDriver
或Marionette
[=103访问相同的端口号 =] 之前的 session 尚未发布的新 session。 - 无法访问 CPU
- 物理内存不足
- 缺少交换内存
- 缺少 磁盘缓存
- 网络带宽不足
Docker Image
运行 内存不足
在这里你可以找到类似的Discussion
。
针对上述原因,您需要按照以下几个步骤进行操作:
- 始终使用最新发布的
Selenium-Python
client,WebDriver variant
(GeckoDriver
) 和Web Browser
(Firefox Browser
) - 始终在
tearDown()
方法中使用 quit() 以便webdriver
和webclient
两个都被正确销毁了。 Clean
Project Workspace 来自IDE
之前和之后执行Test Suite
.Clear
Browser Cache执行你的Tests
前后
- 定期使用
CCleaner
工具清除 OS 琐事,包括陈旧的rust_mozprofile directories
.
What connection is refused here? What is the meaning of the error message
Python 网络驱动程序 API 与您的 Firefox 网络浏览器之间的连接。好吧,不是连接本身,而是网络驱动程序发送的单个请求是由浏览器 "rejected" 发出的。请注意,这通过 HTTP 上的 JSON Wire protocol - JSON 起作用。
How can I possibly fix this error?
通常,如果出现此类错误,最常见的原因是 兼容性问题。换句话说,我怀疑你的 geckodriver
版本 0.18.0 对于 Firefox 57 来说太旧了。升级 geckodriver
到最新的稳定版本(目前 0.19.1)。
一个快速修复,可以尝试为那些正在努力解决这个或类似错误的其他人——我发现删除我的 geckodriver.log
文件可以消除这个错误。
DebanjanB 回答的 "Clean the Project Workspace" 部分暗示了这一点,但我只是想分享为我修复它的具体操作。请注意,我没有像原始海报那样使用测试套件。
我想象发生在我身上的事情是,由于我仍在调试的代码的另一部分出错,我之前的 webdriver.Firefox
个实例在我的代码中从未达到 driver.close()
, 他们还没有发布日志文件 geckodriver.log
.
因此我想这个问题也可以通过重命名日志文件或写入不同的日志文件来解决。
我遇到了同样的问题,发现这是一个权限问题。我是 运行 apache 中的 Selenium,而 apache 文件夹没有正确的权限。 selenium、geckodriver 或 firefox 尝试在 /var/www/
目录中创建文件和文件夹,但它没有这样做的权限。
您可以使用以下命令解决此问题:
chmod a+rwx /var/www/
上述命令可以运行,但可能不安全,因为它允许每个人访问该文件夹。如果你想让它更安全一点,试试:
chown www-data /var/www/
这都是快速破解,更好的方法是弄清楚 geckodriver 为什么在文件夹中创建文件,然后更改该文件夹设置(我没有这样做)。