Как обращаться с файлами cookie в Selenium Вебдрайвер

⚡ Умное резюме

Файлы cookie хранят пользовательские предпочтения и идентификаторы сеанса в виде пар «ключ-значение», и Selenium WebDriver может считывать, сохранять и воспроизводить их, поэтому автоматизированный тест пропускает экран входа в систему при каждом последующем запуске.

  • 🔘 Основные принципы работы с файлами cookie: Файл cookie содержит имя, значение, домен, путь, срок действия, а также флаги secure и HttpOnly.
  • ☑️ Шесть команд: Функции getCookies, getCookieNamed, addCookie, deleteCookie, deleteCookieNamed и deleteAllCookies охватывают все операции.
  • Демонстрация в два этапа: На первом этапе аутентификационный cookie записывается в файл, на втором — воспроизводится для аутентификации новой сессии.
  • 🧪 Экономия времени: Повторное использование сессионного cookie-файла исключает этапы авторизации из каждого тестового случая и сокращает общее время выполнения.
  • 🇧🇷 Без редактирования: Изменить cookie-файл на месте невозможно, поэтому удалите старый и создайте новую копию с помощью Cookie.Builder.
  • ⚠️ Правило домена: Перед вызовом функции addCookie перейдите на целевой сайт, иначе браузер полностью отклонит cookie-файл.

Как работать с файлами cookie в Selenium Вебдрайвер

HTTP-куки содержит информацию о пользователе и его предпочтениях. Он хранит информацию в виде пары «ключ-значение». Это небольшой фрагмент данных, отправляемый веб-приложением и сохраняемый в веб-браузере во время просмотра пользователем данного веб-сайта.

Если вы новичок в этой теме, начните с этого руководства. тестирование файлов cookie.

Selenium Команды запроса для файлов cookie

In Selenium В WebDriver мы можем запрашивать и взаимодействовать с файлами cookie, используя встроенные методы, описанные ниже. Доступ к каждому из них осуществляется через driver.manage(), который возвращает интерфейс Options.

Selenium Команды запроса Результат
driver.manage().getCookies(); Возвращает список всех файлов cookie.
driver.manage().getCookieNamed(arg0); Возвращает конкретный cookie-файл по имени.
driver.manage().addCookie(arg0); Создает и добавляет cookie-файл.
driver.manage().deleteCookie(arg0); Удаляет определенный cookie-файл.
driver.manage().deleteCookieNamed(arg0); Удаляет определенный cookie-файл по имени.
driver.manage().deleteAllCookies(); Удаляет все файлы cookie

Зачем обрабатывать (принимать) файлы cookie в Selenium?

Каждый файл cookie связан с именем, значением, доменом, путем, сроком действия и статусом того, является ли он безопасным или нет. Чтобы проверить клиента, сервер анализирует все эти значения в файле cookie.

После появления тестов веб-приложение, использующее Selenium WebDriver, вам может потребоваться создать, обновить или удалить cookie-файл.

Например, при автоматизации интернет-магазина.ping В этом приложении вам может потребоваться автоматизировать тестовые сценарии, такие как размещение заказа, просмотр корзины, информация об оплате, подтверждение заказа и так далее.

Если файлы cookie не сохраняются, вам придется каждый раз выполнять вход в систему перед запуском описанных выше тестовых сценариев. Это увеличит трудозатраты на написание кода и время выполнения.

Решение заключается в хранении файлов cookie в файле. LaterПолучите значения cookie-файла из этого файла и добавьте их в текущую сессию браузера. В результате вы сможете пропустить этапы входа в систему в каждом браузере. прецедент потому что ваша сессия драйвера содержит эту информацию.

Теперь сервер приложений рассматривает вашу браузерную сессию как аутентифицированную и напрямую перенаправляет вас на запрошенный вами сайт. URL.

Как обращаться с файлами cookie в Selenium

Мы будем использовать https://demo.guru99.com/test/cookie/selenium_aut.php для нашей демонстрационной цели.

Это будет двухэтапный процесс.

Шаг 1) Войдите в приложение и сохраните сгенерированный аутентификационный cookie.

В демонстрационном приложении представлена ​​простая форма авторизации, показанная ниже.

Guru99 Selenium Демонстрационная форма входа в систему с полями для имени пользователя и пароля.

Шаг 2) Используйте сохраненный cookie-файл для повторного входа в приложение без использования идентификатора пользователя и пароля.

Шаг 1) Сохранение информации о файлах cookie

package CookieExample;

import java.io.BufferedWriter;		
import java.io.File;		
import java.io.FileWriter;
import java.util.Set;
import org.openqa.selenium.By;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.Cookie;		

public class cookieRead{	
        public static void main(String[] args)		
    {
    	WebDriver driver;	
        System.setProperty("webdriver.chrome.driver","G:///chromedriver.exe");					
		driver=new ChromeDriver();        
		driver.get("https://demo.guru99.com/test/cookie/selenium_aut.php");

       				
        // Input Email id and Password If you are already Register		
        driver.findElement(By.name("username")).sendKeys("abc123");							
        driver.findElement(By.name("password")).sendKeys("123xyz");							
        driver.findElement(By.name("submit")).click();					
        		
        // create file named Cookies to store Login Information		
        File file = new File("Cookies.data");							
        try		
        {	  
            // Delete old file if exists
			file.delete();		
            file.createNewFile();			
            FileWriter fileWrite = new FileWriter(file);							
            BufferedWriter Bwrite = new BufferedWriter(fileWrite);							
            // loop for getting the cookie information 		
            	
            // loop for getting the cookie information 		
            for(Cookie ck : driver.manage().getCookies())							
            {			
                Bwrite.write((ck.getName()+";"+ck.getValue()+";"+ck.getDomain()+";"+ck.getPath()+";"+ck.getExpiry()+";"+ck.isSecure()));																									
                Bwrite.newLine();             
            }			
            Bwrite.close();			
            fileWrite.close();	
            
        }
        catch(Exception ex)					
        {		
            ex.printStackTrace();			
        }		
    }		
}

⚠️ Примечание к версии: Строка System.setProperty сохранена в точности так, как она была написана в оригинальном руководстве. Selenium 4.6 г. Selenium Менеджер автоматически загружает и настраивает соответствующий драйвер Chromedriver, поэтому эта строка больше не требуется в текущей конфигурации. Исходный код ниже оставлен без изменений и по-прежнему компилируется.

Code объяснение

  • Создайте экземпляр WebDriver.
  • Посетите веб-сайт, используя driver.get(“https://demo.guru99.com/test/cookie/selenium_aut.php”).
  • Войдите в приложение.
  • Прочтите информацию о файлах cookie, используя
    driver.manage().getCookies();
  • Сохраните информацию о файлах cookie с помощью файла.Writer класс для записи потоков символов, и BufferedWriter записать текст в файл с именем Cookies.data.
  • Файл Cookies.data хранит всю информацию о файлах cookie, включая имя, значение, домен и путь. Мы можем получить эту информацию и войти в приложение без ввода учетных данных.

После выполнения приведенного выше кода в структуре папок проекта будет создан файл Cookies.data. Откройте этот файл, и вы увидите учетные данные для входа в тестируемое приложение, сохраненные в формате cookie, как показано на выделенном скриншоте ниже.

Содержимое файла Cookies.data, отображающее сохраненный cookie сессии в формате имя значение домен путь

Шаг 2) Использование сохраненного файла cookie для входа в приложение.

Теперь мы получим доступ к cookie-файлу, сгенерированному на шаге 1, и используем его для аутентификации нашей сессии в приложении.

package CookieExample;

import java.io.BufferedReader;		
import java.io.File;		
import java.io.FileReader;		
import java.util.Date;		
import java.util.StringTokenizer;		
import org.openqa.selenium.Cookie;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.chrome.ChromeDriver;

public class CookieWrite		
{		
  
	public static void main(String[] args){ 
    	WebDriver driver;     
       	System.setProperty("webdriver.chrome.driver","G://chromedriver.exe");					
        driver=new ChromeDriver();					
    try{			
     
        File file = new File("Cookies.data");							
        FileReader fileReader = new FileReader(file);							
        BufferedReader Buffreader = new BufferedReader(fileReader);							
        String strline;			
        while((strline=Buffreader.readLine())!=null){									
        StringTokenizer token = new StringTokenizer(strline,";");									
        while(token.hasMoreTokens()){					
        String name = token.nextToken();					
        String value = token.nextToken();					
        String domain = token.nextToken();					
        String path = token.nextToken();					
        Date expiry = null;					
        		
        String val;			
        if(!(val=token.nextToken()).equals("null"))
		{		
        	expiry = new Date(val);					
        }		
        Boolean isSecure = new Boolean(token.nextToken()).								
        booleanValue();		
        Cookie ck = new Cookie(name,value,domain,path,expiry,isSecure);			
        System.out.println(ck);
        driver.manage().addCookie(ck); // This will add the stored cookie to your current session					
        }		
        }		
        }catch(Exception ex){					
        ex.printStackTrace();			
        }		
        driver.get("https://demo.guru99.com/test/cookie/selenium_aut.php");					
}	
	}	

Результат: Вы сразу переходите на экран подтверждения успешного входа в систему, без ввода идентификатора пользователя и пароля.

ПРИМЕЧАНИЕ: Если после выполнения указанного выше скрипта вы увидите страницу входа в систему, обязательно обновите страницу.

⚠️ Java записки: В скрипте чтения используются методы `new Boolean(String)` и `new Date(String)`, которые в JDK давно устарели. В современной версии JDK эквивалентами являются `Boolean.parseBoolean(token.nextToken())` и парсер `java.time`. Оригинальные строки выше сохранены; рассматривайте примечание как современную замену, а не как редактирование.

Атрибуты файлов cookie и Selenium Мастер-класс по приготовлению печенья

Два приведенных выше скрипта перемещают шесть полей в файл и из файла. Эти поля — именно те, которые предоставляет класс org.openqa.selenium.Cookie, и знание их значительно упрощает чтение цикла токенизации на шаге 2.

Атрибут Аксессуар Что это значит
Имя GetName () Ключ, который ищет сервер, например, JSESSIONID.
Значение GetValue () Сохраненные данные, обычно идентификатор сессии.
Домен GetDomain () Хост, которому браузер отправит обратно cookie-файл.
Тропа GetPath () URL префикс, к которому применяется cookie-файл.
окончание получить срок действия () Дата истечения срока действия cookie-файла. Значение null означает, что это сессионный cookie-файл.
Безопасный isSecure() Возвращает true, если cookie-файл отправляется только по протоколу HTTPS.
HttpOnly isHttpOnly() Верно, когда JavaСкрипт на странице не может прочитать cookie-файл.
СамСайт getSameSite() Строгий, мягкий или без ограничений. Добавлено в Selenium 4.

Вместо конструктора с шестью аргументами, использованного на шаге 2, в текущем коде обычно создается cookie через внутренний класс Builder, что позволяет устанавливать только те поля, которые вас интересуют.

Cookie sessionCookie = new Cookie.Builder("JSESSIONID", "A1B2C3D4")
        .domain("demo.guru99.com")
        .path("/")
        .isSecure(true)
        .isHttpOnly(true)
        .build();

driver.manage().addCookie(sessionCookie);

Одно правило часто ставит людей в тупик: объект cookie нельзя редактировать после его создания. Чтобы изменить значение, нужно удалить старый cookie и создать новую копию, поэтому Builder так полезен.

Cookie original = driver.manage().getCookieNamed("JSESSIONID");
driver.manage().deleteCookie(original);

Cookie updated = new Cookie.Builder(original.getName(), "NEW-VALUE")
        .domain(original.getDomain())
        .path(original.getPath())
        .isSecure(original.isSecure())
        .build();

driver.manage().addCookie(updated);

Распространенные ошибки при работе с файлами cookie Selenium WebDrivers и как их исправить

В коде cookie обычно возникают сбои по нескольким предсказуемым причинам. В таблице ниже перечислены наиболее часто встречающиеся из них, а также их причины и способы устранения.

Симптом Вызывать фиксированный
InvalidCookieDomainException Функция addCookie была вызвана до перехода на сайт, поэтому браузер по-прежнему находится в состоянии about:blank. Сначала вызовите метод driver.get для целевого домена, затем добавьте cookie.
UnableToSetCookieException Домен cookie-файла не соответствует текущей загруженной странице. Удалите поле домена или укажите точный хост открываемой страницы.
Страница входа в систему по-прежнему отображается после добавления cookie. Страница была отрисована до того, как файл cookie был создан. Вызовите метод driver.navigate().refresh(), что и подразумевается в примечании выше под принудительным обновлением страницы.
getCookieNamed возвращает null Название написано с ошибкой, или cookie-файл относится к другому пути или поддомену. С помощью функции getCookies получить все файлы cookie и сравнить их имена.
Сохраненный cookie-файл отклоняется при последующем запуске. Срок действия истек или сервер завершил сессию. Для повторного выполнения шага 1 сгенерируйте файл Cookies.data заново.

Если браузер открывается и проходит аутентификацию корректно, но после этого скрипт завершается с ошибкой, то, вероятно, проблема не в cookie. Необходимо разобраться в проблеме. обработка исключений в Selenium оттуда — более быстрый маршрут, и для него есть специально оборудованная дорога. Firefox профиль Это обычная альтернатива, когда необходимо сохранить данные сессии без использования файла.

Часто задаваемые вопросы (FAQ)

Есть два варианта. Нажать кнопку «Принять», как любой другой элемент, или установить cookie согласия сайта с помощью addCookie перед перезагрузкой страницы, чтобы баннер никогда не отображался. Второй подход быстрее и устраняет распространенную причину нестабильных первых шагов.

Python Использует эквиваленты snake_case в самом драйвере: driver.get_cookies(), driver.get_cookie(name), driver.add_cookie(dict) и driver.delete_all_cookies(). Файлы cookie возвращаются в виде словарей, а не объектов Cookie, поэтому считывайте значения в квадратных скобках.

Да. WebDriver взаимодействует с браузером через драйвер, а не через JavaСкрипт позволяет отображать файлы cookie с флагом HttpOnly через getCookies. Вызовите методы isHttpOnly и isSecure для объекта Cookie, чтобы проверить эти флаги.

Анализ с помощью ИИ группирует неудачные запуски по общим сигналам и часто traces периодически выдает ошибки выхода из системы из-за истекшего или отсутствующего cookie-файла сессии. Некоторые инструменты также определяют, какие cookie-файлы используются в ходе успешного запуска, и предупреждают, когда сессия отклоняется от этого базового уровня.

Второй пилот GitHub Циклы чтения, записи и восстановления пишутся быстро, но часто воспроизводятся устаревшие конструкторы new Boolean и new Date. RevПросмотрите каждый сгенерированный фрагмент на фоне текущего Java и Selenium API-интерфейсы.

Нет. Сессионный cookie — это действующие учетные данные, поэтому сохраненный файл Cookies.data позволяет любому пользователю с доступом к репозиторию выдавать себя за эту учетную запись. Не включайте этот файл в систему контроля версий и генерируйте его заново для каждой среды.

По умолчанию — нет. Каждая сессия начинается с чистого профиля браузера, именно поэтому cookie-файл записывается на диск и воспроизводится повторно. Другой способ поддерживать сессию активной между запусками — прикрепить сохраненный профиль браузера.

Сессионные файлы cookie содержат метку времени истечения срока действия, и сервер также tracУ каждого из них свой срок действия сессии. После истечения этого срока воспроизведенный cookie отклоняется, и страница входа возвращается, поэтому лучше сгенерировать сохраненный cookie, а не использовать старый файл.

Подведем итог этой публикации следующим образом: