• 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 71. Page Object Model: jak zacząć budować własny framework testowy

Strona główna > Kursy > Kurs Selenium w Javie > Selenium 71. Page Object Model: jak zacząć budować własny framework testowy

W tej lekcji zaczniemy tworzyć swój własny framework testowy. Pokażę Ci jak zacząć i jak IntelliJ może nam oszczędzić pracy. Przepiszemy jeden test i stworzymy dwie klasy Page Object: CartPage i ProductPage.

Uwaga: plik z projektem testowym, na którym pracujemy w lekcjach dotyczących POM wymaga uzyskania dostępu. Dostaniesz go tutaj.

 

W poniższych klasach poprawiłam nazwę pakietu z PageObjetcs na PageObjects. Zmień to również u siebie – wystarczy, że klikniesz na nazwę tego pakietu (folderu) na drzewku po lewej stronie, wybierzesz Refactor>Rename.

Klasa Page Object: CartPage

Ukryta treść

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

Klasa Page Object: ProductPage

Ukryta treść

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

Klasa testowa: CartTests

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

    1 października, 2019 o 7:50 pm

    Trochę  inaczej napisałem testy, więc i trochę inne metody wykorzytuję. Poniżej jedna z przykładowych:

    @Test
    public void shouldAddProductToCartFromCategoryPage(){
    String givenCategoryName = "Wspinaczka";
    String givenProductName = "Wspinaczka Via Ferraty";
    HomePagePOM homePagePOM = new HomePagePOM(driver);

    HashSet<String> productsInCart = homePagePOM.goToShopPage().goToCategory(givenCategoryName).addProductToCartFromCategory(givenProductName).goToCart(givenProductName).productsInCart();
    Assertions.assertTrue(productsInCart.contains(givenProductName), "Cart not contain selected product!");
    }

    I pytanie: jak to zapisać jeśli jednak nie chciałbym tego chainować, czyli zapisywać kroki w oddzielnych liniach, coś w stylu:
     
    homePagePOM.goToShopPage(); //zwraca new ShopPage(driver)
    shopPage.goToCategory(givenCategoryName); //zwraca new CategoryPage(driver)
    categoryPagePOM.addProductToCartFromCategory(givenProductName); //zwraca new CategoryPage(driver) - bo nie zmieniamy strony
    itd..
    i dopiero na końcu robię
    HashSet<String> productsInCart = cartPagePOM.productsInCart();

     

    Odpowiedz
    • Ela Sądel napisał

      2 października, 2019 o 8:42 am

      Najpierw wrzucę kilka uwag, które mi się rzuci [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
  2. Tomasz napisał

    3 października, 2019 o 10:39 pm

    Dzięki za feedback 🙂 Po przemyśleniu zdecydowałem się trzymać jednak takiej notacji:

    productsInCart = homePagePOM.goToShopPage()
                                .goToCategory(givenCategoryName)
                                .addProductToCartFromCategory(givenProductName)
                                .goToCart(givenProductName)
                                .productsInCart();
    
    Assertions.assertTrue(productsInCart.contains(givenProductName), "Cart not contain selected product!");

    POM w nazwie jest dla lepszej czytelnoci w IDE, równolegle dłubie sobie też ten sam projekt w page factory i tam mam końcówki PF (wiem że w różnych package'ach mogą być te same nazwy klas ale tak jest mi wygodniej i czytelniej).

    goToCart z parametrem wyszukuje button pod konkretnym produktem bo takich buttonów może być kilka jeśli dodałem kilka produktów, a mi chodzi o ten pod konkretnym produktem.

    Odpowiedz
    • Ela Sądel napisał

      4 października, 2019 o 11:21 am

      Spoko, to są narzędzia, mają służyć nam, a n [...] CAŁOŚĆ KOMENTARZA WIDOCZNA DLA SUBSKRYBENTÓW.

      Odpowiedz
  3. Bartłomiej Ejdys napisał

    16 września, 2020 o 12:33 pm

    Cześć, takie pytanko mi się nasunęło: czy nie moglibyśmy zrobić metody goTo w ten sposób?

    public ProductPage goTo(String productUrl) {
            driver.navigate().to(productUrl);
            return this;
        }

    Wiem że to w sumie szczegół, ale jestem ciekaw czy takie rozwiązanie byłoby ok 🙂

    Odpowiedz
    • Ela Sądel napisał

      16 września, 2020 o 4:14 pm

      Halko! Można, różnica jest tylko taka, że zami [...] 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