self.client.get() 与 self.browser.get() 的用法

usage of self.client.get() vs self.browser.get()

我正在阅读这本关于使用 Django 进行 TDD 的书。 我从使用 self.client.get('/') 得到不同的行为,从使用 self.browser.get('/localhost:8000') 得到不同的行为,看起来它们看起来 相同但行为不同。

class FirstTest(unittest.TestCase):

    def setUp(self):
        self.browser = webdriver.Chrome(os.path.join(os.getcwd(), 'chromedriver'))

    def test_home_page_returns_correct_html(self):
        response = self.client.get('/')
        self.assertTemplateUsed(response, 'home.html')

谁能解释一下这里发生了什么?

这是两个不同的东西。

self.client,是内置的Django测试客户端。这不是真正的浏览器,甚至不会发出真正的请求。它只是构造一个 Django HttpRequest 对象并将其传递给 request/response 进程 - 中间件、URL 解析器、视图、模板 - 以及 returns Django 生成的任何内容。它根本不会解析该响应或呈现它,也不会发出由 HTML 驱动的其他请求以获取资产等

但是webdriver.Chrome是真正的浏览器,即Chrome。 Webdriver 启动 Chrome 的无头版本并驱动它请求您的网页。他们通过实际的 HTTP 请求,然后 在浏览器中呈现 响应;就像真正的浏览器一样,如果 HTML 包含指向 JS 或 CSS 的链接,它将请求它们然后也呈现它们。