• Przejdź do głównej nawigacji
  • Przejdź do treści
  • Przejdź do głównego paska bocznego
  • Przejdź do stopki
Testelka.pl

Testelka.pl

Testelka.pl - o technologiach w testowaniu oprogramowania

  • Kursy
    • DARMOWY: Java dla testerów
    • Selenium w Javie
    • Selenium w C#
    • Testy API w REST Assured
    • Selektory CSS
    • XPath
  • Materiały na raz
  • Blog
  • O Eli
  • Zaloguj się
  • DOŁĄCZ

Selenium 43. Zadanie: ramki

Strona główna > Kursy > Kurs Selenium w Javie > 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 aktywnej subskrypcji. Wykup subskrypcję albo zaloguj się, by móc zobaczyć pełną lekcję.

Kod

Ukryta treść

Nie masz aktywnej subskrypcji. Wykup subskrypcję albo zaloguj się, by móc zobaczyć pełną lekcję.

Reader Interactions

Komentarze

Nie masz aktywnej subskrypcji. Wykup subskrypcję albo zaloguj się, by móc komentować.

Komentarze

  1. Adam Zaorski napisał

    24 listopada, 2019 o 9:53 pm

    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
    • Ela Sądel napisał

      25 listopada, 2019 o 10:04 am

      Tak żem czuła, że to się może w końcu zdarzy [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
      • Mateusz Cesarz napisał

        17 grudnia, 2019 o 10:41 am

        ...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
        • Elżbieta Sądel napisał

          17 grudnia, 2019 o 2:03 pm

          Co do pierwszej części pytania - jest tutaj jede [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

          Odpowiedz
      • Mateusz Cesarz napisał

        17 grudnia, 2019 o 2:21 pm

        Również dzięki!

        Odpowiedz
  2. Adam Zaorski napisał

    25 listopada, 2019 o 1:32 pm

    Dziękuję za wyczerpujące wyjaśnienie 🙂

    Odpowiedz
  3. Monika Kowalewska napisał

    18 marca, 2020 o 8:56 pm

    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
    • Ela Sądel napisał

      19 marca, 2020 o 9:51 am

      Halko! Do polecenia dodałam kod i komentarz, bo m [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
  4. Krzysztof Adynowski napisał

    16 grudnia, 2020 o 8:16 pm

    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
    • Ela Sądel napisał

      17 grudnia, 2020 o 9:46 am

      Cześć Krzysztof! Masz NullPointerException, to o [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz

Pierwszy Sidebar

LEKCJE W KURSIE

  • Przygotowanie środowiska programistycznego (DARMOWA LEKCJA)
  • Inicjalizacja drivera i demo Selenium (DARMOWA LEKCJA)
  • Nawigacja pomiędzy stronami (DARMOWA LEKCJA)
  • Zamykanie przeglądarki lub sesji (DARMOWA LEKCJA)
  • Zadanie: zamykanie przeglądarki i sesji (DARMOWA LEKCJA)
  • Tytuł strony, URL i jej źródło
  • Zadanie: pobieranie tytułu, URLa i źródła strony
  • Ciasteczka
  • Zadanie: ciasteczka
  • Rozmiar i pozycja okna przeglądarki
  • Zadanie: rozmiar i pozycja okna przeglądarki
  • Metody lokalizujące
  • Mechanizmy lokalizujące: nazwa klasy, id, atrybut name, nazwa taga
  • Mechanizmy lokalizujące: tekst linku
  • Zadanie: proste lokatory
  • Mechanizmy lokalizujące: wprowadzenie do selektorów CSS i XPath
  • Selektory CSS: tag, id, klasa
  • Selektory CSS: atrybuty i łączenie warunków
  • Zadanie: atrybuty i łączenie warunków w selektorach CSS
  • Selektory CSS: fragment wartości atrybutu
  • Zadanie: fragment wartości atrybutów w selektorach CSS
  • Selektory CSS: relacje między elementami
  • Zadanie: relacje w selektorach CSS
  • XPath: atrybuty i tagi
  • XPath: fragment atrybutu i tekst
  • Zadanie: atrybuty i tekst w XPath
  • XPath: relacje między elementami
  • Zadanie: relacje między elementami w XPath
  • Timeouty: oczekiwanie na pojawienie się elementu i załadowanie strony
  • Interakcje z WebElementami: klikanie w elementy i wprowadzanie tekstu
  • Interakcje z WebElementami: wgrywanie pliku z dysku
  • Zadanie: interakcje z WebElementami
  • Wstęp do zasad programowania: DRY
  • Wstęp do zasad programowania: KISS
  • Wstęp do zasad programowania: YAGNI
  • Zadanie: wstęp do zasad programowania
  • Czekanie na warunki: ExplicitWait
  • Czekanie na warunki: ExpectedConditions
  • Zadanie: czekanie na warunki
  • Metody na WebElementach: pobieranie informacji o elementach i findElement()
  • Zadanie: metody na WebElementach
  • Ramki
  • Zadanie: ramki
  • Wykonywanie JavaScriptów
  • Zadanie: wykonywanie JavaScriptów
  • Obsługa alertów
  • Zadanie: obsługa alertów
  • Praca na kilku oknach przeglądarki
  • Zadanie: praca na kilku oknach przeglądarki
  • Listy rozwijane
  • Zadanie: listy rozwijane
  • Gesty w Selenium: wstęp
  • Gesty w Selenium: klik, podwójny klik oraz prawy przycisk myszy
  • Gesty w Selenium: zdarzenia klawiatury i wysyłanie tekstu
  • Zadanie: gesty w Selenium
  • Gesty w Selenium: przesuwanie obiektów
  • Zadanie: przesuwanie obiektów
  • Web Storage: metody na Local Storage i Session Storage
  • Web Storage: użycie JavaScript
  • Zadanie: WebStorage
  • Zrzuty ekranu: wykonywanie screenshotów strony i elementów
  • Zrzuty ekranu: przykład użycia screenshotów
  • Inicjalizacja driverów: Chrome, Firefox, Opera, Internet Explorer, Edge
  • Konfiguracja Selenium Grid
  • RemoteWebDriver: inicjalizacja drivera wspierającego testy w trybie rozproszonym
  • Projekt testowy
  • Omówienie projektu testowego: testy koszyka
  • Omówienie projektu testowego: testy płatności
  • Omówienie projektu testowego: testy metod płatności
  • Page Object Model: wprowadzenie
  • Page Object Model: jak zacząć budować własny framework testowy
  • Page Object Model: kolejna klasa Page Object
  • Zadanie z POM: przepisanie testu addOneProductTenTimesTest()
  • Page Object Model: refaktoryzacja kodu i klasa BaseTest
  • Page Object Model: refaktoryzacja kodu i klasa BasePage
  • Page Object Model: refaktoryzacja i nowa metoda w klasie CartPage
  • Page Object Model: części wspólne różnych stron na przykładzie HeaderPage
  • Zadanie z POM: części wspólne stron (stopka w POM)
  • Zadanie z POM: przepisanie pozostałych testów koszyka
  • Zadanie z POM: przepisanie testu płatności bez zakładania konta cz. 1
  • Zadanie z POM: przepisanie testu płatności bez zakładania konta cz. 2 - wprowadzanie danych karty
  • Page Object Model: DriverFactory
  • Plik konfiguracyjny
  • Wzorzec Singleton na przykładzie konfiguracji
  • Synchronizacja w Singletonie i konfiguracja bez Singletona
  • Dane testowe z pliku
  • PageFactory: inicjalizacja elementów i FindBy
  • Wady i zalety PageFactory oraz pozostałe możliwości

Footer

Elzbieta Natalia Sadel
Av. de las Postas 21 6 C
29014 Málaga
Hiszpania
NIF: Y7882076J

Zostań trenerem!

Regulamin
Polityka prywatności
Polityka wsparcia w ramach członkostwa

Koszulki i torby dla testerów

Pomoc
Kontakt

Poskładane z 💛 przez Automatela.pl