无法登录用户以在Django中进行硒测试?

时间:2019-07-03 14:29:32

标签: python django selenium django-testing

我已经进行了以下测试:

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")

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

考虑到用户确实存在并且我设置了密码,我无法弄清楚为什么我用硒测试时得到了500 ...我不确定是怎么回事。

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

1 个答案:

答案 0 :(得分:0)

显然在这里有重定向:

        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()
                },
            )

曾工作过。

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