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 43. Zadanie: ramki

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.

Polecenie do zadania

Ukryta treść

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

Kod

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 dostępu do wsparcia merytorycznego dla tego kursu. Wykup dostęp albo zaloguj się, by móc zadawać pytania.

  1. 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");

    }

    Odpowiedz
      • ...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?

        Odpowiedz
  2. 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.

    Odpowiedz
  3. 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

    Odpowiedz