【问题标题】:Django LiveServerTestCase hangs when I run my tests运行测试时 Django LiveServerTestCase 挂起
【发布时间】:2017-10-16 01:48:54
【问题描述】:

我正在尝试使用 Django 1.10.4 设置 LiveServerTestCase。每当我运行测试时,浏览器都会打开挂起并且无法访问本地主机。我的前端是一个单独的 Angular/React 应用程序。因此,我使用 grunt build 构建我的静态资产,然后运行 ​​collectstatic。下面是我的测试代码。

from django.test.testcases import LiveServerTestCase
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By



class ChromeTestCase(LiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        super(ChromeTestCase, cls).setUpClass()
        cls.driver = webdriver.Chrome('/path/to/chromedriver')
        cls.driver.implicitly_wait(10)
        cls.wait = WebDriverWait(cls.driver, 10)

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()
        super(ChromeTestCase, cls).tearDownClass()

    def test_user_sign_up_from_form(self):
        self.driver.get('%s%s' % (self.live_server_url, '/'))

        self.wait.until(EC.presence_of_element_located((By.XPATH, '//input[@id="email"]')))
        email_input = self.driver.find_element_by_xpath(
            '//input[@id="email"]')
        email_input.send_keys("test@gmail.com")
        password_input = self.driver.find_element_by_xpath(
            '//input[@id="password"]')
        password_input.send_keys("secret")

        signup_button = self.driver.find_elements_by_xpath(
            '//*[@id="signup_button"]')
        signup_button.click()

        url = self.live_server_url + '/home'
        self.assertEquals(self.driver.current_url, url)

有人知道为什么我的测试无法到达测试服务器吗?

另外,我的测试服务器创建的 url 是 https。

【问题讨论】:

  • 你的js和网络调试了吗?如果您评论您的拆解,浏览器仍然存在,您可以打开开发工具。而对于 js,我发现了更安全的 phantomjs 浏览器。
  • 当我检查控制台时,我在 localhost:8011/ 上收到错误 ERR_CONNECTION_REFUSED,在网络选项卡中我收到加载资源失败错误。感谢 phantomjs 的建议。

标签: django django-testing django-tests


【解决方案1】:

问题最终与将请求重定向到生产环境中的 https 的中间件有关。通过删除该中间件,我的测试工作正常。

【讨论】:

    【解决方案2】:

    您可以使用LiveServerTestCase 启用DEBUG,添加以下行:

    from django.test import override_settings
    
    @override_settings(DEBUG=True)
    class ChromeTestCase(LiveServerTestCase):
    

    【讨论】: