Zapisy otwarte! Dołącz do kursu Selenium w Javie lub Selenium w C#. Tylko do 23.09.2021 do godz. 21:00. Zapisz się tutaj.

Selenium 5. Zadanie: zamykanie przeglądarki i sesji

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 dostępu do wsparcia merytorycznego dla tego kursu. 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ę:
    assertEquals(tittle2, driver.getTitle(), "Niepoprawna strona");
    (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:
    assertEquals(tittle2, driver.getTitle());
    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
  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:

            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);
    Odpowiedz
  4. Hej
    Szukałam odpowiedzi, ale nie mogę znaleźć i utknęłam. Potrzebuję pomocy.

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

    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
      • 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
      • 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
  5. Cześć,
    wydaje mi się, że kod jest poprawnie napisany, ale dostaję błąd:

    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
    

    Kod:

    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);
    
        };
    
    }
    
    Odpowiedz
    • Hej!
      Też miałem błędy typu "exit code -1" oraz 0 czy -2 i okazało się, że trzeba było dopisać "https://" w stringach z linkami 🙂
      Pół dnia się z tym męczyłem, zdążyłem zaktualizować IDE trzykrotnie i nic nie pomogło 😀

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