如何正确关闭socket以避免python/django中的Errno 10054

2 投票
1 回答
903 浏览
提问于 2025-04-17 18:06

我正在使用 django-selenium 来对我参与的一个 Django 应用进行 Selenium 测试。这个 Django 应用是在本地运行的,使用 Qt 和本地的网络服务器。

所以,要运行测试,我需要先启动应用的服务器、Selenium 服务器,然后再启动 WebDriver 实例来执行测试。

django-selenium 是通过 subprocess.Popen('java -jar <path_to_server.jar>') 来启动它的服务器的,然后如果服务器没有运行,我也会以类似的方式启动我们的应用网络服务器;

def run():
    path = os.path.join(os.getcwd(), 'main.py')
    server_running = is_server_running()

    if server_running is False:
        subprocess.Popen(['python', path, '-a'])

现在测试的设置看起来是这样的;

def setUp(self):
    self.server = Process(target= startServer.run)
    self.server.start()

而在清理时;

def tearDown(self):
    # stop our server
    self.ff.get('http://localhost:{0}/QUIT'.format(settings.LISTEN_PORT))
    # stop the selenium server
    self.ff.get('http://localhost:4444/selenium-server/driver/?cmd=shutDownSeleniumServer')
    # close the browser
    self.ff.quit()
    self.server.terminate()

在这个过程中,我遇到了一个错误:error: [Errno 10054] An existing connection was forcibly closed by the remote host。我尝试在关闭连接之间添加 sleep,但这并没有帮助。

你能看出我可能哪里出错了吗?我觉得如果关闭是来自远程主机的,那么如果我先关闭我们的服务器,然后是 Selenium 服务器,最后在服务器关闭后终止进程,就应该没有问题。

1 个回答

2

我也遇到过这个问题,我是通过在退出之前刷新浏览器来解决的。(听起来很奇怪,我知道)。你可以在 self.ff.quit() 之前加上这一行:

self.ff.refresh()
self.ff.quit()

这样对我来说就解决了,虽然我也不知道为什么。

撰写回答