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

Проблема с Selenium driver.manage().addCookie()


(Val_Ch) #1

Суть задачи:

Необходимо в пределах одного теста иметь доступ к нескольким сессиям одного и того же браузера (сессии отличаются определенным набором cookie).

Как решали:

После успешного входа запоминаем текущие cookie браузера

    userCookies[i] = driver.manage().getCookies();

И очищаем их

    driver.manage().deleteAllCookies();

Тут проблем нет. При необходимости доступа к сайту под конкретным пользователем (сиречь в контексте конкретной сессии) куки восстанавливаем:

    cookiesRestore(userCookies[i]);

Код оной cookiesRestore выглядит так

public void cookiesRestore(Set<Cookie> cookies) throws Exception 
{
    for (Cookie cookie : cookies) {
        Cookie.Builder cb = new Cookie.Builder(cookie.getName(), cookie.getValue());
        // Remove "." from beginning to avoid exception about setting cookie for different domain
        cb.domain(cookie.getDomain().replaceFirst("^\\.", ""));
        cb.expiresOn(cookie.getExpiry());
        cb.path(cookie.getPath());
        driver.manage().addCookie(cb.build());
    }
}

В этом месте все также хорошо, сессия осстанавливается и сайт отображает персонализированную информацию.

Суть проблемы:

После того как cookie были восстановлены с помощью addCookie удалить их сервером не представляется возможным.

Более детальная информация:
Порядок запросов (скрин с пруфом):

http://example.com/community/1_7_0_2/customer/account/logout/

http://example.com/community/1_7_0_2/customer/account/logoutSuccess/
На этом этапе сервер запрашивает удаление Cookie

  • Request Headers

GET /community/1_7_0_2/customer/account/logoutSuccess/ HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://example.com/community/1_7_0_2/electronics/cell-phones.html
Cookie: GSBC_CUSTOMER_GROUP=f4aee0ff13df6562b7efcb1096bc17a9; GSBC_FORM_KEY=f2PpIsRnipHcW6ZQ; GSBC_CUSTOMER=852f1523f81eb1ecb073e2b05601d571; frontend=454pi1d5dofp897ae5ua66jiu5; GSBC_FORM_KEY_HASH=1e668ce4d2f2979c0237d7a51546e9ac; GSBC_CUSTOMER=852f1523f81eb1ecb073e2b05601d571; GSBC_CUSTOMER_GROUP=f4aee0ff13df6562b7efcb1096bc17a9; GSBC_FORM_KEY=f2PpIsRnipHcW6ZQ; GSBC_FORM_KEY_HASH=1e668ce4d2f2979c0237d7a51546e9ac; GSBC_CATALOG_CATEGORY_SESSION_PARAMS=eNoDAAAAAAE%3D3e5d2975d
Connection: keep-alive

  • Response Headers

Обратите внимание на запрос удаления кук GSBC_CUSTOMER и GSBC_CUSTOMER_GROUP

http://example.com/community/1_7_0_2/
По непонятной причине куки, которые были удалены на предыдущем этапе снова посылаются на сервер на этом этапе

  • Request Headers

Обратите внимание на cookie GSBC_CUSTOMER_GROUP и GSBC_CUSTOMER.

До момента пока не начали манипулировать cookie подобной проблемы не существовало.

Код, который генерирует вереницу запросов с редиректом и восстановлением куки:

    cookiesRestore(userCookies[i]);
    driver.get(baseUrl + "/electronics/cell-phones.html");
    /** 
     * logoutButton declared as:
     *
     * @FindBy(xpath = "//a[@title='Log Out']")
     * private WebElement logoutButton;
     */
    logoutButton.click();

(Александр Таранков) #2

Не очень понятно для чего это делается. Пользователь в реальной жизни не будет такой ерундой заниматься же, правильно? Он будет как-то по-другому работать с приложением.
Что мешает работать в автотестах с приложением так, как это будет делать пользователь в реальности?


(Александр Таранков) #3

Или у тебя не функциональный тест? Тогда какую цель пытаешься достичь?


(Val_Ch) #4

и так … объясняю … имеем дело с magento comumnity 1.7.0.2, а именно с екстеншеном, который кэширует страницы … тест выполняется “от имени” четырех пользователей (2 относятся к одной группе, 2 к другой) … в ходе теста я логинюся, вилогинююся … и сверяю welcome messages для того или иного пользователя
делать это в ручную очень накладно … надо проверить около 20 версий


(Val_Ch) #5

ох … простите, не все скопировала … вот тут нормально описано суть проблемы
http://www.sql.ru/forum/1087661/problema-s-selenium-driver-manage-addcookie


(Sergey Korol) #6

Проблемы кеша / куков решаются запуском тестов в новых инстансах браузера, т.е. драйвер инициализируем в BeforeMethod и сохраняем себе время и нервные клетки.

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


(Val_Ch) #7

ага … поняла
я самоучка … как-то оно у меня все тяжеловато получается … иногда в своем коде могу потеряться)

может. еще есть какие-то идеи как улучшить тест?


(Sergey Korol) #8

Если вы теряетесь в собственном коде, то вполне возможно, что стоит начать искать на этом форуме темы об архитектуре / паттернах и т.п.

Чтобы дать совет об улучшении теста, для начала надо его увидеть. :wink:


(Val_Ch) #9

сначала нужно долепить этот тест
спасибо за помощь


(Alexander Petrovich) #10

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