Django 的登录硒测试所有身份验证失败

login selenium tests for django all auth fails

我正在使用 django-allauth==0.32.0 进行用户身份验证,当我手动执行时它可以工作 (signup/login/logout/etc)。

我的models.py:

class Profile(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

signals.py:

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

我的views.py:

@login_required(login_url='/accounts/login/')
def CategoryView(request):
    context = {
        'data': 'data',
    }
    return render(request, 'myapp/index.html',context)

现在,我正在尝试使用 Selenium StaticLiveServerTestCase 为其编写测试:

def test_login(self):
        uname = "Herbert"
        pw = "klaus1234"
        User.objects.create(username=uname,password=pw)
        login_page = "/accounts/login"
        self.selenium.get('%s%s' % (self.live_server_url, login_page))
        self.selenium.maximize_window()
        self.selenium.find_element_by_id("id_login").send_keys(uname)
        self.selenium.find_element_by_id("id_password").send_keys(pw)
        self.selenium.find_elements_by_tag_name("button")[0].click()

当我 运行 它时,看起来我将正确的数据发布到输入字段中,就像我手动输入时的情况一样。但我得到的是:

"The username and/or password you specified are not correct."

并且该页面不会重定向到 LOGIN_REDIRECT_URL

中指定的页面

为了验证我发布的数据是否正确,我添加了这些不会引发错误的行:

self.assertEqual(1,len(Profile.objects.all()))
self.assertEqual(uname,Profile.objects.all()[0].user.username)
self.assertEqual(pw,Profile.objects.all()[0].user.password)
self.assertEqual(uname,User.objects.all()[0].username)
self.assertEqual(pw,User.objects.all()[0].password)         

我在这里错过了什么?

这很旧 post,但我认为这里的问题在于如何完成用户创建。

目前您正在使用以下方式创建用户。

User.objects.create(username=uname,password=pw)

对于任何其他对象,这将是一个不错的选择,但应按如下方式创建用户:

User.objects.create_user(username=uname,password=pw)

这就是您看到密码 un-encrypted(plain-text) 的原因。