Hoe om te gaan met cookies Selenium webdriver

โšก Slimme samenvatting

Cookies slaan gebruikersvoorkeuren en sessie-identificaties op als sleutel-waardeparen, en Selenium WebDriver kan ze lezen, opslaan en opnieuw afspelen, zodat een geautomatiseerde test het inlogscherm bij elke volgende uitvoering overslaat.

  • ๐Ÿ”˜ Basisprincipes van koekjes: Een cookie bevat een naam, waarde, domein, pad, vervaldatum en de vlaggen secure en HttpOnly.
  • โ˜‘๏ธ Zes commando's: getCookies, getCookieNamed, addCookie, deleteCookie, deleteCookieNamed en deleteAllCookies dekken elke bewerking.
  • โœ… Demonstratie in twee stappen: In de eerste stap wordt de authenticatiecookie naar een bestand geschreven, in de tweede stap wordt deze opnieuw gebruikt om een โ€‹โ€‹nieuwe sessie te authenticeren.
  • ๐Ÿงช Tijdsbesparing: Door een sessiecookie opnieuw te gebruiken, worden de inlogstappen voor elke testcase overgeslagen en de totale uitvoeringstijd verkort.
  • ๏ธ Niet bewerken: Een cookie kan niet ter plaatse worden gewijzigd, dus verwijder de oude en voeg een nieuwe kopie toe via Cookie.Builder.
  • โš ๏ธ Domeinregel: Ga eerst naar de gewenste website voordat u addCookie aanroept, anders zal de browser de cookie direct weigeren.

Hoe om te gaan met cookies in Selenium webdriver

Een HTTP-cookie bevat informatie over de gebruiker en diens voorkeuren. Deze informatie wordt opgeslagen met behulp van sleutel-waardeparen. Het is een klein stukje data dat door een webapplicatie wordt verzonden en in de webbrowser wordt opgeslagen terwijl de gebruiker de website bezoekt.

Als je nog niet bekend bent met dit onderwerp, begin dan met deze handleiding. koekjes testen.

Selenium Queryopdrachten voor cookies

In Selenium Met WebDriver kunnen we cookies opvragen en ermee interageren via de onderstaande ingebouwde methoden. Elk van deze methoden is bereikbaar via driver.manage(), die de Options-interface retourneert.

Selenium Opdrachten opvragen uitgang
driver.manage().getCookies(); Geeft een lijst van alle cookies terug.
driver.manage().getCookieNamed(arg0); Retourneert een specifieke cookie op basis van de opgegeven naam.
driver.manage().addCookie(arg0); Maakt en voegt de cookie toe.
driver.manage().deleteCookie(arg0); Verwijdert een specifieke cookie
driver.manage().deleteCookieNamed(arg0); Verwijdert een specifieke cookie op basis van de naam.
driver.manage().deleteAllCookies(); Verwijdert alle cookies

Waarom omgaan met (accepteren) cookies? Selenium?

Elke cookie is gekoppeld aan een naam, waarde, domein, pad, vervaldatum en de status of deze veilig is of niet. Om een โ€‹โ€‹client te valideren, parseert een server al deze waarden in een cookie.

. het testen van een webapplicatie die gebruikmaakt van Selenium Voor WebDriver moet u mogelijk een cookie aanmaken, bijwerken of verwijderen.

Bijvoorbeeld bij het automatiseren van een webwinkel.ping Voor deze applicatie is het wellicht nodig om testscenario's te automatiseren, zoals het plaatsen van een bestelling, het bekijken van het winkelmandje, betalingsgegevens, orderbevestiging, enzovoort.

Als er geen cookies worden opgeslagen, moet u elke keer opnieuw inloggen voordat u de bovenstaande testscenario's uitvoert. Dit verhoogt de programmeerinspanning en de uitvoeringstijd.

De oplossing is om cookies in een bestand op te slaan. LaterHaal de cookie-waarden uit dit bestand op en voeg ze toe aan je huidige browsersessie. Hierdoor kun je de inlogstappen in elke browser overslaan. testcase omdat uw chauffeurssessie deze informatie bevat.

De applicatieserver beschouwt uw browsersessie nu als geauthenticeerd en leidt u direct naar de door u aangevraagde pagina. URL.

Hoe om te gaan met cookies Selenium

We zullen gebruiken https://demo.guru99.com/test/cookie/selenium_aut.php voor ons demodoel.

Dit zal een proces van 2 stappen zijn.

Stap 1) Log in op de applicatie en sla de gegenereerde authenticatiecookie op.

De demo-applicatie toont het eenvoudige inlogformulier zoals hieronder weergegeven.

Guru99 Selenium Demo-inlogformulier met cookie, inclusief gebruikersnaam- en wachtwoordvelden.

Stap 2) Gebruik de opgeslagen cookie om opnieuw in te loggen op de applicatie zonder gebruikersnaam en wachtwoord.

Stap 1) Cookie-informatie opslaan

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();			
        }		
    }		
}

โš ๏ธ Versie-opmerking: De regel `System.setProperty` is exact overgenomen zoals deze in de oorspronkelijke handleiding stond. Selenium vanaf 4.6, Selenium De manager downloadt en configureert de bijbehorende chromedriver automatisch, waardoor die regel in de huidige configuratie niet meer nodig is. De originele code is hieronder ongewijzigd gebleven en compileert nog steeds.

Code Uitleg

  • Maak een WebDriver-instantie aan.
  • Bezoek de website met driver.get(โ€œhttps://demo.guru99.com/test/cookie/selenium_aut.phpโ€).
  • Log in op de applicatie.
  • Lees de cookie-informatie met behulp van
    driver.manage().getCookies();
  • Sla de cookie-informatie op met behulp van het bestand.Writer klasse om tekenreeksen te schrijven, en BufferedWriter De tekst moet worden opgeslagen in een bestand met de naam Cookies.data.
  • Het bestand Cookies.data bevat alle cookie-informatie, inclusief naam, waarde, domein en pad. We kunnen deze informatie ophalen en inloggen op de applicatie zonder de inloggegevens in te voeren.

Zodra je de bovenstaande code uitvoert, wordt het bestand Cookies.data aangemaakt in de projectmap. Open het bestand en je ziet de inloggegevens van de AUT opgeslagen in cookieformaat, zoals in de onderstaande gemarkeerde schermafbeelding te zien is.

De inhoud van het bestand Cookies.data toont de opgeslagen sessiecookie in de vorm van een naam-waarde-domein-pad.

Stap 2) Opgeslagen cookie gebruiken om in te loggen op de applicatie

Nu gaan we de cookie die in stap 1 is gegenereerd gebruiken om onze sessie in de applicatie te authenticeren.

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");					
}	
	}	

Resultaat: Je wordt direct naar het scherm met de aanmeldbevestiging geleid zonder dat je je gebruikersnaam en wachtwoord hoeft in te voeren.

LET OP: Gebruik een harde vernieuwing als je de inlogpagina ziet nadat je het bovenstaande script hebt uitgevoerd.

โš ๏ธ Java Opmerkingen: Het script voor de lezer gebruikt `new Boolean(String)` en `new Date(String)`, functies die de JDK al lang geleden heeft afgekeurd. In een moderne JDK zijn de equivalenten `Boolean.parseBoolean(token.nextToken())` en een `java.time`-parser. De originele regels zijn hierboven behouden; beschouw de opmerking als de moderne vervanging en niet als een bewerking.

Cookie-attributen en de Selenium Koekjesklasse

De twee bovenstaande scripts verplaatsen zes velden in en uit een bestand. Deze velden zijn precies wat de klasse org.openqa.selenium.Cookie beschikbaar stelt, en door deze velden te kennen, wordt de tokenizer-loop in stap 2 veel gemakkelijker te lezen.

Kenmerk accessoire Wat het betekent
Naam getName () De sleutel die de server opzoekt, bijvoorbeeld JSESSIONID.
Waarde getValue () De opgeslagen gegevens, meestal de sessie-ID.
Domein getDomain() De host waarnaar de browser de cookie terugstuurt.
Pad getPath() De URL Voeg het voorvoegsel toe waarop de cookie van toepassing is.
houdbaarheid getExpiry() De datum waarop de cookie verloopt. Een null-waarde betekent dat het een sessiecookie betreft.
Beveilig isSecure() Dit is waar wanneer de cookie alleen via HTTPS wordt verzonden.
HttpOnly isHttpOnly() Waar wanneer JavaHet script op de pagina kan de cookie niet lezen.
Zelfde site getSameSite() Streng, laks of geen. Toegevoegd in Selenium 4.

In plaats van de constructor met zes argumenten die in stap 2 werd gebruikt, bouwt de huidige code een cookie meestal via de interne Builder-klasse, waarmee je alleen de velden kunt instellen die voor jou relevant zijn.

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

driver.manage().addCookie(sessionCookie);

Eรฉn regel loopt voor de meeste mensen vast: een cookie-object kan niet meer worden bewerkt nadat het is aangemaakt. Om een โ€‹โ€‹waarde te wijzigen, moet je de oude cookie verwijderen en een nieuwe kopie toevoegen. Daarom is Builder zo handig.

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);

Veelvoorkomende cookiefouten in Selenium WebDriver en hoe je ze kunt repareren

Cookiecode faalt vaak op een aantal voorspelbare manieren. De onderstaande tabel geeft een overzicht van de meest voorkomende fouten, samen met de oorzaak en de oplossing.

Symptoom Veroorzaken Bepalen
InvalidCookieDomainException De functie `addCookie` werd aangeroepen voordat de site werd bezocht, dus de browser staat nog steeds op `about:blank`. Roep eerst driver.get aan op het doeldomein en voeg daarna de cookie toe.
UnableToSetCookieException Het cookiedomein komt niet overeen met de pagina die momenteel wordt geladen. Verwijder het domeinveld of stel het in op de exacte host van de geopende pagina.
De inlogpagina blijft verschijnen, zelfs na het toevoegen van de cookie. De pagina werd geladen voordat de cookie bestond. Roep driver.navigate().refresh() aan, wat in de bovenstaande OPMERKING wordt bedoeld met een harde vernieuwing.
getCookieNamed retourneert null De naam is verkeerd gespeld, of de cookie hoort bij een ander pad of subdomein. Sla alle cookies op met getCookies en vergelijk de namen.
De opgeslagen cookie wordt bij een latere uitvoering geweigerd. De vervaldatum is verstreken of de server heeft de sessie beรซindigd. Genereer Cookies.data opnieuw door stap 1 nogmaals uit te voeren.

Als de browser correct opent en de authenticatie goed verloopt, maar het script daarna vastloopt, ligt het probleem waarschijnlijk niet bij de cookie. Verderop in het proces... exception handling in Selenium is de snellere route vanaf dat punt, en een speciale Firefox profielen Dit is het gebruikelijke alternatief wanneer je wilt dat sessiegegevens bewaard blijven zonder dat er een bestand nodig is.

Veelgestelde vragen

Twee opties. Klik op de knop 'Accepteren' zoals bij elk ander element, of stel de toestemmingscookie van de site in met addCookie voordat de pagina opnieuw wordt geladen, zodat de banner nooit wordt weergegeven. De tweede methode is sneller en voorkomt een veelvoorkomende oorzaak van onbetrouwbare eerste stappen.

Python De driver zelf gebruikt snake_case-equivalenten: driver.get_cookies(), driver.get_cookie(name), driver.add_cookie(dict) en driver.delete_all_cookies(). Cookies worden geretourneerd als dictionaries in plaats van Cookie-objecten, dus lees waarden tussen vierkante haken.

Ja. WebDriver communiceert met de browser via de driver zelf, en niet via de browser. JavaScript, zodat HttpOnly-cookies zichtbaar zijn via getCookies. Roep isHttpOnly en isSecure aan op het Cookie-object om deze vlaggen te inspecteren.

AI-ondersteunde analysegroepen die mislukte runs groeperen op basis van gedeelde signalen en vaak tracDit kan te maken hebben met intermitterende uitlogfouten als gevolg van een verlopen of ontbrekende sessiecookie. Sommige tools leren ook welke cookies een sessie bijhoudt en waarschuwen wanneer een sessie van die basislijn afwijkt.

GitHub-copiloot Het schrijft de lees-, schrijf- en herstellussen snel, maar het reproduceert vaak de verouderde constructors `new Boolean` en `new Date`. RevBekijk elk gegenereerd fragment ten opzichte van de huidige Java en Selenium API's.

Nee. Een sessiecookie is een actieve authenticatie-sleutel, dus een opgeslagen Cookies.data-bestand stelt iedereen met toegang tot de repository in staat om zich voor te doen als dat account. Houd het bestand buiten versiebeheer en genereer het opnieuw per omgeving.

Niet standaard. Elke sessie begint met een schoon browserprofiel, en dat is precies de reden waarom de cookie naar de schijf wordt geschreven en opnieuw wordt gebruikt. Het toevoegen van een opgeslagen browserprofiel is de andere manier om een โ€‹โ€‹sessie actief te houden tijdens meerdere sessies.

Sessiecookies bevatten een vervaldatum en de server ook tracks heeft zijn eigen sessielevensduur. Zodra een van beide verloopt, wordt de opnieuw gebruikte cookie geweigerd en keert de inlogpagina terug. Genereer daarom de opgeslagen cookie opnieuw in plaats van een oud bestand te hergebruiken.

Vat dit bericht samen met: