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:
- Otworzy stronę główną Wikipedii.
- Następnie otworzy stronę główną Nasa.
- Cofnie się do strony Wikipedii (używając nawigacji wstecz).
- Potwierdź, że driver jest na stronie Wikipedii: porównaj (Assertions.assertEquals()) tytuł strony z oczekiwanym.
- Przejdź do strony Nasa (używając nawigacji naprzód).
- Potwierdź, że driver jest na stronie Nasa: porównaj tytuł strony z oczekiwanym.
- Zamknij okno przeglądarki.
- 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); } }
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
Dzięki za informację (o tym, że się udało i gdzie zmieniłeś)! Zostawię ten komentarz tutaj, żeby też inni widzieli jakby u nich się coś takiego pojawiło 😉
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();
O, ciekawe, sprawdziłam jeszcze raz i u mnie nadal działa :O A jaki timeout ustawiłaś i jaki błąd wcześniej leciał?
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
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
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]
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 🙂
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.
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);
}
}
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.
Dziękuję ! Udało się 😀
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
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.
dzięki, działa 🙂
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]
Halko! Pokaż co masz w pliku pom.xml
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 😀
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.
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.
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