代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

Django StaticLiveServerTestCase有时以以下结尾:远程主机强制关闭了现有连接

  •  0
  • Pablo Fernandez  · 技术社区  · 6 年前

    在我刚刚创建的Django应用程序中,我将其更改为使用PostgreSQL,并创建了一个应用程序,我进行了以下测试:

    from django.contrib.auth.models import User
    from django.contrib.staticfiles.testing import StaticLiveServerTestCase
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    
    class TestWebBrowser(StaticLiveServerTestCase):
        @classmethod
        def setUpClass(cls):
            super().setUpClass()
            cls.webdriver = webdriver.Chrome()
            cls.webdriver.implicitly_wait(10)
    
        @classmethod
        def tearDownClass(cls):
            cls.webdriver.close()
            cls.webdriver.quit()
            super().tearDownClass()
    
        def setUp(self):
            self.admin = User.objects.create_superuser(username="username", password="password",
                                                       email="example@example.com")
    
        def test_log_in(self):
            self.webdriver.get(f"{self.live_server_url}/admin")
            self.webdriver.find_element_by_id("id_username").send_keys("username")
            self.webdriver.find_element_by_id("id_password").send_keys("password")
            self.webdriver.find_element_by_id("id_password").send_keys(Keys.RETURN)
            self.webdriver.find_element_by_link_text("Users").click()
    

    测试总是运行,Chrome启动,执行测试所说的操作,但在最后,有时会抛出以下错误:

    Exception happened during processing of request from ('127.0.0.1', 55283)
    Traceback (most recent call last):
      File "C:\Users\pupeno\scoop\apps\python\current\lib\socketserver.py", line 647, in process_request_thread
        self.finish_request(request, client_address)
      File "C:\Users\pupeno\scoop\apps\python\current\lib\socketserver.py", line 357, in finish_request
        self.RequestHandlerClass(request, client_address, self)
      File "C:\Users\pupeno\scoop\apps\python\current\lib\socketserver.py", line 717, in __init__
        self.handle()
      File "C:\Users\pupeno\Temporary\untitled\venv\lib\site-packages\django\core\servers\basehttp.py", line 139, in handle
        self.raw_requestline = self.rfile.readline(65537)
      File "C:\Users\pupeno\scoop\apps\python\current\lib\socket.py", line 589, in readinto
        return self._sock.recv_into(b)
    ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
    

    所有测试都通过了。我只是想知道 STDERR . 你知道为什么吗?我是不是错过了一些撕下来的东西?

    如果我改变 tearDownClass 致:

    @classmethod
    def tearDownClass(cls):
        cls.webdriver.quit()
    

    我在跑:

    Django==2.1.2
    selenium==3.141.0
    

    > chromedriver.exe --version
    ChromeDriver 2.43.600210 (68dcf5eebde37173d4027fa8635e332711d2874a)
    

    Google Chrome Version 70.0.3538.102 (Official Build) (64-bit)
    

    运行测试的完整输出如下所示:

    Testing started at 15:33 ...
    C:\Users\pupeno\Temporary\untitled\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm 2018.2.4\helpers\pycharm\django_test_manage.py" test foo.tests.TestImportCRMData C:\Users\pupeno\Temporary\untitled
    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    ----------------------------------------
    Exception happened during processing of request from ('127.0.0.1', 49825)
    Traceback (most recent call last):
      File "C:\Users\pupeno\scoop\apps\python\current\lib\socketserver.py", line 647, in process_request_thread
        self.finish_request(request, client_address)
      File "C:\Users\pupeno\scoop\apps\python\current\lib\socketserver.py", line 357, in finish_request
        self.RequestHandlerClass(request, client_address, self)
      File "C:\Users\pupeno\scoop\apps\python\current\lib\socketserver.py", line 717, in __init__
        self.handle()
      File "C:\Users\pupeno\Temporary\untitled\venv\lib\site-packages\django\core\servers\basehttp.py", line 139, in handle
        self.raw_requestline = self.rfile.readline(65537)
      File "C:\Users\pupeno\scoop\apps\python\current\lib\socket.py", line 589, in readinto
        return self._sock.recv_into(b)
    ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
    ----------------------------------------
    Destroying test database for alias 'default'...
    
    Process finished with exit code 0
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   undetected Selenium    5 年前

    此错误消息。。。

    ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
    

    …意味着 无法与 网络浏览会话 Chrome浏览器 会话被远程主机强制关闭。


    webdriver.close() webdriver.quit()

    自动通过时 driver.quit() 在内部 tearDown(){} 网络驱动程序 Web客户端 实例优雅。调用 quit() 方法 DELETE 通过发送当前浏览会话 “退出” {“flags”:[“eForceQuit”]} 最后把 请求打开 /关闭 EndPoint . 下面是一个例子:

    1503397488598   webdriver::server   DEBUG   -> DELETE /session/8e457516-3335-4d3b-9140-53fb52aa8b74 
    1503397488607   geckodriver::marionette TRACE   -> 37:[0,4,"quit",{"flags":["eForceQuit"]}]
    1503397488821   webdriver::server   DEBUG   -> GET /shutdown
    

    所以调用 退出() 方法 Web Browser 会议和 WebDriver 实例被完全杀死。因此您不必包含任何附加步骤(调用 close()


    解决方案

    首先删除以下行:

    cls.webdriver.close()
    

    cls.webdriver.quit()
    

    一定会以最好的方式终止连接。

    在这里你可以找到关于 Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()?


    更新A

    根据 liveservertestcase 这个 tearDownClass() 定义为:

    @classmethod
    def tearDownClass(cls):
        cls.selenium.quit()
        super().tearDownClass()
    

    django/django/test/testcases.py 这称为:

    @classmethod
    def tearDownClass(cls):
        cls._tearDownClassInternal()
        cls._live_server_modified_settings.disable()
        super().tearDownClass()
    

    更新B

    尽管你提到过:

    • 铬河2.43.600210
    • 使用

    根据发行说明 ChromeDriver v2.43 :

    支持Chrome v69-71

    • 谷歌浏览器 谷歌浏览器 执行以下行时调用二进制文件:

      cls.webdriver = webdriver.Chrome()
      

    解决方案

    确保:


    参考

    你可以在以下网站上找到一些相关的讨论: