войти в систему Selenium Tests для django, все проверки подлинности завершаются неудачно

Я использую django-allauth==0.32.0 для аутентификации пользователя, и он работает, когда я делаю это вручную (регистрация/вход в систему/выход из системы/и т. д.).

Мои модели.py:

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

signal.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()

Мои просмотры.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()

Когда я запускаю его, похоже, что правильные данные отправляются в поля ввода, точно так же, как это происходит, когда я делаю это вручную. Но я получаю следующее:

«Указанные вами имя пользователя и/или пароль неверны».

И страница не перенаправляет на страницу, указанную в 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)         

Что мне здесь не хватает?


person Tom    schedule 28.05.2017    source источник
comment
Добавьте множество отчетов журнала в представление входа в систему, чтобы вы могли видеть все принятые решения и все полученные значения. Это должно указать вам правильное направление. (Кроме того, действительно ли ваша модель User хранит пароли в открытом виде?)   -  person John Gordon    schedule 28.05.2017
comment
Другое дело, когда я проверяю в ./manage.py shell, все пароли в хэше, но когда я их распечатываю во время тестов, они почему-то появляются в виде обычного текста   -  person Tom    schedule 28.05.2017


Ответы (1)


Это довольно старый пост, но я думаю, что проблема здесь в том, как создается пользователь.

В настоящее время вы используете следующий способ создания пользователя.

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

Для любого другого объекта это было бы отличным выбором, но User должен быть создан следующим образом:

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

Именно по этой причине вы видите этот пароль незашифрованным (обычным текстом).

person Ojas Kale    schedule 09.03.2018
comment
это сработало, здесь (я полагаю) ссылка на документы docs.djangoproject.com/en/2.0/ref/contrib/auth/#manager-methods - person Tom; 21.03.2018