Cześć, staram się napisać skrypt automatyzujący wypełnianie formularzy na stronie za pomocą Pythona + Selenium. No i napotkałem problem z którym nie mogę sobie poradzić (bo żaden ze mnie programista). Mam w formularzu okienko w którym wpisuję dane kontrahenta (najczęściej nazwisko) a następnie wybieram któregoś z listy sugestii. I w żaden sposób nie potrafię za pomocą Pythona wybrać żądanego elementu. Na przykład w polu wyboru wpisuje Nowak, następnie wyskakuje mi lista: Jan Nowak Marek Nowak Anna Nowak Z tej listy chciałbym wybrać Marka Nowaka. Po zbadaniu elementu otrzymuję coś takiego: Marek Nowak a po skopiowaniu xpatha: /html/body/div[1]/div/div[4]/div/div/div[2]/form/fieldset[1]/div[1]/div/span/span[2]/span[2] No i powiedzmy że używam findelementbyxpath i podaję tego xpatha, ale wybiera mi pierwszy element z listy czyli Jana Nowaka. Nawet zmieniając indeks ostatniego span z 2 na inną wartość, cały czas wybierana zostaje pierwsza opcja. Szukając w googlach znalazłem rozwiązania typu: findelementbyxpath("//*[contains(.,'Marek Nowak')]") findelementby_xpath("//*[contains(text()[2],'Marek Nowak')]") ale nic z tego nie działa. Ma ktoś pomysł jak to rozwiązać? #programowanie #naukaprogramowania #python
@morderca_mordercow: to znaczy, że Twoj xpath(sciezka do elementu) moze sie zmieniać w zależności od przeładowania strony lub jest po prostu jest nieprawidłowy. Xpatha mozesz latwo sprawdzić w inskeptorze przeglądarki(F12). Następnie CTRL + F na źródle strony i wklejasz swoj xpath w pole wyszukiwania. Jak znajdzie ten element, który oczekujesz to znaczy, że jest prawidłowy. Jeśli chodzi o wyszukiwanie xpathów to polecam dodatek do przeglądarek o nazwie ChroPath. Jak dopiero zaczynasz
@xulek: @Zwierzak24: @mnasadyna: @SzatanDiabel: niestety nic z tego nie działa, podejrzewam że ta lista to jest jakiś widget i dlatego to nie chce współpracować, podrzucam wycinek kodu strony, może to coś ułatwi
@morderca_mordercow: Element ma ustawiony "display: none", a to oznacza, że nie ma go aktualnie wyświetlonego na stronie, a jeśli go nie ma na stronie to go nie naciśniesz. Musisz doprowadzić do stanu, w którym element pojawia się na stronie, wtedy go wyszukać i nacisnąć
@xulek: w momencie robienia ssa akurat lista była niewidoczna, ale w czasie jak chcę wybrać to jest display: block; Dodatkowo zauważyłem że używając np xpatha wybiera mi pierwszy element z listy ponieważ ten element jest podświetlony. Gdy myszką ręcznie przejadę na inny element to wtedy zostanie wybrany ten który jest podświetlony, więc może trzeba to jakoś po prostu obejść jakimś brutal forcem, żeby np na stronie lokalizowało szukany tekst i
Jan Nowak
Marek Nowak
Anna Nowak
Z tej listy chciałbym wybrać Marka Nowaka. Po zbadaniu elementu otrzymuję coś takiego:
Marek Nowak
a po skopiowaniu xpatha:
/html/body/div[1]/div/div[4]/div/div/div[2]/form/fieldset[1]/div[1]/div/span/span[2]/span[2]
No i powiedzmy że używam findelementbyxpath i podaję tego xpatha, ale wybiera mi pierwszy element z listy czyli Jana Nowaka. Nawet zmieniając indeks ostatniego span z 2 na inną wartość, cały czas wybierana zostaje pierwsza opcja. Szukając w googlach znalazłem rozwiązania typu:
findelementbyxpath("//*[contains(.,'Marek Nowak')]")
findelementby_xpath("//*[contains(text()[2],'Marek Nowak')]")
ale nic z tego nie działa. Ma ktoś pomysł jak to rozwiązać?
#programowanie #naukaprogramowania #python
(/html/body/div[1]/div/div[4]/div/div/div[2]/form/fieldset[1]/div[1]/div/span/span[2]/span)[2]
i musisz się upewnić, że wykonujesz tego xpatha po załadowaniu tej listy. Zakładam, że tak jest :)
//span[text()="{Dane Kontrahenta}"]Te rozwiazania z googla to aby nie mialy "*" po "//"?
Komentarz usunięty przez autora
Spróbuj tak:
from selenium.webdriver.support.ui import Select
selec1t = Select(driver.findelementbyid('ID całej rozwijanej listy'))
selec1t.selectbyvisibletext('Marek Nowak')
W dupe ucina podkreślniki
źródło: comment_1590336180Zc5AhasoCYQuS0aLvbWW9S.jpg
PobierzDodatkowo zauważyłem że używając np xpatha wybiera mi pierwszy element z listy ponieważ ten element jest podświetlony. Gdy myszką ręcznie przejadę na inny element to wtedy zostanie wybrany ten który jest podświetlony, więc może trzeba to jakoś po prostu obejść jakimś brutal forcem, żeby np na stronie lokalizowało szukany tekst i
źródło: comment_1590338158c5cun4vGnVQUeJo75cFLFn.jpg
Pobierzfrom selenium import webdriver
from selenium.webdriver.support import expectedconditions as EC
from selenium.webdriver.common.by import By
from