'Function getCookie return null when using Selenium. Why?
I am creating a Django website. I am using the function getCookie in my html page which returns the const csrktoken.
When I run the program normally (python manage.py runserver), it works fine. i.e. the value returned by the function is not null.
But when I run it with Selenium and pytest, csrftoken = null.
Why ?
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()"
)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
