Czas przećwiczyć to, co przerobiliśmy wspólnie na ostatnim filmie, czyli wyszukiwanie w elementów w ramkach. Przed Tobą zadanie, w którym konieczne będzie przełączanie się do różnych ramek (obiektów o tagu iframe) i zaznaczanie w nich elementów.
logoDiplayedTest()
W poniższym poleceniu ostatnie zadanie może Ci nie zadziałać od kopa w taki sposób, w jaki pokazuję. Zależy to od tego jak szybko będą Ci się ładowały elementy w ramce. Może się okazać, że nie wszystko zdąży się załadować zanim spróbujesz wykonać tam jakąś akcję albo namierzyć element. Żeby zadziałało możesz zrobić jedną z dwóch rzeczy.
Rekomendowanym przeze mnie na tym etapie rozwiązaniem będzie ustawienie sleepa przed wyszukaniem loga, np.
try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
Drugą możliwością jest użycie innej asercji (assertDoesNotThrow) i użycie waita, by poczekać aż logo będzie widoczne.
Assertions.assertDoesNotThrow(() -> wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("img.custom-logo"))), "Logo is not displayed.");
Żeby zrozumieć co się dzieje w tym drugim sposobie musisz przerobić lekcje z sekcji „Czekanie i pobieranie informacji”. Dlatego na teraz polecam jednak pierwszy sposób.
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.
Cześć,
Mam problem z działaniem ostatniego testu: logoDisplayedTest. W moim przypadku asercja kończy się niepowodzeniem.
Czy w poniższym kodzie robię jakiś błąd?
Jeżeli to możliwe poprosiłbym również o wyjaśnienie kwestii, która jest dla mnie niezrozumiała: gdy przełączmy się do ramki o największym zagłębieniu, to mamy kliknąć w button "Strona główna", ten button kieruje do adresu: https://fakestore.testelka.pl/ , gdzie nie ma żadnych ramek. Także skoro w driverze mamy stronę bez ramek to jak mają działać funkcja switchTo().parentFrame() ? . Czy strona na której jesteśmy a ustawiony w driverze kontekst ramki są niezależne?
Dołączam mój kod:
@Test
public void logoDisplayTest() {
driver.switchTo().frame("main-frame")
.switchTo().frame("image")
.switchTo().frame(0);
WebElement mainPageButton = driver.findElement(By.cssSelector("a.button"));
mainPageButton.click();
driver.switchTo().parentFrame()
.switchTo().parentFrame();
WebElement climbingButton = driver.findElement(By.cssSelector("a[name='climbing']"));
climbingButton.click();
WebElement logo = driver.findElement(By.cssSelector("img.custom-logo"));
Assertions.assertTrue(logo.isDisplayed(), "Logo is not displayed");
}
Tak żem czuła, że to się może w końcu zdarzy [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
...Czy jeżeli powyższy problem rozwiązałem zwykłym wait.until po kliknieciu i zmianie ramki:
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div img[alt='FakeStore']")));
To bardzo amatorsko to zrobiłem, czy ujdzie w tłumie? 😀
Bo trochę nie rozumiem po co nam metoda waitForLogoDisplayed()
wait.until w tej metodzie i tak nam powinien poczekać tyle ile powinien (do maksymalnej wartości czasu ustalonej wcześniej) - więc po co nam próbowanie dwa razy skoro nie powinien w tej metodzie tak czy inaczej złapać błędu?
Co do pierwszej części pytania - jest tutaj jede [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
Również dzięki!
Dziękuję za wyczerpujące wyjaśnienie 🙂
Hej, czy mógłby ktoś wrzucić tutaj cały, poprawny kod do testu logoDisplayedTest()? Szczerze mówiąc pogubiłam się w powyższych komentarzach a chciałabym mieć ten test napisany poprawnie.
Halko! Do polecenia dodałam kod i komentarz, bo m [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.
Hej,
Mam problem z każdym testem ( możliwe że mam coś źle skonfigurowane) za każdym razem dostaje
Connected to the target VM, address: '127.0.0.1:62989', transport: 'socket'
java.lang.NullPointerException
at OldTests.Zadanie1.mainPageButtonDisabledTest(Zadanie1.java:34)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Disconnected from the target VM, address: '127.0.0.1:62989', transport: 'socket'
Process finished with exit code -1
Cześć Krzysztof! Masz NullPointerException, to o [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.