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 49. Zadanie: praca na kilku oknach przeglądarki

Czas przećwiczyć to, co przerobiliśmy wspólnie na ostatnim filmie, czyli pracę na kilku oknach przeglądarki. Przed Tobą zadanie, w którym konieczne będzie przełączenie się do nowego okna, żeby móc wykonać jakąś akcję.

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

Rozwiązanie

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

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. Czy takie rozwiązanie może być ?

    ublic class HomeworkWindowHandles {
        WebDriver driver;
        WebDriverWait wait;
        By shop = By.cssSelector("#menu-item-198");
        By allert = By.className("woocommerce-store-notice__dismiss-link");
        By windsufring = By.linkText("Windsurfing");
        By product = By.cssSelector("li.post-386");
    
        @BeforeEach
        public void setup(){
            System.setProperty("webdriver.chrome.driver","src/main/resources/chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().maximize();
            driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);
            wait = new WebDriverWait(driver, 7);
            driver.navigate().to("https://fakestore.testelka.pl");
            driver.findElement(allert).click();
            driver.findElement(shop).click();
            driver.findElement(windsufring).click();
            driver.findElement(product).click();
            wait.until(ExpectedConditions.invisibilityOfElementLocated(allert));
        }
    
        @AfterEach
        public void driverQuit(){
            driver.close();
            driver.quit();
        }
    
        @Test
        public void homeworkWindowHandlestTest(){
            driver.findElement(By.cssSelector("a[data-product-id*='386']")).click();
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.linkText("Przeglądaj listę życzeń")));
            driver.findElement(By.cssSelector("li#menu-item-248")).click();
            Set<String> windows = driver.getWindowHandles();
            String parentWindow = driver.getWindowHandle();
            windows.remove(parentWindow);
            String secondWindow = windows.iterator().next();
            driver.switchTo().window(secondWindow);
            driver.findElement(By.cssSelector("a[class*='remove remove_from_wishlist']")).click();
            //WebElement meesageElement = driver.findElement(By.cssSelector("div.woocommerce-message"));
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div.woocommerce-message")));
            String message = driver.findElement(By.cssSelector("div.woocommerce-message")).getText();
            Assertions.assertEquals("Produkt został usunięty.", message, "Mesage was not exist");
        }
    Odpowiedz
  2. Cześć,

    Czy mogłabyś proszę wytłumaczyć czemu poprzez poniższy kod otwierają mi się dwa okna z Listą życzeń? 🙂

        driver.findElement(By.cssSelector("a[class=\"woocommerce-store-notice__dismiss-link\"]")).click();
        driver.findElement(By.cssSelector("img[alt=\"Yoga w Japonii\"]")).click();
        driver.findElement(By.cssSelector("a[data-product-id=\"61\"]")).click();
        driver.findElement(By.cssSelector("li[id=\"menu-item-248\"]")).click();
        driver.findElement(By.cssSelector("a[rel=\"noopener noreferrer\"]")).click();
        Set windows = driver.getWindowHandles();
        String mainWindow = driver.getWindowHandle();
        windows.remove(mainWindow);
        String wishListPage = windows.iterator().next();
        driver.switchTo().window(wishListPage);
    
    Odpowiedz
  3. Hej, z jakiegoś powodu po otwarciu wishlisty getWindowHandles na FF zwraca mi tylko 1 obiekt, za to na Chromie jest ok. Tylko ja tak mam?

    Odpowiedz
  4. hej!
    mam jakiś taki kłopot, że nie działa mi dodawanie produktu do listy życzeń... nie do końca wiem czemu:

    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.openqa.selenium.By;
    import org.openqa.selenium.Dimension;
    import org.openqa.selenium.Point;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    public class WishList {
        WebDriver driver;
    
        @BeforeEach
        public void setup() {
            System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().setSize(new Dimension(1260, 760));
            driver.manage().window().setPosition(new Point(75, 20));
            driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);
            driver.navigate().to("https://fakestore.testelka.pl/");
            driver.findElement(By.cssSelector(".woocommerce-store-notice__dismiss-link")).click();
        }
    
        @Test
        public void deletingFromWishListIsOk(){
            driver.findElement(By.cssSelector("[class*='first'] .woocommerce-loop-category__title")).click();
            driver.findElement(By.cssSelector("li:nth-child(1) [class=woocommerce-loop-product__title]")).click();
            driver.findElement(By.cssSelector("[class='yith-wcwl-add-button'] span")).click();
    

    Po tym mam komunikat, że dodano do listy życzeń, a jak kliknie na link 'Lista życzeń' na górze strony to jest tam pusto.
    PS. Jak się formatowało kod w komentarzach na javę?

    Odpowiedz
  5. Hej! A gdybym chciał dodatkowo na koniec testu zamknąć okno z listą życzeń, wrócić do poprzednio otwartego okna i wykonać tam jakąś akcję (np. kliknąć w przycisk "Sklep") to jak powinienem napisać kod by prawidłowo przełączyć się do poprzedniego okna?

    Próbowałem między innymi w poniższy sposób, ale z marnym skutkiem.

    public class SwitchingTabs {
    
        WebDriver driver;
        WebDriverWait wait;
    
        By demoStoreNoticeDismiss = By.cssSelector("a[class*='dismiss-link']");
    
         @BeforeEach
            public void driverSetup() {
    
            System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().setSize(new Dimension(1295, 730));
            driver.manage().window().setPosition(new Point(10, 40));
            driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
            driver.navigate().to("https://fakestore.testelka.pl/product/wspinaczka-via-ferraty/");
            driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
            wait = new WebDriverWait(driver, 10);
            driver.findElement(demoStoreNoticeDismiss).click();
    
        }
    
        @AfterEach
        public void driverQuit() {
            driver.close();
            driver.quit();
    
        }
    
        @Test
        public void switchTabs() {
    
            WebElement addToWishListButton = driver.findElement(By.cssSelector("a.add_to_wishlist"));
            addToWishListButton.click();
            wait.until(ExpectedConditions.invisibilityOf(addToWishListButton)); // poczeka aż button zniknie by po kliknięciu w następny lista zawierała dodany produkt, bez tego produkt nie doda się do listy
            driver.findElement(By.cssSelector("li#menu-item-248>a")).click();
    
            Set windows = driver.getWindowHandles(); // znajdzie wszystkie otwarte okna
            String parentWindow = driver.getWindowHandle(); // aktywną kartę nazwie parentWindow
            windows.remove(parentWindow); // z setu otwartych okien usunie parentWindow,
            String secondWindow = windows.iterator().next(); // drugie okno
            driver.switchTo().window(secondWindow);
    
            driver.findElement(By.cssSelector("a.remove_from_wishlist")).click();
    
            By emptyWishlist = By.cssSelector("td.wishlist-empty");
            wait.until(ExpectedConditions.presenceOfElementLocated(emptyWishlist));
            Assertions.assertDoesNotThrow(()-> wait.until(ExpectedConditions.presenceOfElementLocated(emptyWishlist)), "Product was not removed from the wishlist.");
    
            driver.close();
    
            String parentWindowAfterClosing = driver.getWindowHandle();
            driver.switchTo().window(parentWindowAfterClosing);
    
            By shopButton = By.cssSelector("menu-item-198");
            driver.findElement(shopButton).click();
    }
    }
    
    

    Dzięki z góry 🙂

    Odpowiedz
  6. Hej taka mała uwaga na koniec tego zadania. W 12 minucie pokazujesz jak "zepsuc" test tak aby Assercja nie przeszła. Wiec jak zauważyłem że jak jak nic nie grzebałem w samej asercji a tylko zmienilem selector na nieistniejacy i przestestowałem kod w 2 przypadkach. I tak w #1 przypadku kiedy zastosowałem wait przed Asercją to w momencie nie odnalezienia webelementu "td.wishlist-emptyy" w consoli pojawia sie TimeoutException i kod nie dochodzi nawet do Asercji i jej komunikatu. W #2 przypadku po usunieciu linijki z wait wszystko dziala jak trzeba czyli asercja sie wywala i wypisuje message.
    #1.
    ...
    driver.switchTo().window(wishListWindow);
    By removeFromWishList = By.cssSelector(".remove_from_wishlist");
    driver.findElement(removeFromWishList).click();
    By emptyWishList = By.cssSelector("td.wishlist-emptyy");
    wait.until(ExpectedConditions.presenceOfElementLocated(emptyWishList));
    Assertions.assertDoesNotThrow(()->wait.until(ExpectedConditions.presenceOfElementLocated(emptyWishList)),"Wishlist is not empty");
    }
    }

    #2
    ...
    driver.switchTo().window(wishListWindow);
    By removeFromWishList = By.cssSelector(".remove_from_wishlist");
    driver.findElement(removeFromWishList).click();
    By emptyWishList = By.cssSelector("td.wishlist-emptyy");
    Assertions.assertDoesNotThrow(()->wait.until(ExpectedConditions.presenceOfElementLocated(emptyWishList)),"Wishlist is not empty");
    }
    }

    Odpowiedz