I am setting up tests for both chrome and firefox using seleniumgrid.I am using docker images selenium-hub and selenium node-chrome and node-firefox as below.
app:
build: .
command: gunicorn --reload --capture-output --log-level debug --access-logfile - -w 3 -b 0.0.0.0 app.wsgi
restart: always
volumes_from:
- initialize
ports:
- "8000:8000"
links:
- db
- rabbitmq
- selenium_hub
env_file: secrets.env
volumes:
- ./app/:/code/
selenium_hub:
image: selenium/hub
ports:
- 4444:4444
expose:
- 4444
tty: true
environment:
- GRID_MAX_SESSION=20
- GRID_NEW_SESSION_WAIT_TIMEOUT=60000
- GRID_BROWSER_TIMEOUT=300
- GRID_TIMEOUT=300
- TIMEOUT=300
node_1:
image: selenium/node-chrome
depends_on:
- selenium_hub
environment:
- HUB_HOST=selenium_hub
- HUB_PORT=4444
- NODE_MAX_SESSION=3
- NODE_MAX_INSTANCES=2
shm_size: 2GB
node_2:
image: selenium/node-firefox
environment:
- HUB_HOST=selenium_hub
- HUB_PORT=4444
- NODE_MAX_SESSION=3
- NODE_MAX_INSTANCES=2
shm_size: 2GB
depends_on:
- selenium_hub
When I try to run the tests I am always running into this error InvalidCookieDomainException: Message: invalid cookie domain
. I have already set domain to self.live_server_url
.
below is the full traceback with the test setup.
Traceback (most recent call last):
File "/code/frontend/tests/test_user_auth.py", line 75, in setUp
"port": "8082",
File "/usr/local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 894, in add_cookie
self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
File "/usr/local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
(Session info: chrome=77.0.3865.75)
Test reference tutorial.
class TestUserCreate(StaticLiveServerTestCase):
fixtures = ["test.json"]
port = 8082
@classmethod
def setUpClass(cls):
super().setUpClass()
caps = {
"browserName": os.getenv("BROWSER", "chrome"),
"javascriptEnabled": True,
}
cls.driver = webdriver.Remote(
command_executor="http://selenium_hub:4444/wd/hub",
desired_capabilities=caps,
)
cls.driver.implicitly_wait(10)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
super().tearDownClass()
def setUp(self):
# Login the user
self.assertTrue(self.client.login(username="james", password="changemequick"))
# Add cookie to log in the browser
cookie = self.client.cookies["sessionid"]
self.driver.get(self.live_server_url + reverse("find_patient"))
self.driver.add_cookie(
{
"name": "sessionid",
"value": cookie.value,
"domain": "localhost"
}
)
super().setUp()
def test_form_loader(self):
# test forms loader is functioning properly
driver = self.driver
driver.get(self.live_server_url + "/accounts/login/")
driver.find_element_by_xpath("//input[@type='submit']").click()
driver.get_screenshot_as_file("login.png")
assert len(driver.find_elements_by_css_selector(".loading")) == 0
This error message...
selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
...implies that an illegal attempt was made to set a cookie under a different domain than that of the current document.
As per the HTML-Living Standard Specs a Document Object
may be categorized as a cookie-averse Document object in the following circumstances :
Browsing Context
.As per Invalid cookie domain this error may occur if the current domain were to be example.com
, it would not be possible to add the cookie for the domain example.org
.
As an example:
Sample Code:
from selenium import webdriver
from selenium.common import exceptions
session = webdriver.Firefox()
session.get("https://example.com/")
try:
cookie = {"name": "foo",
"value": "bar",
"domain": "example.org"}
session.add_cookie(cookie)
except exceptions.InvalidCookieDomainException as e:
print(e.message)
Console Output:
InvalidCookieDomainException: https://example.org/
If you have stored the cookie from domain example.com
, these stored cookies can't be pushed through the webdriver session to any other different domanin e.g. example.edu
. The stored cookies can be used only within example.com
. Further, to automatically login an user in future, you need to store the cookies only once, and that's when the user have logged in. Before adding back the cookies you need to browse to the same domain from where the cookies were collected.
As an example, you can store the cookies once the user havd logged in within an application as follows:
from selenium import webdriver
import pickle
driver = webdriver.Chrome()
driver.get('http://demo.guru99.com/test/cookie/selenium_aut.php')
driver.find_element_by_name("username").send_keys("abc123")
driver.find_element_by_name("password").send_keys("123xyz")
driver.find_element_by_name("submit").click()
# storing the cookies
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))
driver.quit()
Later if you want the user automatically logged-in, you need to browse to the specific domain /url first and then you have to add the cookies as follows:
from selenium import webdriver
import pickle
driver = webdriver.Chrome()
driver.get('http://demo.guru99.com/test/cookie/selenium_aut.php')
# loading the stored cookies
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
# adding the cookies to the session through webdriver instance
driver.add_cookie(cookie)
driver.get('http://demo.guru99.com/test/cookie/selenium_cookie.php')
It seems you are using chrome=77.0.3865.75. Ideally you need to ensure that:
You can find a detailed discussion in: