Суть задачи:
Необходимо в пределах одного теста иметь доступ к нескольким сессиям одного и того же браузера (сессии отличаются определенным набором 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();