Функция getCookie возвращает null при использовании Selenium. Почему?
Я создаю сайт на Django. Я использую функцию getCookie в моей html-странице, которая возвращает const csrktoken.
Когда я запускаю программу нормально (python manage.py runserver), она работает нормально, т.е. значение, возвращаемое функцией, не равно null.
Но когда я запускаю ее с помощью Selenium и pytest, csrftoken = null.
Почему?
dummy_2.html
<!DOCTYPE html>
{% load static %}
<html lang="fr">
<head>
<script type="text/javascript">
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
const csrftoken = getCookie('csrftoken');
</script>
</head>
<body>
<div class="container">
<div class="row">
<button id="trigger-dummy-button" type="button"
class="btn btn-primary text-white font-base fw-bold text-uppercase"
title="Trigger dummy button">Trigger dummy button </button>
</div>
</div>
<script>
var someDummyURL = "{% url 'home_page:another_dummy_view' %}";
</script>
<script type="module" src="{% static '/js/dummy.js' %}"> </script>
<script type="module" src="{% static '/js/main.js' %}"> </script>
</body>
</html>
dummy.js
'use strict';
var newValue;
async function postDummyFunction(request) {
var response = await fetch(request);
if (response.ok) {
var updatedReturnedValue = await response.json();
newValue = updatedReturnedValue.returnedValue;
return newValue;
} else {
return false;
}
};
document.addEventListener("DOMContentLoaded", function () {
var triggerDummyButton = document.getElementById("trigger-dummy-button");
var someDummyVariable = "Hello World ";
var toPostURL = someDummyURL;
triggerDummyButton.onclick = (e) => {
var data = {"dummyValue": someDummyVariable};
var request = new Request(toPostURL, {
method: "POST",
mode: "same-origin",
headers: {
"Content-Type": "application/json",
'X-Requested-With':'XMLHttpRequest',
"Accept": "application/json",
'X-CSRFToken': csrftoken
},
credentials: 'include',
body: JSON.stringify(data),
});
alert('csrftoken = ' + csrftoken);
// Manually, with Firefox, I have csrf = someValue
// With Selenium, I have csrf = null
postDummyFunction(request);
}
});
test_selenium.py
import time
import os
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from core.settings import BASE_DIR
PATH_TO_WEBDRIVER_FIREFOX = os.path.join(BASE_DIR, "test", "webdrivers", "geckodriver")
SHORT_TIME = 2.5
DEFAULT_WAIT_TIME = 6
class FooTest(StaticLiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox(executable_path=PATH_TO_WEBDRIVER_FIREFOX)
def tearDown(self):
time.sleep(SHORT_TIME)
self.browser.close()
def testfoo(self):
self.browser.get(("%s%s" % (self.live_server_url, "/dev/dummy_script/")))
time.sleep(SHORT_TIME)
elem_trigger_btn = WebDriverWait(self.browser, DEFAULT_WAIT_TIME).until(
EC.element_to_be_clickable((By.ID, "trigger-dummy-button"))
)
self.browser.execute_script(
"document.getElementById('trigger-dummy-button').click()"
)