Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Предустановка Cookie в Selenide для проверки функционала Remember Me

selenide
Теги: #<Tag:0x00007f7b64941858>

(Ivan Trechyokas) #1

Задача - проверить функционал “запомнить меня”,
Есть куки вида:

Cookies: cookie1: “value”; coockieRemember: “value2”

Делаю так:
сохраняю куки перед закрытием, закрываю, добавляю куки и открываю страницу:
(прочитал здесь: https://groups.google.com/forum/#!topic/selenide/C-iA_ZR6f6Q)

open(mainPage);
login(name, pass);
cookie = WebDriverRunner.getWebDriver().manage().getCookieNamed(coockieRemember);
close();
WebDriverRunner.getWebDriver().manage().addCookie(coockieRemember);
open(mainPage);

Но не тут-то было, здесь вываливается ошибка
org.openqa.selenium.InvalidCookieDomainException: You may only set cookies for the current domain

В интернетах есть решение, модифицировать парочку файлов в firefox, либо открывать страницу, потом добавить куки и уже перейти куда надо (и это работает):

cookie = WebDriverRunner.getWebDriver().manage().getCookieNamed(coockieRemember);
close();
open(mainPage);  //additional step
WebDriverRunner.getWebDriver().manage().addCookie(coockieRemember);
open(mainPage);

Может быть есть нормальное решение для этого случая?


Чистка cookies перед началом нового теста
(Sergey Korol) #2

Согласно официальной документации:

First of all, you need to be on the domain that the cookie will be valid for.


(Stan) #3

Конечно, куки нельзя поставить, не находясь на домене. Можете сами попробовать открыть http://google.com и попробовать посмотреть-поменять куки от http://yandex.ru (если конечно не пользоваться хитрыми аддонами, которые меняют кукисы на домене напрямую через файлы локальных баз)


(Ivan Trechyokas) #4

По опыту работы с http-запросами, я могу послать запрос с заранее заданными заголовками, в том числе и куки, вопрос о том, будут ли они обработаны на той стороне - не относится к данной проблеме.

Не совсем понятно, как связаны google и yandex в данном контексте, я упоминал, что нахожусь на mainPage, логинюсь, далее закрываю браузер и открываю его, что бы проверить авторизует ли он меня по куке. Всё происходит в рамках одного домена, но в разных сессиях.

Я исходил из комментария Андрея Солнцева о том, что надо выставлять “ДО” запроса. Но так не поехало.


(Ivan Trechyokas) #5

Ага, спасибо.
Но тут я опирался на комментарий разработчика из Selenide, думал, что они допилили это.

А если всё-таки очень хочется использовать куки, то выставлять их надо ДО запроса. То есть примерно так:

 Cookie ck = new Cookie("4langcookie", "en");
 WebDriverRunner.getWebDriver().manage().addCookie(ck);
 open("http://www.test.com");

Andrei Solntsev

(Sergey Korol) #6

Насколько я правильно помню, при сете куков проверяется домен последней используемой пейджи. Если вы закрыли вкладку, проверять уже нечего.

А Selenide просто оборачивает имеющиеся Selenium API. В вашем коде вы вызываете все тот же native вариант через кастомный ранер.


(Stan) #7

Вы сами ответили на свой вопрос. По канонам browser security куки сэтать и изменять можно только в пределах домена на котором находишься в данный момент. Единственное что можно делать вне данного домена, так это читать куки с других доменах при определенных настройках. CORS не позволяет шарить большинство приватных данных между доменами, что в принципе и логично.

Попробуй в консоли открыв сайт http://automated-testing.info/ поставить куку:
document.cookie='test=123;domain=.automated-testing.info'
Поставится.

А теперь, оставаясь на http://automated-testing.info, попробуй:
document.cookie='test=12345;domain=.google.com'

Теперь зайди на google.com и проверь что куки нет.

Суть в том что селениум не может сделать того, что в принципе нельзя (оговорка, потому что на самом деле можно, но не стандартными возможностями браузера).


(Ivan Trechyokas) #8

У меня аналогия другая, если я руками это делаю, то это выглядит так: я открываю страницу, существующие куки подхватываются автоматически и на сайте я уже авторизован без дополнительных действий. Логично же.

Если я это делаю через Selenium, то мне нужно зайти на сайт, потом уже добавить куку и открыть страницу. Не вижу здесь “то, чего в принципе нельзя”.

Я понял ваш посыл. Спасибо.


(Stan) #9

Почти так. Куки то там как-то изначально появились? Во время предыдущего захода на сайт.


(Ivan Trechyokas) #10

Да, последовательность действий простая:
1- Открываю сайт
2- логинюсь
3- меня перенаправляет на дашборд (автоматически)
4- закрываю
5- открываю сайт
6- меня перенаправляет на дашборд (автоматически)

При работе с селениумом, мне надо между 5 и 6 пунктами добавить ещё парочку: “подключить куки” и переоткрыть сайт.


(Stan) #11

Если 4-5 делать в пределах одной и той же сессии, то не надо. То есть я бы предположил что это один тест. Если же все браузер все таки инициализируется заново, то да, прийдется открыть, поставить куки, и переоткрыть еще раз.


(Ivan Trechyokas) #12

Вот я тоже так думал, но Selenide обрабатывает close() так, что куки не сохраняются и без них на сайт меня уже не пускает. В связи с этим и появился вопрос, что в рамках одного теста:

open(page)
close()
open(page)

открывает барузер, который не помнит меня. Закрывать пробовал и через WebDriverRunner.getWebDriver().close() и прочие варианты. Забывает напрочь. Приходится добавлять куки.


(Stan) #13

По идее браузер можно закрыть с сохранением кук, вот тут отвечал @ArtOfLife - [Resolved] тесты мешают друг другу, Selenium/Selenide . Лично не пробовал и что-то не нашел этого в документации.


(asolntsev) #14

А вам не кажется, что вы перемудрили?
Этим тестов вы по сути проверяете не то, как работает ваше приложение, а то, что браузер посылает куки при закрытии и переоткрытии вкладки. Не?


(Ivan Trechyokas) #15

Но как-то же надо проверить, что он запоминает пользователя. Можно подменой куков, наверное. Но это не так очевидно.


(asolntsev) #16

Ну так я и говорю, вы по сути хотите проверить не работу вашего приложения, а работу браузера. Для приложения переоткрытие вкладки равносильно простому refresh.