Wpis z mikrobloga

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:
find
elementbyxpath("//*[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
  • 12
@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 to
@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 kliknęło
morderca_mordercow - @xulek: w momencie robienia ssa akurat lista była niewidoczna, a...

źródło: comment_1590338158c5cun4vGnVQUeJo75cFLFn.jpg

Pobierz
@morderca_mordercow: Spróbuj zrobić coś takiego(przykład na podstawie google.pl):
from selenium import webdriver

from selenium.webdriver.support import expectedconditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Chrome("chromedriver.exe")
driver.get("https://www.google.pl")
input
search = driver.findelementbyxpath("//input[@name='q']")
input
search.sendkeys("test")
autocomplete
item = WebDriverWait(driver, 20).until(EC.elementtobeclickable((By.XPATH, "//b[contains(text(),'osteron')]"))) // czeka na element z ciągiem 'osteron' aż nie będzie klikalny
autocomplete
item.click()

u ciebie przykładowym szukanym elementem będzie