Cum să gestionați cookie-urile în Selenium webdriver

⚡ Rezumat inteligent

Cookie-urile stochează preferințele utilizatorilor și identificatorii de sesiune ca perechi cheie-valoare și Selenium WebDriver le poate citi, salva și reda, astfel încât un test automat sări peste ecranul de conectare la fiecare rulare ulterioară.

  • 🔘 Noțiuni de bază despre cookie-uri: Un cookie conține un nume, o valoare, un domeniu, o cale, o expirare și semnalizatoarele securizat și HttpOnly.
  • ☑️ Șase comenzi: getCookies, getCookieNamed, addCookie, deleteCookie, deleteCookieNamed și deleteAllCookies acoperă fiecare operațiune.
  • Demonstrație în doi pași: Primul pas scrie cookie-ul de autentificare într-un fișier, al doilea îl redă pentru a autentifica o sesiune nouă.
  • 🧪 Timp economisit: Reluarea unui cookie de sesiune elimină pașii de conectare din fiecare caz de testare și scurtează timpul total de execuție.
  • 🛠️ Fără editare: Un cookie nu poate fi modificat la locul lui, așa că șterge-l pe cel vechi și adaugă o copie reconstruită prin Cookie.Builder.
  • ⚠️ Regula domeniului: Navigați către site-ul țintă înainte de a apela addCookie, altfel browserul respinge direct cookie-ul.

Cum se gestionează cookie-urile în Selenium webdriver

Un cookie HTTP este alcătuit din informații despre utilizator și preferințele acestuia. Stochează informații folosind o pereche cheie-valoare. Este o mică porțiune de date trimisă de o aplicație web și stocată în browserul web, în ​​timp ce utilizatorul navighează pe site-ul respectiv.

Dacă ești nou în acest subiect, începe cu acest ghid pentru testarea cookie-urilor.

Selenium Comenzi de interogare pentru cookie-uri

In Selenium WebDriver, putem interoga și interacționa cu cookie-urile folosind metodele încorporate de mai jos. Fiecare dintre ele este accesată prin driver.manage(), care returnează interfața Opțiuni.

Selenium Comenzi de interogare producție
driver.manage().getCookies(); Returnează lista tuturor cookie-urilor
driver.manage().getCookieNamed(arg0); Returnează un cookie specific în funcție de nume
driver.manage().addCookie(arg0); Creează și adaugă cookie-ul
driver.manage().deleteCookie(arg0); Șterge un anumit cookie
driver.manage().deleteCookieNamed(arg0); Șterge un anumit cookie în funcție de nume
driver.manage().deleteAllCookies(); Șterge toate cookie-urile

De ce să gestionați (acceptați) cookie-urile în Selenium?

Fiecare cookie este asociat cu un nume, valoare, domeniu, cale, expirare și starea dacă este sigur sau nu. Pentru a valida un client, un server analizează toate aceste valori într-un cookie.

Atunci când de testare o aplicație web folosind Selenium WebDriver, este posibil să fie nevoie să creați, să actualizați sau să ștergeți un cookie.

De exemplu, atunci când automatizați un magazin onlineping aplicație, este posibil să fie nevoie să automatizați scenarii de testare precum plasarea comenzii, vizualizarea coșului, informațiile de plată, confirmarea comenzii și așa mai departe.

Dacă nu sunt stocate cookie-uri, va trebui să efectuați acțiunea de conectare de fiecare dată înainte de a executa scenariile de testare enumerate mai sus. Acest lucru va crește efortul de codare și timpul de execuție.

Soluția este stocarea cookie-urilor într-un fișier. Later, preia valorile cookie-ului din acest fișier și adaugă-le în sesiunea curentă a browserului. Prin urmare, puteți sări peste pașii de conectare din fiecare caz de testare deoarece sesiunea de șofer conține aceste informații.

Serverul de aplicații tratează acum sesiunea browserului dvs. ca fiind autentificată și vă duce direct la sesiunea solicitată. URL.

Cum să gestionați cookie-urile în Selenium

Noi vom folosi https://demo.guru99.com/test/cookie/selenium_aut.php pentru scopul nostru demonstrativ.

Acesta va fi un proces în 2 pași.

Pasul 1) Conectați-vă la aplicație și stocați cookie-ul de autentificare generat.

Aplicația demo prezintă formularul de autentificare simplu, așa cum este arătat mai jos.

Guru99 Selenium Formular de autentificare demonstrativ pentru cookie-uri cu câmpuri de nume de utilizator și parolă

Pasul 2) Folosește cookie-ul stocat pentru a te conecta din nou la aplicație fără a utiliza un nume de utilizator și o parolă.

Pasul 1) Stocarea informațiilor despre cookie-uri

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

⚠️ Notă privind versiunea: Linia System.setProperty este păstrată exact așa cum a fost scrisă în tutorialul original. De la Selenium 4.6 încoace, Selenium Manager descarcă și configurează automat driverul Chrome corespunzător, astfel încât linia respectivă nu mai este necesară în configurația curentă. Codul original este lăsat nemodificat mai jos și se compilează în continuare.

Code Explicație

  • Creați o instanță WebDriver.
  • Accesați site-ul web folosind driver.get(„https://demo.guru99.com/test/cookie/selenium_aut.php”).
  • Conectați-vă la aplicație.
  • Citiți informațiile despre cookie folosind
    driver.manage().getCookies();
  • Stocați informațiile despre cookie-uri folosind fișierulWriter clasă pentru a scrie fluxuri de caractere și BufferedWriter pentru a scrie textul într-un fișier numit Cookies.data.
  • Fișierul Cookies.data stochează toate informațiile despre cookie-uri, împreună cu numele, valoarea, domeniul și calea. Putem recupera aceste informații și ne putem conecta la aplicație fără a introduce datele de autentificare.

După ce rulați codul de mai sus, fișierul Cookies.data este creat în structura de foldere a proiectului. Deschideți fișierul și puteți vedea datele de autentificare ale AUT-ului salvate în format cookie, așa cum se arată în ecranul evidențiat de mai jos.

Conținutul fișierului Cookies.data care afișează cookie-ul de sesiune salvat în formatul nume-valoare-domeniu-cale

Pasul 2) Utilizarea cookie-urilor stocate pentru a vă autentifica în aplicație

Acum, vom accesa cookie-ul generat la pasul 1 și îl vom folosi pentru a ne autentifica sesiunea în aplicație.

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

Rezultat: Veți fi direcționat direct către ecranul de autentificare reușită fără a introduce numele de utilizator și parola.

NOTĂ: Folosiți reîmprospătarea completă în cazul în care vedeți pagina de conectare după executarea scriptului de mai sus.

⚠️ Java Note: Scriptul cititorului folosește new Boolean(String) și new Date(String), ambele fiind depreciate de JDK cu mult timp în urmă. Pe un JDK modern, echivalentele sunt Boolean.parseBoolean(token.nextToken()) și un parser java.time. Liniile originale sunt păstrate mai sus; tratați nota ca înlocuitor modern, mai degrabă decât ca o editare.

Atributele cookie-urilor și Selenium Clasa de cookie-uri

Cele două scripturi de mai sus mută șase câmpuri într-un fișier și le scot din el. Aceste câmpuri sunt exact ceea ce expune clasa org.openqa.selenium.Cookie, iar cunoașterea lor face ca bucla tokenizer din Pasul 2 să fie mult mai ușor de citit.

Atribut Accesor Ce înseamnă
Nume getName () Cheia pe care o caută serverul, de exemplu JSESSIONID.
Valoare getValue () Datele stocate, de obicei identificatorul sesiunii.
domeniu obțineDomeniu() Gazda căreia browserul îi va trimite cookie-ul înapoi.
Cale obțineCale() URL prefixul la care se aplică cookie-ul.
Expirare obțineExpirare() Data la care cookie-ul este inactiv. O valoare nulă înseamnă un cookie de sesiune.
Asigura esteSecur() Adevărat când cookie-ul este trimis doar prin HTTPS.
Numai Http esteNumaiHttp() Adevărat când JavaScriptul de pe pagină nu poate citi cookie-ul.
SameSite obțineAcelașiSite() Strict, Lax sau Niciunul. Adăugat în Selenium 4.

În loc de constructorul cu șase argumente folosit în Pasul 2, codul curent construiește de obicei un cookie prin intermediul clasei interioare Builder, care vă permite să setați doar câmpurile care vă interesează.

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

driver.manage().addCookie(sessionCookie);

O regulă îi ia în derâdere pe majoritatea oamenilor: un obiect cookie nu poate fi editat după ce a fost creat. Pentru a modifica o valoare, ștergeți cookie-ul vechi și adăugați o copie reconstruită, motiv pentru care Builder este atât de util.

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

Erori frecvente ale cookie-urilor în Selenium WebDriver și cum să le remediați

Codul cookie-urilor tinde să eșueze într-un număr mic de moduri previzibile. Tabelul de mai jos le prezintă pe cele raportate cel mai des, împreună cu cauza și remedierea.

Simptom Provoca Repara
Excepție DomeniuCookie Invalid Funcția addCookie a fost apelată înainte de navigarea pe site, deci browserul este încă activat `about:blank`. Apelați mai întâi driver.get pe domeniul țintă, apoi adăugați cookie-ul.
Excepție imposibilă de setat cookie-uri Domeniul cookie-ului nu corespunde paginii încărcate în prezent. Eliminați câmpul domeniu sau setați-l la gazda exactă a paginii deschise.
Pagina de conectare apare în continuare după adăugarea cookie-ului Pagina a fost redată înainte de existența cookie-ului. Apelați driver.navigate().refresh(), ceea ce NOTA de mai sus înțelege prin reîmprospătare completă.
getCookieNamed returnează nul Numele este scris greșit sau cookie-ul aparține unei alte căi sau unui alt subdomeniu. Ștergeți fiecare cookie cu getCookies și comparați numele.
Cookie-ul stocat este respins la o rulare ulterioară Expirarea a trecut sau serverul a încheiat sesiunea. Regenerați Cookies.data rulând din nou Pasul 1.

Dacă browserul se deschide și se autentifică corect, dar scriptul eșuează ulterior, probabil că nu este vina cookie-ului. gestionarea excepțiilor în Selenium este ruta mai rapidă din acel punct și o rută dedicată Firefox profil este alternativa obișnuită atunci când doriți ca datele de sesiune să supraviețuiască fără un fișier.

Întrebări frecvente

Două opțiuni. Dați clic pe butonul Accept ca pe orice element sau setați cookie-ul de consimțământ al site-ului cu addCookie înainte de reîncărcare, astfel încât bannerul să nu fie afișat niciodată. A doua abordare este mai rapidă și elimină o sursă comună de primi pași instabili.

Python folosește echivalente snake_case chiar pe driver: driver.get_cookies(), driver.get_cookie(name), driver.add_cookie(dict) și driver.delete_all_cookies(). Cookie-urile revin ca dicționare și nu ca obiecte Cookie, așadar valorile sunt citite între paranteze pătrate.

Da. WebDriver comunică cu browserul prin driver, nu prin JavaScript, astfel încât cookie-urile HttpOnly să fie vizibile prin getCookies. Apelați isHttpOnly și isSecure pe obiectul Cookie pentru a inspecta acele semnalizatoare.

Analiza asistată de inteligență artificială grupează rulările eșuate prin semnale partajate și adesea traceșecuri intermitente de deconectare din cauza unui cookie de sesiune expirat sau lipsă. Unele instrumente învață, de asemenea, ce cookie-uri conține o rulare în treacăt și avertizează atunci când o sesiune deviază de la acea valoare de referință.

Copilotul GitHub scrie rapid buclele de citire, scriere și restaurare, dar reproduce frecvent constructorii new Boolean și new Date, care sunt depreciați. Revvizualizați fiecare fragment generat în raport cu curentul Java și Selenium API-uri.

Nu. Un cookie de sesiune este o acreditare activă, așadar un fișier Cookies.data validat permite oricui are acces la repozitoriu să se comporte ca acel cont. Păstrați fișierul în afara controlului versiunilor și regenerați-l în funcție de mediu.

Nu în mod implicit. Fiecare sesiune începe cu un profil de browser curat, motiv pentru care cookie-ul este scris pe disc și redat. Atașarea unui profil de browser salvat este o altă modalitate de a menține o sesiune activă pe parcursul rulărilor.

Cookie-urile de sesiune au o marcă temporală de expirare, iar serverul tracks își definește propria durată de viață a sesiunii. Odată ce oricare dintre acestea expiră, cookie-ul redat este respins și pagina de conectare revine, așadar regenerați cookie-ul stocat în loc să reutilizați un fișier vechi.

Rezumați această postare cu: