Selenium 8. Ciasteczka

W tej lekcji pokażę Ci jak można wykonywać akcje na ciasteczkach w Selenium.

Nieobliczalne zachowanie ciasteczek na Amazonie 🤯

Ciasteczka na Amazonie zachowują się teraz trochę inaczej w stosunku do tego, co pokazuję w filmie. Na samym dole tej lekcji zobaczysz wyjaśnienie wraz z kodem testów jak to teraz powinno wyglądać.

Kalendarz i wyświetlanie daty w narzędziach developerskich

W tej lekcji będziemy tworzyć ciasteczka, których datę wygaśnięcia ustawimy za pomocą obiektu klasy GregorianCalendar. Gdy tworzymy obiekt tej klasy tak jak na filmie dostajemy nasze lokalne ustawienia czasu. W narzędziach deweloperskich natomiast wyświetla się czas w GMT dlatego będzie tam godzina różnicy względem tego, co przekażemy. Dodatkowo, o czym nie mówię na filmie, miesiące są numerowane od 0, czyli Styczeń to 0, a nie 1. My używamy 11 czyli chodzi o grudzień. Jeżeli wolisz wygodniejszą i bardziej słownomuzyczną formę możesz też taki obiekt stworzyć jak poniżej:
new GregorianCalendar(2021, Calendar.DECEMBER, 31)

Ciasteczka to informacje, które serwis internetowy wysyła do przeglądarki. Są one zapisywane na urządzeniu końcowym, czyli np. Twoim komputerze. Mają formę ciągu znaków. Używane są na przykład do zapamiętania Twoich preferencji wyświetlania informacji na podanej stronie. Ciasteczka używa się też na przykład do utrzymywania sesji. W testach możemy np. chcieć sprawdzić właśnie kiedy wygasa ciasteczko sesyjne.

Selenium dostarcza metody umożliwiające:

  • pobranie ciasteczka lub ciasteczek,
  • dodanie ciasteczka,
  • usunięcie wszystkich lub wybranego ciasteczka.

Opis metod, o których mówię, znajdziesz także w dokumentacji Selenium pod tym linkiem: WebDriver.Options.

Kod

Podrzucam też zaktualizowany kod testów, które pokazuję na filmie. Ciasteczka na Amazonie zaczęły zachowywać się w trochę nieoczywisty sposób, a ich ilość już na samym początku nie jest stała (i nie jest to kwestia poczekania na nie przez jakiś czas aż się wszystkie doładują). W poniższym kodzie zostały użyte inne asercje i w ogóle są one dużo lepsze biorąc pod uwagę czy sprawdzamy, bo czy naprawdę obchodzi nas ile jest ciasteczek, po dodaniu naszego dodatkowego? Raczej będzie nas obchodzić, czy takie ciasteczko jest na liście ciasteczek.

W poniższych testach używam też asercji assertNull oraz assertNotNull, które jak sama nazwa wskazuje sprawdzają czy to, co podamy w parametrze jest lub nie jest nullem. Jest nam to potrzebne do sprawdzenia czy ciasteczko się usunęło albo dodało, bo metoda getCookieNamed zwraca nam null, gdy nie znajdzie ciasteczka o podanej przez nas nazwie.

Dodatkowo zmieniłam też datę w jednym z ciasteczek, które tworzymy w teście, ponieważ z datą wsteczną się nie doda.

Ukryta treść

Nie masz dostępu do tego kursu. Wykup dostęp albo zaloguj się, by móc zobaczyć pełną lekcję.

Wsparcie merytoryczne

Nie masz aktywnego członkostwa. Wykup dostęp albo Zaloguj się, by móc zadawać pytania.

  1. Jaki może być powód tego, że cookies mi się nie usuwają? getCookies, getCookieNamed przechodzą mi na zielono, ale delete nie działa - asercja wyrzuca mi ustawiony w niej komunikat. Dodatkowo po każdym teście zwiększa mi się liczba cookies w actual. DeleteAll zadziałało.

    Odpowiedz
      • Dziękuję za odpowiedź!!!! Bo wczoraj przeżyłam małe załamanie nerwowe :))) Ciastka zachowywały się dokładnie tak jak piszesz: raz było 10 potem 11. A, że jestem bardzo początkująca w temacie to niezbyt wiedziałam jak to ugryźć. Jeszcze raz wielki dzięki!!!!
        Kurs jest świetny :)!

        Odpowiedz
  2. to jeszcze mam jedno pytanie: jak użyłam nowego kodu (używam testNG to musiałam detale pozmieniać) to test mi poszedł na zielono dopiero jak zamiast public class Manage zmieniłam na class Manage - za podpowiedzią intelliJ'a. Czy to jakas specyfika testnG? Masz pomysł czemu tak?

    Odpowiedz
  3. Hej, gdy dodajemy newCookie, expiry jest różne między tym co zadeklarowaliśmy w obiekcie newCookie, a nowo dodanym cookie w devtoolsach. W devtoolsach pokazuje miesiąc do przodu i dzień do tyłu. Dlaczego tak jest?

    Odpowiedz
      • Na twoim filmiku też tak jest w 21 min 23sek w expires (devtoolsy) jest data 2019-12-30. W newCookie masz m.in w konstruktorze new GregorianCalendar(2019,11,31).getTime() .
        https://snipboard.io/bCjL2m.jpg

        Odpowiedz
          • Dzięki za wyjaśnienie! 😉 Z tym dniem już się trochę domyślałam, bo coś tam przyobserwowałam w zmiennych w debuggerze. Ale dzięki za dobre wyjaśnienie obu rzeczy, teraz już zapamiętam :-). Pozdrawiam

  4. Cześć potrzebuję umieścić ciasteczko, które wyłącza captche na stronie, ale samo dodanie go jako ciasteczka i odswieżenie nic nie daje - capcha dalej wisi 🙁
    Jedyne co pomaga, to wstrzyknięcie kodu "document.cookie = "remove_captcha=en4bl22; expires=Tue, 22 Oct 2022 22:22:22 GMT; path=/" w samej konsoli przeglądarki i zatwierdzenie Enterem, wtedy dostaje komunikat, że capcha została wyłaczona i jednocześnie automatycznie wskakuje też ciasteczko.
    Czy jest na to jakiś w miarę nieskomplikowany sposób?

    Odpowiedz
  5. Hej Ela 🙂 przy próbie uruchomienia metody addCookies dostaję taki komunikat:

    "java: constructor Cookie in class DriverMethods.Cookie cannot be applied to given types;
    required: no arguments
    found: java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.util.Date,boolean,boolean
    reason: actual and formal argument lists differ in length"

    Poniżej kod. Co robie nie tak ?

    package DriverMethods;
    
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.openqa.selenium.Dimension;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    import java.util.GregorianCalendar;
    import java.util.Set;
    
    public class Cookie {
        WebDriver driver;
        @BeforeEach
        public void driverSetup(){
            System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().setSize(new Dimension(1290, 730));
            driver.navigate().to("https://amazon.com");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Assertions.assertEquals(8, driver.manage().getCookies().size(), "The number of cookies is not what expected.");
        }
    
        @AfterEach
        public void driverQuit(){
            driver.close();
            driver.quit();
    
        }
        @Test
        public void gettingCookie() {
            Set cookies = driver.manage().getCookies();
            org.openqa.selenium.Cookie cookieSessionId = driver.manage().getCookieNamed("session-id");
            driver.manage().deleteCookieNamed("session-id");
            Assertions.assertEquals(7, driver.manage().getCookies().size(), "The number of cookies is not what expected.");
            driver.manage().deleteAllCookies();
            Assertions.assertEquals(0, driver.manage().getCookies().size(), "Number of cookies is not what expected.");
        }
    
        @Test
        public void addCookies(){
            Cookie newCookie = new Cookie("test_cookie", "test_value", ".amazon.com", "/", new GregorianCalendar(2021,11,31).getTime(), true, true);
            driver.manage().addCookie(newCookie);
            Assertions.assertNotNull(driver.manage().getCookieNamed("test_cookie"), "Cookie doesn't exist.");
        }
    }
    Odpowiedz