Selenium 5. Zadanie: zamykanie przeglądarki i sesji

Interesuje Cię ten kurs?

Dołącz do listy mailingowej, a poinformuję Cię o otwarciu zapisów.

Czas na zadanie z zamykania sesji i przeglądarki. Będziesz mieć okazję poćwiczyć to, co przerobiliśmy wspólnie w kilku ostatnich filmach.

Na początku filmu tłumaczę polecenie, a następnie rozwiązanie. Będzie moment żeby zatrzymać film na czas wykonania zadania – dam znać w filmie kiedy.

Polecenie do zadania

Napisz test, który wykona następujące kroki:

  1. Otworzy stronę główną Wikipedii.
  2. Następnie otworzy stronę główną Nasa.
  3. Cofnie się do strony Wikipedii (używając nawigacji wstecz).
  4. Potwierdź, że driver jest na stronie Wikipedii: porównaj (Assertions.assertEquals()) tytuł strony z oczekiwanym.
  5. Przejdź do strony Nasa (używając nawigacji naprzód).
  6. Potwierdź, że driver jest na stronie Nasa: porównaj tytuł strony z oczekiwanym.
  7. Zamknij okno przeglądarki.
  8. Zamknij sesję.

Pamiętaj o inicjalizacji WebDrivera i podaniu ścieżki do ChromeDrivera.

Rozwiązanie

Lepiej nie podglądać przed rozwiązaniem zadania ⚠️

package Zadania;
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;
public class Zadanie1 {
    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(1280, 720));
    }
    @AfterEach
    public void closeAndQuit() {
        //7. Zamknij okno przeglądarki.
        driver.close();
        //8. Zamknij sesję.
        driver.quit();
    }
    @Test
    public void navigationTest() {
        //1. Otworzy stronę główną Wikipedii.
        driver.get("http://wikipedia.pl");
        //2. Następnie otworzy stronę główną Nasa.
        driver.navigate().to("https://nasa.gov");
        //3. Cofnie się do strony Wikipedii (używając nawigacji wstecz).
        driver.navigate().back();
        //4. Potwierdź, że driver jest na stronie Wikipedii: porównaj (Assertions.assertEquals()) tytuł strony z oczekiwanym.
        String wikiTitle = "Wikipedia, wolna encyklopedia";
        Assertions.assertEquals(wikiTitle, driver.getTitle(), "The title of the page is not: " + wikiTitle);
        //5. Przejdź do strony Nasa (używając nawigacji naprzód).
        driver.navigate().forward();
        //6. Potwierdź, że driver jest na stronie Nasa: porównaj tytuł strony z oczekiwanym.
        String nasaTitle = "NASA";
        Assertions.assertEquals(nasaTitle, driver.getTitle(), "The title of the page is not: " + nasaTitle);
    }
}

Wsparcie merytoryczne

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

  1. Cześć, ogólnie zadanie udało mi się zrobić, jednak nie mogę dodać message przy asercji.

    Piszę taką linijkę:
    [java]assertEquals(tittle2, driver.getTitle(), “Niepoprawna strona”);[/java]
    (oczywiście po drugim przecinku w kompilatorze widzę jeszcze “message”)
    Wtedy przy kompilacji dostaję error:
    Error:(51, 9) java: cannot access java.util.function.Supplier
    class file for java.util.function.Supplier not found

    W momencie pisania:
    [java] assertEquals(tittle2, driver.getTitle());[/java]
    wszystko działa

    Co powinienem importować, żeby zadziałało? Niestety na lekcjach nie pokazujesz wszystkich linijek, przez co trudno jest mi znaleźć błąd.

    Edit: pozwolę sobie odpowiedzieć, ponieważ doszedłem do sedna: problemem był rozjazd wersji Javy w ustawieniach InteliJ
    Files > Settings > Build,Execution, Deployment > Compiiler > Java Compiler

    Odpowiedz
  2. Nie polecam mieszać .get i .navigate().back() chwilę mi zajęło rozkminienie czemu test nie przechodzi z taką konfiguracją, ale po ustawieniu timeouts już tak 😀

    @Test
    public void getMethod(){
    driver.get(“https://pl.wikipedia.org/wiki/Wikipedia:Strona_g%C5%82%C3%B3wna”);
    driver.get(“https://www.nasa.gov/”);
    driver.navigate().back();

    Odpowiedz
      • driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); dodany do @BeforeEach pomógł. Zamiana driver.get() na driver.naviagate().to() też pomogło i to bez timeout.

        Po prostu test nie przechodził aseracji:
        Assertions.assertEquals(“Wikipedia, wolna encyklopedia”, driver.getTitle());
        IntelliJ nie wykonywał do końca tej linijki driver.navigate().back(); a już przechodził do porównania, co w sumie jest dziwne, bo powinien zaczekać aż się strona wczyta

        Odpowiedz
        • Powinien, ale może z jakiegoś powodu uznał, że się wczytała O.o Najbardziej zastanawia mnie ta różnica pomiędzy get() a navigate().to(), bo one obie robią to samo pod spodem (navigate().to() wywołuje get()). No nic no, dobrze, że Ci zadziałało ;D

          Odpowiedz
  3. Chwilę się męczyłem bo chciałem porównać URL-a zamiast Title 😀 Mimo, ze były identyczne to błąd się wywalał i czytałem, że URL-e są dynamiczne zatem nie można do nich stosować assertEquals. Trzeba raczej użyć assertTrue ale w sumie można to zrobić tylko trzeba się pomęczyć trochę bardziej:
    [java] driver.navigate().to(baseUrl);
    String currentUrl = driver.getCurrentUrl();
    driver.navigate().to(new URL(“https://www.nasa.gov/”));
    driver.navigate().back();
    Assert.assertEquals(String.valueOf(driver.getCurrentUrl()), currentUrl);[/java]

    Odpowiedz
  4. Hej
    Szukałam odpowiedzi, ale nie mogę znaleźć i utknęłam. Potrzebuję pomocy.

    [java]
    package DriverMethods;
    import org.junit.Test;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.openqa.selenium.Dimension;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import java.util.concurrent.TimeUnit;

    public class newNavigation {

    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(1200, 720));
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    }
    @AfterEach
    public void driverQuit() {
    driver.close();
    driver.quit();
    }
    @Test
    public void getMethod() {
    driver.get(“https://www.nasa.gov/”);
    }
    @Test
    public void navigate() {
    driver.navigate().to(“https://www.nasa.gov/”);
    driver.navigate().to(“https://pl.wikipedia.org/wiki/Wikipedia:Strona_g%C5%82%C3%B3wna”);
    driver.navigate().back();
    driver.navigate().forward();
    driver.navigate().refresh();
    driver.getCurrentUrl();
    }
    }
    [/java]

    Cały czas dostają taką oto odpowiedź:
    java.lang.NullPointerException
    at DriverMethods.newNavigation.getMethod(newNavigation.java:33)

    Próbowałam różnych rzeczy, ale nie wiem jak to rozwiązać.

    Będę wdzięczna za pomoc 🙂

    Odpowiedz
    • Halko! Jak wpakowałam Twoje testy u siebie to mi żaden błąd nie leci. Dodatkowo wrzuciłam rozwiązanie do zadania, żeby można sobie było porównać. Widzę tylko jedną różnicę. Ja mam taki import:
      [xml]import org.junit.jupiter.api.Test;[/xml]
      a Ty taki:
      [xml]import org.junit.Test;[/xml]
      Trochę jakbyś jakąś starszą wersję JUnita tutaj użyła, myślę że o to może chodzić, miałoby to sens. Zamień to na to co ja mam i zobacz czy zahula.

      Odpowiedz
      • Cześć,

        mam bardzo podobny problem, natomiast trochę inne objawy, gry próbuje zastosować metodykę BeforeEach i AfterEach test się nie wykonuje i wyrzuca błąd java.lang.NullPointerException

        Natomiast gdy wykorzystam po prostu Before i After test zaliczony
        mam takie same sterowniki jesli chodzi o junita i sellenium.

        package Zadanie1;

        import org.junit.After;
        import org.junit.Before;
        import org.junit.Test;
        import org.junit.jupiter.api.AfterEach;
        import org.junit.jupiter.api.Assertions;
        import org.junit.jupiter.api.BeforeEach;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.chrome.ChromeDriver;

        import java.util.concurrent.TimeUnit;

        public class TestNavigate1 {

        WebDriver driver;

        @BeforeEach
        public void driverSetup() {
        System.setProperty(“webdriver.chrome.driver”, “src/main/resources/drivers/chromedriver.exe”);
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        }

        @AfterEach
        public void driverClose() {
        driver.close();
        driver.quit();

        }

        @Test
        public void openWikipedia() {
        driver.get(“https://pl.wikipedia.org/”);
        driver.navigate().to(“https://nasa.gov”);
        driver.navigate().back();
        String wikiTitle = “Wikipedia, wolna encyklopedia”;
        Assertions.assertEquals(wikiTitle, driver.getTitle(), “The title of the page is not: ” + wikiTitle);
        driver.navigate().forward();
        String nasaTitle = “NASA”;
        Assertions.assertEquals(nasaTitle, driver.getTitle(), “The title of the page is not: ” + nasaTitle);

        }

        }

        Odpowiedz
        • Halko! Problem podobny i jego przyczyna również. Adnotacje Before i After są w JUnit 4, natomiast w kursie używamy JUnit 5, tam jest BeforeEach i AfterEach. Po samych importach widać, że używasz także 4 i pewnie Ci się gryzą. Pozamieniaj Before i After na BeforeEach i AfterEach. Potem wyrzuć z importów to:
          [java]
          import org.junit.After;
          import org.junit.Before;
          import org.junit.Test;
          [/java]

          Sprawdź sobie jeszcze pom.xml i stamtąd też wyrzuć JUnit4.

          Odpowiedz
      • Hej,
        Miałam dokładnie ten sam problem. Zmiana importu na Twój pomogła 🙂
        Jak zrobić porządek w pom’ie? Wydaje mi się, że mam tam teraz JUNIT dwa razy.

        org.junit.jupiter
        junit-jupiter-api
        5.7.0
        test

        junit
        junit
        RELEASE
        test

        Odpowiedz
        • Halko! Akurat o czymś podobnym pisałam w newsletterze w tym tygodniu 😀 (mailu który wysyłam do ludzi, którzy są na liście mailingowej). To drugie trzeba wyrzucić, czyli junit. Junit odnosi się do starego junita, a jupiter do nowego, któego używamy w kursie.

          Odpowiedz
  5. Cześć,
    wydaje mi się, że kod jest poprawnie napisany, ale dostaję błąd:
    [java]
    lut 17, 2021 5:18:44 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
    WARNING: TestEngine with ID ‘junit-jupiter’ failed to discover tests
    java.lang.NoClassDefFoundError: org/junit/jupiter/api/parallel/ExecutionMode
    at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:66)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:130)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:117)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
    Caused by: java.lang.ClassNotFoundException: org.junit.jupiter.api.parallel.ExecutionMode
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    … 8 more

    Process finished with exit code 0
    [/java]

    Kod:
    [java]
    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.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;

    public class Zadanie {
    WebDriver driver;

    @BeforeEach
    public void setupDriver(){
    System.setProperty(“webdriver.chrome.driver”, “src/main/resources/chromedriver.exe”);
    driver = new ChromeDriver();
    }

    @AfterEach
    public void closeSession(){
    driver.close();
    driver.quit();

    }

    @Test
    public void navigation(){
    driver.navigate().to(“www.wikipedia.pl”);
    driver.get(“www.nasa.gov”);
    driver.navigate().back();
    String wikiTitle = “Wikipedia, wolna encyklopedia”;
    Assertions.assertEquals(wikiTitle, driver.getTitle(), “The title of the page is not:” + wikiTitle);
    driver.navigate().forward();
    String nasaTitle = “NASA”;
    Assertions.assertEquals(nasaTitle, driver.getTitle(), “The title of the page is not:” + nasaTitle);

    };

    }
    [/java]

    Odpowiedz
  6. Hello,
    Elu szybkie pytanie bo obecnie zmuszony jestem pracować na służbowym lapku 😉 i każde otwarcie chroma powoduje najpierw otwarcie SSO password login page :/ czy mogę to jakoś ominąć timeOut() albo jakimś wait() wtedy bym się logował i startuje wiki ? bo szukanie po webElement i logowanie za każdym razem to trochę za wcześnie.

    Odpowiedz
    • Hej! Nie wiem w jakiej formie dostajesz to SSO ale jeżeli to alerty, to trzeba obsłużyć jak alerty. Jeżeli to nie alerty, to na potrzeby testów nie pozostaje Ci nic innego jak korzystać z innej maszyny albo poprosić o zdjęcie tego zabezpieczenia.

      Odpowiedz
      • No niestety nie alerty :/ Ale ominąłem to inaczej. Używam stron w domenie .gov wtedy niewymagane jest logowanie tylko od razu odpala stronkę typu nasa.gov i na niej śmigam testy 🙂

        Niemniej dziękuję za odpowiedź i podpowiedź. Miłego weekendu

        Odpowiedz