• 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 39. Zadanie: czekanie na warunki

Strona główna > Kursy > Kurs Selenium w Javie > Selenium 39. Zadanie: czekanie na warunki

Czas przećwiczyć to, co przerobiliśmy wspólnie w kilku ostatnich filmach. Przed Tobą zadanie, w którym użyjesz klasy WebDriverWait.

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.

Podpowiedź

Najlepiej jeżeli od początku ustawisz wielkość okna przeglądarki na 1295×760 za pomocą poniższej metody umieszczonej w setupie testu (metodzie z adnotacją @BeforeEach):

driver.manage().window().setSize(new Dimension(1295, 760));

Przy innych wielkościach test może zachowywać się trochę inaczej. Po więcej szczegółów sprawdź sekcję komentarzy pod tą lekcją.

Polecenie do zadania

Ukryta treść

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

Rozwiązanie

Lepiej nie podglądać przed rozwiązaniem zadania ⚠️

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. Jakub napisał

    12 stycznia, 2020 o 1:43 pm

    Hej 🙂
    Gdy próbuję odpalić test usuwania dodanego kuponu, to często rzuca mi na przemian błędami, że albo button do usuwania kuponu nie jest klikalny, albo że właśnie liczba elementów div.blockUI nie jest większa od 0.
    Jak obsłużyć sytuację, w której elementy div.blockUI pojawią się i znikną jeszcze zanim nasz test zacznie je zliczać? Bo mam wrażenie, że to szybkość działania testu albo łącza internetowego może być przyczyną tego problemu. Ale może jednak coś innego, na co jeszcze nie wpadłem 😛
    Wydaje mi się, że mam identyczną składnię kodu jak ta przedstawiona w filmie, nie znalazłem żadnych różnic.

    Odpowiedz
    • Elżbieta Sądel napisał

      12 stycznia, 2020 o 2:42 pm

      Hejo! Dodałam kod do tego zadania (co chcę swoj [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
      • Bartłomiej Ejdys napisał

        4 czerwca, 2020 o 6:58 pm

        Cześć, ja mam właśnie taki problem, tj. rzuca mi ElementClickInterceptedException przy czekaniu na elementToBeClickable ;D. Ale nie zawsze, generalnie mam problem z ogarnięciem stabilności tych testów. Często też wywala się waitForProcessingEnd, bo nie może doczekać się aż liczba elementów .processing będzie > 0, tak jakby ładowanie kończyło się jeszcze zanim selenium policzy je poraz pierwszy.
        (skopiowałem Twój kod)

        Odpowiedz
        • Ela Sądel napisał

          5 czerwca, 2020 o 11:20 am

          Halko! Wystarczy, że internet będzie odrobinę w [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

          Odpowiedz
  2. Jakub napisał

    13 stycznia, 2020 o 11:46 pm

    Hej 🙂 Dzięki za kod, myślę że to dobry pomysł, byśmy mogli mieć do niego wgląd, w razie potrzeby 🙂 Udało mi się chyba znaleźć przyczynę błędów. W filmiku poradziłaś, żeby wysokość okna była większa od 760, ale wydaje mi się, że dokładniej rzecz biorąc, kluczem jest zachowanie odpowiedniej proporcji między wysokością a szerokością okna. Bo w moim przypadku, testy przy rozmiarach okna 1295x760 i 1295x800 działały prawidłowo, ale już przy ustawieniu 1295x900 albo 1295x960 test na usuwanie kuponu się wysypywał 🙂

    Odpowiedz
    • Elżbieta Sądel napisał

      14 stycznia, 2020 o 8:52 am

      :O
      Dodam takie info w tym zadaniu, dzięki wielki [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
  3. Magdalena Zagwojska napisał

    9 kwietnia, 2020 o 10:11 pm

    Hej! W sprawie tego podwójnego wpisywania kuponu i czekania aż 'kręciołek' zniknie.
    Tobie wyskoczył komunikat błędu z elementem i klasą, które mogłaś wykorzystać, ale mi cały czas wyskakuje komunikat: stale element reference: element is not attached to the page document , z którego nic wyciągnąć się nie da. Co w takiej sytuacji?

    Odpowiedz
    • Ela Sądel napisał

      10 kwietnia, 2020 o 9:48 am

      Cześć! Najpierw musisz wyciągnąć z konsoli in [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
  4. Newbie_Tester napisał

    9 czerwca, 2020 o 10:03 pm

    Hej, mam podobny kłopot do tego który ma Magdalena, lecz u mnie pojawia się on wcześniej - w odniesieniu do pola tekstowego do wpisania kuponu. Na zmianę (nie wiem dlaczego) rzuca mi następującymi wyjątkami:

    1) org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document, albo
    2) org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"input[name='coupon_code']"} (Session info: chrome=83.0.4103.61)

    Mój kod:

    package DriverMethods;
    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.*;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import java.util.concurrent.TimeUnit; 
    
    public class WaitsExcercise {
        WebDriver driver;
        WebDriverWait wait; 
    
        By cookieConsentBar = By.cssSelector("a[class*='dismiss-link']");
        By windSurfingGroup = By.cssSelector("a[href*='windsurfing']");
        By productEgipt = By.xpath(".//h2[text()='Egipt – El Gouna']");
        By addToCartButton = By.cssSelector("button[name='add-to-cart']");
        By goToCartButton = By.cssSelector("a.cart-contents");
        By addCoupon = By.cssSelector("button[name='apply_coupon']");
        String validCoupon = "10procent";
        String invalidCoupon = "invalidCoupon"; 
    
        @BeforeEach
        public void driverSetup() {
            System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().setSize(new Dimension(1295, 760));
            driver.manage().window().setPosition(new Point(10, 40));
            driver.manage().timeouts().pageLoadTimeout(50, TimeUnit.SECONDS);
            driver.navigate().to("https://fakestore.testelka.pl/"); 
    
            wait = new WebDriverWait(driver, 10); 
    
            driver.findElement(cookieConsentBar).click();
            driver.findElement(windSurfingGroup).click();
            driver.findElement(productEgipt).click();
            driver.findElement(addToCartButton).click();
            driver.findElement(goToCartButton).click();
        }
    
        @AfterEach
        public void driverQuit() {
            driver.close();
            driver.quit();
        } 
    
        @Test
        public void validCouponTest() {
            applyCoupon(validCoupon);
        }
    
        private void applyCoupon(String coupon) {
            By couponCodeField = By.cssSelector("input[name='coupon_code']");
            By applyCouponButton = By.cssSelector("button[name='apply_coupon']");
            driver.findElement(couponCodeField).sendKeys(coupon);
            driver.findElement(applyCouponButton).click();
        }
    }
    

    Natomiast gdy odpalam ten sam kod w debug'u krok po kroku, wtedy poprawnie znajduje couponCodeField i działa.
    Próbowałem skorzystać z Twojej rady by wrzucić to w pętle i po wykonaniu kodu wciąż rzuca którymś z wyjątków (w przypadku unable to locate element wrzucałem mu wtedy w pętli catch (NoSuchElementException e)).

    Poniżej screen ukazujący jak to wygląda w debug'u:
    https://snipboard.io/ExvDL7.jpg
    Na chwilę udało mi się to zmitygować wrzucając do metody applyCoupon thread.sleep, ale po paru godzinach przestało działać i jestem w punkcie wyjścia, dalej rzuca tymi samymi wyjątkami.

    Wszystkie opisane powyżej sytuacje również powtarzają się gdy odpalam Twój kod.

    Mam jeszcze 2 pytania:

    1) W odpowiedzi do komentarza Magdy napisałaś w odniesieniu do org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document, że trzeba wyciągnąć z konsoli informacje o elemencie którego to dotyczy. Czy masz na myśli przeszukanie internal calls, jak na screenie poniżej? Jeżeli tak, tu tej informacji nie ma :(. Przyczynę ustaliłem dopiero gdy odpalałem kod w debug'u krok po kroku i obserwowałem działanie chrome'a. Później dopiero IntelliJ zaczął rzucać wyjątkiem NoSuchElementException gdzie już wskazany jest css, który według niego nie mógł zostać znaleziony.

    2) Gdy uruchomię kod w debug'u tak jak na screenie pierwszym, wtedy tylko za pierwszym razem kod wykonywany jest krok po kroku tak jak bym chciał. Każdym następnym razem jak odpale debug validCouponTest() wówczas cały kod wykonuje się tak jakbym zrobił run test. Co robię źle?

    Odpowiedz
    • Ela Sądel napisał

      10 czerwca, 2020 o 11:46 am

      Halko! Po pierwsze, to spokojnie, trzeba zacząć [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
  5. Mariusz Wojtczuk napisał

    3 listopada, 2020 o 11:08 pm

    Hej,
    Czemu w metodach przed nazwami np. alert, blockedUI są słówka 'by' co one oznaczają?

    Odpowiedz
    • Ela Sądel napisał

      4 listopada, 2020 o 1:55 pm

      Halko! "By" to klasa w Javie reprezentująca strat [...] 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