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 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 dostępu do tego kursu. Wykup dostęp albo zaloguj się, by móc zobaczyć pełną lekcję.

POM do projektu

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. 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
  2. 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
      • 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
  3. 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