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.
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.
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.
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.


