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 31. Interakcje z WebElementami: wgrywanie pliku z dysku

W tej lekcji pokażę Ci wgrywanie pliku z dysku w Selenium. Można to zrobić przekazując ścieżkę do pliku jedną z metod, którą poznaliśmy w poprzedniej lekcji.

Zmiana adresu strony

Strona, którą pokazuję w poniższym filmie trochę się zmieniła. Przede wszystkim, żeby przejść do interesującej nas funkcjonalności przejdź pod: https://gofile.io/uploadFiles. Zmienił się również interfejs ale nie zmieniła się zasada działania. W związku z tym lokatory mogły się zmienić w stosunku do tego co pokazuję. Ponieważ ta lekcja nie ma odpowiadającego jej zadania, potraktuj wgranie pliku na nowo wyglądającą stronę jako zadanie 💪

Problemem z wgrywanie pliku z dysku jest fakt, że otwiera nam się systemowe okno do wyboru pliku. Kto próbował takie rzeczy robić ten wie, że Selenium tego okna nie obsłuży. Można by pomyśleć, że sprawa wobec tego jest beznadziejna i nie będziemy obsłużyć żadnego scenariusza z wgrywaniem pliku. Na szczęście tak nie jest i plik możesz wgrać tylko trzeba wiedzieć jak i oto właśnie dostąpisz tej tajemnej wiedzy.

Obiekty, które pozwalają na upload pliku z dysku, to obiekty o tagu input i atrybucie type o wartości file. Czasami te obiekty są przysłonięte na stronie jakimś ładniejszym elementem ale takiego inputa znajdziecie bez problemu w konsoli developerskiej. Gdy już go namierzysz, to pozostaje Ci tylko wykonać instrukcje z nagrania.

Wsparcie merytoryczne

Nie masz dostępu do wsparcia merytorycznego dla tego kursu. Wykup dostęp albo zaloguj się, by móc zadawać pytania.

  1. Hej, co jesli moje id nie jest tak dobre jak file? Jakies inne rozwiazania dla wgrania pliku? Masz moze jakies dobre zródła robot framework?

    Odpowiedz
  2. szkoda ze nie ma przykladu z input[type='file'] na przyklad na fakestore, poniewaz strona z tutoriala gofile.io jest juz zupelnie inna i nie ma tam tego pola.

    Odpowiedz
  3. Hej
    Mam dziwny problem. Kejs wręcz identyczny jak w tej lekcji. Mianowicie poprawne logowanie i asercja, gdzie po zalogowaniu pobieram Stringa z kontrolki na której wyświetlona jest nazwa zalogowanego usera. Przed samą assercją zapisuję jeszcze w zmiennej String wartość, którą pobieram z danej kontrolki.
    Puszczam test i się wywala:

    org.opentest4j.AssertionFailedError: Expected login: oczekiwany.login@costam.pl was not found. ==>
    Expected :oczekiwany.login@costam.pl
    Actual :

    Pole Actual jest puste, wiec nic dziwnego, ze wywala błąd. Pytanie dlaczego tak jest ??
    Ustawiam BreakPointa przed samą asercją, zaraz po tym jak zczytuję do Stringa wartość kontrolki na której zapodaje metodkę getText() i w Debugu pod zmienną Stringową wartość jest widoczna, czyli pobiera się poprawnie.
    Może trochę zakręciłem, ale chyba rozumiecie o co mi chodzi ? 🙂

    Pozdrawiam.

    Odpowiedz
      • Dzięki za odpowiedź.
        Sorry, faktycznie nie dodałem tego wpisu pod właściwą lekcją. Powinien być pod lekcją wcześniejszą (30) i genaralnie mój kejs jest taki sam jak w przypadku logowania do zooniverse. Na końcu daję asercję.
        Jednak czy ustawię braeakpointa czy nie, efekt jest ten sam. W akcie desperacji dałem nawet zwykłego Sleepa przed samą asercją. Wszystko się załadowało, a i tak asercja się wywala i w logu w polu Actual zwraca pustego stringa.

        Odpowiedz
  4. Tak tak, problem nie dotyczy aplikacji na której pracujemy w lekcji, ani testowego sklepu.
    Po części udało mi się rozwiązać problem. Mianowicie, kiedy wcześniej zrobię click() ma poszukiwanym elemencie, a potem getText() wszystko działa poprawnie. Jeśli od razu robię getText() dostaję pustego Stringa.

    Odpowiedz
  5. Hej,
    jest jakaś opcja żeby wrzucić więcej niż 1 plik czy trzeba to zrobić jak ja poniżej?

        @Test
        public void testUploadFile2() {
    
            String expectedFileName1 = "google.png";
            String expectedFileName2 = "allegro.png";
            String expectedFileName3 = "youtube.png";
            String path1 = "C:\\Users\\Kuba\\Desktop\\New folder\\" + expectedFileName1;
            WebElement uploadFileInput1 = driver.findElement(By.cssSelector("input[type='file']"));
            uploadFileInput1.sendKeys(path1);
            String path2 = "C:\\Users\\Kuba\\Desktop\\New folder\\" + expectedFileName2;
            WebElement uploadFileInput2 = driver.findElement(By.cssSelector("input[type='file']"));
            uploadFileInput2.sendKeys(path2);
            String path3 = "C:\\Users\\Kuba\\Desktop\\New folder\\" + expectedFileName3;
            WebElement uploadFileInput3 = driver.findElement(By.cssSelector("input[type='file']"));
            uploadFileInput3.sendKeys(path3);
    
            String fileNameElement1 = driver.findElement(By.xpath("//td[contains(text(),'google.png')]")).getText();
            String fileNameElement2 = driver.findElement(By.xpath("//td[contains(text(),'allegro.png')]")).getText();
            String fileNameElement3 = driver.findElement(By.xpath("//td[contains(text(),'youtube.png')]")).getText();
    
            Assertions.assertEquals(expectedFileName1, fileNameElement1);
            Assertions.assertEquals(expectedFileName2, fileNameElement2);
            Assertions.assertEquals(expectedFileName3, fileNameElement3);
    
        }
    
    Odpowiedz