• 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 67. Omówienie projektu testowego: testy koszyka

Strona główna > Kursy > Kurs Selenium w Javie > Selenium 67. Omówienie projektu testowego: testy koszyka

Omówienie projektu testowego zaczniemy od pierwszej grupy testów a będą to testy koszyka. W tej lekcji pokażę Ci między innymi w jaki sposób podzieliłam testy na klasy, jak dodaję 10 różnych produktów iterując się po tablicy oraz jak można sobie poradzić z Firefoxem, który nie chce klikać w elementy, które Selenium na stronie widzi.

Przydatne linki

Przescrollowanie do elementu za pomocą JavaScript było tutaj.
Czekanie na elementy było tutaj, a ExpectedConditions tutaj.
Użycie WebDriverManagera było tutaj.

Klasa testowa: CartTests

Ukryta treść

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

POM do projektu

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. Damian Wasilczyk napisał

    29 czerwca, 2020 o 11:16 pm

    Czym dokładnie jest pierwsze "By" np. w poniższej linijce:

        By productPageAddToCartButton = By.cssSelector("button[name='add-to-cart']");
    

    Rozumiem, że to jakaś funkcja selenium po której lokalizujemy i jak to wszystko działa, ale dlaczego nie jest to, jak w poprzednich lekcjach:
    driver.findElement I potem dalej By.xxx

    Ewentualnie w której lekcji było coś na ten temat, może przegapiłem? (chociaż do tego momentu oglądałem wszystkie)

    Odpowiedz
    • Ela Sądel napisał

      30 czerwca, 2020 o 9:38 am

      Halko! By to klasa abstrakcyjna z metodam [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
  2. Egill napisał

    17 sierpnia, 2020 o 5:27 pm

    Hej, podszedłem do testu w którym mam dodać 10 różnych wycieczek do koszyka w inny sposób (gorszy, pamiętając o Twojej uwadze, że testy nie powinny niebezpiecznie wydłużać się), ale ćwiczeniowo chciałbym dokończyć mój scenariusz tak żeby test przeszedł na zielono. Kroki do wykonania widzę tak:

    1. Przejść na stronę danej kategorii.
    2. Zaakceptować powiadomienie dot. wersji demonstracyjnej sklepu.
    3. Zrobić listę wycieczek jako WebElementów.
    4. Dodać każdą wycieczkę używając przycisku "Dodaj do koszyka" korzystając z pętli.
    5. Zweryfikować czy do koszyka została dodana prawidłowa ilość produktów (wiem, że na tym etapie powinno być ich 5, a nie 10 tak jak w poleceniu, kolejnych 5 chciałem potem wziąć z kategorii "Yoga i Pilates", ale zaciąłem się w tym miejscu 🙂 ). Chciałem ustawić explicit wait'a w pętli tak żeby po każdym kliknięciu w "Dodaj do koszyka" poczekał aż będzie dostępny button "Zobacz koszyk" pod danym produktem, następnie gdy będzie ich łącznie 5 - dopiero przeszedł do koszyka.

    Jak napisać taką pętlę? Podjąłem próbę w metodzie addAllProductsToCart, ale nie działa. Prośba o pomoc 🙂

    Mój kod:

    public class CartTests {
    
    WebDriver driver;
    WebDriverWait wait;
    
    By cookieConsentBar = By.cssSelector("a.woocommerce-store-notice__dismiss-link");
    By addToCartButton = By.cssSelector("button[name='add-to-cart']");
    By goToCartButton = By.cssSelector("a.cart-contents");
    By islandPeakClimbing = By.cssSelector("a[href='?add-to-cart=42']");
    By seeCartButton = By.cssSelector("a[title='Zobacz koszyk']");
    
    @BeforeEach
    public void driverSetup() {
    
    WebDriverManager.chromedriver().setup();
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
    
    wait = new WebDriverWait(driver, 10);
    
    }
    
    @AfterEach
    public void driverQuit() {
    
    driver.close();
    driver.quit();
    
    }
    
    @Test
    public void addOneProductToCartFromProductPageTest() {
    
    goToClimbingProductPage();
    acceptCookies();
    addToCart();
    String getAlertMessage = driver.findElement(By.cssSelector("div[role='alert']")).getText();
    Assertions.assertEquals("Zobacz koszyk\n" +
    "“Wspinaczka Via Ferraty” został dodany do koszyka.", getAlertMessage, "The chosen product was not added to cart.");
    }
    
    @Test
    public void addOneProductFromCategoryPageTest() {
    
    goToClimbingCategory();
    acceptCookies();
    driver.findElement(islandPeakClimbing).click();
    By seeCartButton = By.cssSelector("a[title='Zobacz koszyk']");
    wait.until(ExpectedConditions.presenceOfElementLocated(seeCartButton)).click();
    Assertions.assertEquals("1 Produkt", getProductsInCartAmount(), "The chosen product was not added to cart.");
    
    }
    
    @Test
    public void addTenIdenticalProductsToCartTest() {
    
    goToClimbingProductPage();
    acceptCookies();
    setQuantityTo("10");
    addToCart();
    goToCart();
    Assertions.assertEquals("10", getQuantityValue(), "Attempt to add 10 products to cart was unsuccessful.");
    
    }
    
    @Test
    public void addTenDifferentProductsToCartTest() {
    
    goToWindSurfingCategory();
    acceptCookies();
    addAllProductsToCart();
    goToCart();
    List productsInCartList = driver.findElements(By.cssSelector("tr.woocommerce-cart-form__cart-item"));
    int getAddedProductsQuantinty = productsInCartList.size();
    Assertions.assertEquals(5, getAddedProductsQuantinty, "The quantity of products in cart is not as expected.");
    
    }
    
    @Test
    public void changeQuantityOfProductsAddedToCartTest() {
    
    goToClimbingProductPage();
    acceptCookies();
    setQuantityTo("3");
    addToCart();
    goToCart();
    setQuantityTo("2");
    Assertions.assertEquals("2", getQuantityValue(), "Attempt to change the quantity of products added to cart was unsuccessful.");
    }
    
    private void acceptCookies() {
    
    wait.until(ExpectedConditions.presenceOfElementLocated(cookieConsentBar)).click();
    }
    
    private String getProductsInCartAmount() {
    
    return driver.findElement(By.cssSelector("span.count")).getText();
    }
    
    private void goToMyAccount() {
    
    driver.navigate().to("https://fakestore.testelka.pl/moje-konto/");
    }
    
    private void goToCart() {
    
    driver.navigate().to("https://fakestore.testelka.pl/koszyk/");
    }
    
    private void addToCart() {
    
    driver.findElement(addToCartButton).click();
    }
    
    private void goToClimbingProductPage() {
    
    driver.navigate().to("https://fakestore.testelka.pl/product/wspinaczka-via-ferraty/");
    
    }
    
    private void goToClimbingCategory() {
    
    driver.navigate().to("https://fakestore.testelka.pl/product-category/wspinaczka/");
    
    }
    
    private void goToWindSurfingCategory() {
    
    driver.navigate().to("https://fakestore.testelka.pl/product-category/windsurfing/");
    }
    
    private void goToYogaAndPilatesCategory() {
    
    driver.navigate().to("https://fakestore.testelka.pl/product-category/yoga-i-pilates/");
    }
    
    private void addAllProductsToCart() {
    
    List productsAddToCartButtons = driver.findElements(By.cssSelector("a.add_to_cart_button"));
    int i = 0;
    if (i h2");
    String logInMessage = driver.findElement(logInHeader).getText();
    Assertions.assertEquals("Zaloguj się", logInMessage, "The account has not been deleted.");
    
    }
    }
    
    Odpowiedz
    • Ela Sądel napisał

      17 sierpnia, 2020 o 9:37 pm

      Halko! Żebym mogła Ci pomóc, to potrzebuję zob [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
      • Egill napisał

        18 sierpnia, 2020 o 9:54 am

        Przepraszam, edytowałem komentarz poprawiając kod i widzę że nie zapisała się treść ostatecznie. Oto fragment kodu z pętlą:

        private void addAllProductsToCart() {
        
        List productsAddToCartButtons = driver.findElements(By.cssSelector("a.add_to_cart_button"));
        int i = 0;
        if (i <= 5) {
        for (WebElement product : productsAddToCartButtons) {
        product.click();
        wait.until(ExpectedConditions.numberOfElementsToBe(seeCartButton, i));
        }
        i++;
        }
        }
        
        Odpowiedz
        • Ela Sądel napisał

          18 sierpnia, 2020 o 1:23 pm

          Halko,
          Jak sam słusznie zauważyłeś to rozwiąz [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

          Odpowiedz
  3. Egill napisał

    19 sierpnia, 2020 o 12:11 pm

    1) Metodą prób i błędów napisałem działającego foreach'a.

        private void forEachAddAllProductsToCart() {
    
            List productsAddToCartButtons = driver.findElements(By.cssSelector("a.add_to_cart_button"));
    
            int i = 1;
            for (WebElement singleAddToCartButton : productsAddToCartButtons) {
                singleAddToCartButton.click();
                wait.until(ExpectedConditions.numberOfElementsToBe(seeCartButton, i++));
            }
    
    

    Nie do końca rozumiem natomiast, dlaczego muszę ustawić i = 1 zamiast i = 0 żeby pętla poprawnie wykonała się. Gdy ustawię i = 0 to otrzymuje (na przemian) takie wyjątki:

    org.openqa.selenium.TimeoutException: Expected condition failed: waiting for number of elements found by By.cssSelector: a[title='Zobacz koszyk'] to be "3". Current number: "4" (tried for 10 second(s) with 500 milliseconds interval)
    org.openqa.selenium.TimeoutException: Expected condition failed: waiting for number of elements found by By.cssSelector: a[title='Zobacz koszyk'] to be "2". Current number: "3" (tried for 10 second(s) with 500 milliseconds interval)

    Z czego to wynika i dlaczego te wyniki różnią się między sobą?

    2) Spróbowałem rownież napisać pętlę for i tutaj już nie mogę dobrać właściwego zakresu żeby wykonała się ona prawidłowo. Gdy ustawię i = 0 spotykam się z wyjątkami takimi jak powyżej (również na przemian), natoamiast gdy analogicznie ustawię jak w pętli foreach i = 1, wtedy nie łapie mi pierwszego elementu (co akurat jest dla mnie już zrozumiałe 🙂 ), ale w przeciwieństwie do poprzedniego przypadku test wykonuje się tylko wywala sie asercja (Expected: 5, Actual: 4).

        private void forAddAllProductsToCart() {
    
            List productsAddToCartButtons = driver.findElements(By.cssSelector("a.add_to_cart_button"));
    
            for (int i = 1; i < 5; i++) {
                productsAddToCartButtons.get(i).click();
                wait.until(ExpectedConditions.numberOfElementsToBe(seeCartButton, i));
            }
        }
    

    Uprzejmie proszę o pomoc :).

    Odpowiedz
    • Ela Sądel napisał

      19 sierpnia, 2020 o 12:57 pm

      Super, że podłubałeś! Jest dużo lepiej, wida [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
      • Egill napisał

        19 sierpnia, 2020 o 1:03 pm

        Dzięki wielkie za wyjaśnienie! 🙂

        Odpowiedz
  4. Mariusz Wu napisał

    23 listopada, 2020 o 9:25 pm

    W folderze src -> main coś się znajduje?

    Odpowiedz
    • Ela Sądel napisał

      23 listopada, 2020 o 10:11 pm

      Nic tam dodawane nie było, testy trzymamy w folde [...] 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
Calle Marzo 9 1 D
41009 Sevilla
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

Ta strona korzysta z ciasteczek aby świadczyć usługi na najwyższym poziomie. Dalsze korzystanie ze strony oznacza, że zgadzasz się na ich użycie.ZgodaNie wyrażam zgodyPolityka prywatności