Hur man hanterar cookies i Selenium webbdrivrutin
⚡ Smart sammanfattning
Cookies lagrar användarinställningar och sessionsidentifierare som nyckel-värdepar, och Selenium WebDriver kan läsa, spara och spela upp dem igen så ett automatiserat test hoppar över inloggningsskärmen vid varje efterföljande körning.
En HTTP-cookie består av information om användaren och deras preferenser. Den lagrar information med hjälp av ett nyckel-värde-par. Det är en liten databit som skickas från en webbapplikation och lagras i webbläsaren medan användaren surfar på webbplatsen.
Om du är nybörjare inom ämnet, börja med den här guiden cookie testning.
Selenium Frågekommandon för cookies
In Selenium Med WebDriver kan vi fråga efter och interagera med cookies med hjälp av de inbyggda metoderna nedan. Var och en av dem nås via driver.manage(), som returnerar Options-gränssnittet.
| Selenium Fråga kommandon | Produktion |
|---|---|
| drivrutin.hantera().getCookies(); | Returnerar listan över alla cookies |
| driver.manage().getCookieNamed(arg0); | Returnerar en specifik cookie enligt namn |
| drivrutin.hantera().addCookie(arg0); | Skapar och lägger till cookien |
| driver.manage().deleteCookie(arg0); | Tar bort en specifik cookie |
| driver.manage().deleteCookieNamed(arg0); | Tar bort en specifik cookie enligt namn |
| driver.manage().deleteAllCookies(); | Tar bort alla cookies |
Varför hantera (acceptera) cookies i Selenium?
Varje cookie är associerad med ett namn, värde, domän, sökväg, utgångsdatum och status för om den är säker eller inte. För att validera en klient analyserar en server alla dessa värden i en cookie.
När testning en webbapplikation som använder Selenium WebDriver kan du behöva skapa, uppdatera eller ta bort en cookie.
Till exempel när man automatiserar en webbutikping applikationen kan du behöva automatisera testscenarier som att lägga en beställning, visa varukorg, betalningsinformation, orderbekräftelse och så vidare.
Om cookies inte lagras måste du utföra inloggningsåtgärden varje gång innan du kör testscenarierna som anges ovan. Detta kommer att öka din kodningsinsats och körningstid.
Lösningen är att lagra cookies i en fil. Later, hämta värdena för cookien från den här filen och lägg till dem i din nuvarande webbläsarsession. Som ett resultat kan du hoppa över inloggningsstegen i varje testfall eftersom din förarsession har den här informationen.
Applikationsservern behandlar nu din webbläsarsession som autentiserad och tar dig direkt till din begärda URL.
Hur man hanterar cookies i Selenium
Vi kommer använda https://demo.guru99.com/test/cookie/selenium_aut.php för vårt demosyfte.
Detta kommer att vara en process i två steg.
Steg 1) Logga in i applikationen och lagra den genererade autentiseringscookien.
Demoapplikationen presenterar det enkla inloggningsformuläret som visas nedan.
Steg 2) Använd den lagrade cookien för att logga in i applikationen igen utan att använda ett användar-ID och lösenord.
Steg 1) Lagring av cookieinformation
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(); } } }
⚠️ Versionsinformation: Raden System.setProperty behålls exakt som den ursprungliga handledningen skrev den. Från Selenium 4.6 och framåt, Selenium Manager laddar ner och konfigurerar den matchande Chrome-drivrutinen automatiskt, så att den raden inte längre behövs i en aktuell installation. Den ursprungliga koden lämnas orörd nedan och kompileras fortfarande.
Code Förklaring
- Skapa en WebDriver-instans.
- Besök webbplatsen med hjälp av driver.get(“https://demo.guru99.com/test/cookie/selenium_aut.php”).
- Logga in i applikationen.
- Läs cookieinformationen med hjälp av
driver.manage().getCookies();
- Lagra cookieinformationen med hjälp av filenWriter klass för att skriva teckenströmmar, och BufferedWriter för att skriva texten i en fil med namnet Cookies.data.
- Filen Cookies.data lagrar all cookieinformation tillsammans med namn, värde, domän och sökväg. Vi kan hämta denna information och logga in i applikationen utan att ange inloggningsuppgifterna.
När du kör koden ovan skapas filen Cookies.data i projektets mappstruktur. Öppna filen så ser du inloggningsuppgifterna för AUT:en sparade i cookieformat, som visas på den markerade skärmen nedan.
Steg 2) Använda lagrad cookie för att logga in i applikationen
Nu kommer vi att komma åt cookien som genererades i steg 1 och använda den för att autentisera vår session i applikationen.
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"); } }
Utdata: Du kommer direkt till skärmen för lyckad inloggning utan att ange användar-ID och lösenord.
OBS: Använd hård uppdatering om du ser inloggningssidan efter att ha kört ovanstående skript.
⚠️ Java anteckningar: Lässkriptet använder new Boolean(String) och new Date(String), vilka båda föråldrades av JDK för länge sedan. På en modern JDK är motsvarigheterna Boolean.parseBoolean(token.nextToken()) och en java.time-parser. De ursprungliga raderna bevaras ovan; behandla anteckningen som den moderna ersättningen snarare än en redigering.
Cookieattribut och Selenium Kakklass
De två skripten ovan flyttar sex fält in och ut ur en fil. Det är precis dessa fält som klassen org.openqa.selenium.Cookie exponerar, och att känna till dem gör tokenizer-loopen i steg 2 mycket lättare att läsa.
| Attribut | Åtkomst | Vad det betyder |
|---|---|---|
| Namn | hämta namn () | Nyckeln som servern söker upp, till exempel JSESSIONID. |
| Värderar | getValue () | Lagrad data, vanligtvis sessionsidentifieraren. |
| Domän | getDomain() | Den värd som webbläsaren skickar cookien tillbaka till. |
| Bana | getPath() | Ocuco-landskapet URL prefixet som cookien gäller för. |
| Upphörande | getExpiry() | Datumet då cookien upphör. Ett nullvärde betyder en sessionscookie. |
| Säkra | ärSäker() | Sant när cookien endast skickas via HTTPS. |
| Httponly | ärEndastHttp() | Sant när JavaSkriptet på sidan kan inte läsa cookien. |
| SameSite | hämtaSammaSida() | Strikt, Lax eller Ingen. Tillagd i Selenium 4. |
Istället för konstruktorn med sex argument som användes i steg 2, bygger nuvarande kod vanligtvis en cookie genom den inre Builder-klassen, vilket låter dig bara ange de fält du är intresserad av.
Cookie sessionCookie = new Cookie.Builder("JSESSIONID", "A1B2C3D4") .domain("demo.guru99.com") .path("/") .isSecure(true) .isHttpOnly(true) .build(); driver.manage().addCookie(sessionCookie);
En regel som fångar de flesta: ett cookie-objekt kan inte redigeras efter att det har skapats. För att ändra ett värde tar du bort den gamla cookien och lägger till en ombyggd kopia, vilket är anledningen till att Builder är så användbar.
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);
Vanliga cookiefel i Selenium WebDriver och hur man åtgärdar dem
Cookiekod tenderar att misslyckas på ett litet antal förutsägbara sätt. Tabellen nedan listar de som rapporteras oftast, tillsammans med orsaken och åtgärden.
| Symptom | Orsak | Fast |
|---|---|---|
| Ogiltigt cookiedomänundantag | addCookie anropades innan webbplatsen navigerades, så webbläsaren är fortfarande på about:blank. | Anropa driver.get på måldomänen först och lägg sedan till cookien. |
| Kan inte ställa in cookieundantag | Cookie-domänen matchar inte sidan som för närvarande är inläst. | Ta bort domänfältet eller ange det till den exakta värden för den öppna sidan. |
| Inloggningssidan visas fortfarande efter att cookien har lagts till | Sidan renderades innan cookien fanns. | Anropa driver.navigate().refresh(), vilket är vad OBS! ovan menar med en hård uppdatering. |
| getCookieNamed returnerar null | Namnet är felstavat, eller så tillhör cookien en annan sökväg eller underdomän. | Dumpa varje cookie med getCookies och jämför namnen. |
| Den lagrade cookien avvisas vid en senare körning | Utgångsdatumet har passerat eller så avslutade servern sessionen. | Återskapa Cookies.data genom att köra steg 1 igen. |
Om webbläsaren öppnas och autentiseras korrekt men skriptet misslyckas efteråt, är det förmodligen inte cookien som är felet. undantagshantering i Selenium är den snabbaste vägen från den punkten, och en dedikerad Firefox profil är det vanliga alternativet när du vill att sessionsdata ska överleva utan en fil alls.


