testrunner - Inicie sesión con el código cuando use LiveServerTestCase con Django
pruebas unitarias django (2)
Así que tengo un conjunto de pruebas funcionales de Selenio. Ya he probado la funcionalidad de inicio de sesión / registro en algunas pruebas navegando por el cliente de Selenium a la página de registro, ingresando un nombre de usuario y contraseña, y luego diciéndole a Selenium que inicie sesión con esas mismas credenciales. Ahora quiero probar otras partes de las áreas de "inicio de sesión requeridas" del sitio sin tener que decirle a Selenium que haga clic e ingrese texto en el navegador de prueba.
En otras palabras, me gustaría utilizar algo como esto (que uso muy bien en mis pruebas de unidades de vista):
self.client = Client()
self.user = User.objects.create_user(''temporary'', ''[email protected]'', ''temporary'')
self.user.save()
self.client.login(username=''temporary'', password=''temporary'')
en mis pruebas de Selenium, así que no tengo que repetir el largo proceso de inicio de sesión manual en cada una de mis pruebas (dado que ya probé el sistema de inicio de sesión en pruebas anteriores como dije antes)
A partir de ahora, solo copio y pego las instrucciones de Selenium de "flujo de inicio de sesión" para cada una de mis pruebas que requieren inicio de sesión. Esto hace que mis pruebas tengan una adición de 5-6 segundos cada una y hace que mi archivo function_tests.py esté muy hinchado.
Toda mi Google me ha llevado a páginas que me enseñan a probar el inicio de sesión con Selenium.
Gracias por adelantado.
En Django 1.8 es posible crear una cookie de sesión autenticada previamente y pasarla a Selenium.
Para hacer esto, tendrás que:
- Crea una nueva sesión en tu back-end;
- Genera una cookie con los datos de sesión recién creados;
- Pase esa cookie a su webliner de Selenium.
La lógica de creación de sesión y cookie es la siguiente:
# create_session_cookie.py
from django.conf import settings
from django.contrib.auth import (
SESSION_KEY, BACKEND_SESSION_KEY, HASH_SESSION_KEY,
get_user_model
)
from django.contrib.sessions.backends.db import SessionStore
def create_session_cookie(username, password):
# First, create a new test user
user = get_user_model()
user.objects.create_user(username=username, password=password)
# Then create the authenticated session using the new user credentials
session = SessionStore()
session[SESSION_KEY] = user.pk
session[BACKEND_SESSION_KEY] = settings.AUTHENTICATION_BACKENDS[0]
session[HASH_SESSION_KEY] = user.get_session_auth_hash()
session.save()
# Finally, create the cookie dictionary
cookie = {
''name'': settings.SESSION_COOKIE_NAME,
''value'': session.session_key,
''secure'': False,
''path'': ''/'',
}
return cookie
Ahora, dentro de tus pruebas de Selenio:
#selenium_tests.py
# assuming self.webdriver is the selenium.webdriver obj.
from create_session_cookie import create_session_cookie
session_cookie = create_session_cookie(
email=''[email protected]'', password=''top_secret''
)
# visit some url in your domain to setup Selenium.
# (404 pages load the quickest)
self.driver.get(''your-url'' + ''/404-non-existent/'')
# add the newly created session cookie to selenium webdriver.
self.driver.add_cookie(session_cookie)
# refresh to exchange cookies with the server.
self.driver.refresh()
# This time user should present as logged in.
self.driver.get(''your-url'')
No puede iniciar sesión usuario desde el controlador de selenio. Es imposible sin algunos hacks.
Pero puede iniciar sesión una vez por TestCase moviéndolo al método setUp.
También puede evitar copiar y pegar creando su clase inhereted desde LiveServerTestCase.
ACTUALIZAR
Este código funcionó para mí:
self.client.login(username=superuser.username, password=''superpassword'') #Native django test client
cookie = self.client.cookies[''sessionid'']
self.browser.get(self.live_server_url + ''/admin/'') #selenium will set cookie domain based on current page domain
self.browser.add_cookie({''name'': ''sessionid'', ''value'': cookie.value, ''secure'': False, ''path'': ''/''})
self.browser.refresh() #need to update page for logged in user
self.browser.get(self.live_server_url + ''/admin/'')