温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Cannot login user for testing with selenium in Django?
django python selenium django-testing

python - 无法登录用户以在Django中进行 selenium 测试?

发布于 2020-03-27 11:13:24

我有以下测试:

class FirefoxTestCases(StaticLiveServerTestCase):
    def setUp(self):
        user = User.objects.create(
            first_name="user",
            last_name="one",
            username="userone",
            is_active=True,
        )
        user.set_password("test")
        user.save()
        self.client = webdriver.Firefox()

    def tearDown(self):
        self.client.quit()

    def test_log_in_displays_firefox(self):
        # Opening the link we want to test
        self.client.get(self.live_server_url)
        assert "log in" in self.client.page_source
        self.client.find_element_by_id("id_username").send_keys("userone")
        self.client.find_element_by_id("id_password").send_keys("test")
        self.client.find_element_by_id("log_in").click()
        time.sleep(2)
        # Check the returned result
        assert "appone" in self.client.page_source

该应用程序可立即带您进入登录页面并与log_in视图对话

def log_in(request):
    if request.user.is_authenticated:
        return redirect("launcher")
    if request.method == "POST":
        form = LoginForm(request.POST)
        if form.is_valid():
            user = authenticate(
                request,
                username=request.POST.get("username"),
                password=request.POST.get("password"),
            )
            if user is not None:
                login(request, user)
                # 500 error occurs here
                return redirect("launcher")
        return render(request, "launcher/login.html", {"form": form})
    else:
        form = LoginForm()
        return render(request, "launcher/login.html", {"form": form})

表单提交没有问题,但是在日志中给出了500错误。它将再次重定向到登录页面(预期)。

我还有另一个测试,可以通过编程方式以正常方式登录同一用户:

class TestViews(TestCase):
    def setUp(self):
        user = User.objects.create(
            first_name="user",
            last_name="two",
            username="usertwo",
            is_active=True,
        )
        user.set_password("test")
        user.save()            

def test_logged_in_one_app_returns_200_and_launcher(self):
    """
    A user with one app sees the launcher.html page
    """
    user = User.objects.get(username="usertwo")
    user.set_password("test")
    user.save()
    test_client = Client()
    test_client.login(username="usertwo", password="test")
    response = test_client.get("/", follow=True)
    self.assertEqual(response.status_code, 200)
    self.assertTemplateUsed(response, "launcher/launcher.html")

该测试通过并按预期工作。

考虑到用户确实存在并且我设置了密码,因此我无法弄清楚为什么我用 selenium 测试时得到了500。我不确定出了什么问题。

如果我在本地启动-我可以以用户身份登录而不会出现问题,并且一切正常。但是只有在测试时,用户登录才会失败。

查看更多

查看更多

提问者
Hanny
被浏览
194
Hanny 2019-07-04 03:29

显然这里有重定向:

        if user is not None:
            login(request, user)
            # 500 error occurs here
            return redirect("launcher")

问题最终会导致问题吗(尽管我不确定为什么)。

我用以下内容替换了该部分:

        if user is not None:
            login(request, user)
            if not request.user.groups.all():
                return render(request, "launcher/no_apps.html")
            return render(
                request,
                "launcher/launcher.html",
                {
                    "apps": App.objects.filter(
                        groups__in=request.user.groups.all()
                    ).distinct()
                },
            )

哪个有效。

我不确定为什么没有重定向-但是将其呈现在此处既可以在测试环境中也可以在测试环境中使用。