Selenium - nevidí elementy dotáhnuté ajaxem
Ahoj,
mám jednu stránku, kde se formulář načítá ajaxem asi tak 10 vteřin a během toho selenium drží session, takže se nemůže v průběhu dít nic jiného (to je dobře) a po úplném načtení formuláře se teprve pokračuje v mém kódu.
Problém je, že když chci ten formulář vyplnit, tak mi to hází chybu "No such element: unable to locate element ...", i když tam ten element už je ve stránce načtený.
Zkusil jsem v cyklu třeba minutu volat:
driver.find_element_by_id(element_id).send_keys('nějaká hodnota')
a po každém neúspěšném pokusu čekat
time.sleep(1)
,
zkoušel jsem i
driver.implicitly_wait(30)
,
WebDriverWait(driver, 30).until(EC.presence_of_element_located(('id', element_id)))
a i jsem se pokusil pole vyplnit spuštěním JS na stránce, ale bez úspěchu, pořád to hází chybu, že element se nepodařilo najít.
Kde je problém?
Díky.
A co prosté document.getElementById ?
Mimochodem proč trvá načtení formuláře 10 vteřin ?
Na úvodní stránce se přihlásím, pak kliknu na jeden odkaz, kde se zobrazí jedna URL a následně se asi 10 vteřin načítá nějaký formulář a tabulka s daty (to jsem nenapsal, proto to trvá tak dlouho).
Já potřebuju do toho formuláře vyplnit jedno pole a potvrdit, aby se mi vyfiltrovalo jen to, co potřebuju.
Do stránky jsem poslal tento kód:
PS: element_id je samozřejmě string v mém kódu. :)
Měla by být naplněna hodnota element_id a řetězec by měl být:
To element_id tam mám přímo jako ten string, akorát sem jsem ho nechtěl kopírovat, protože je to celkém dlouhé ID, tak jsem ho jen zkrátil na klíčové "element_id". :)
Po proběhnutí tohoto řádku mi to taky vyhodí podobnou chybu, taky že element s ID "nejake_super_hodne_dlouhe_id" neexistuje.
A co vypíše
?
Screen v příloze. Poprvé jsem ten log nechal vypsat v kódu a podruhé jsem to zkusil ručně přímo v prohlížeči a oboje vyšlo, že to tam není, i když opravdu je.
(Nalezené ID je tam 2x, protože podruhé je na stránce přímo v kódu JavaScriptu té stránky.)
Kde jsi přišel na to:
Nemělo by to spíš být:
https://www.selenium.dev/documentation/en/getting_started_with_webdriver/locating_elements/
No, možná bych měl upřesnit i jazyk, ve které to píšu. Python.
Toto je obecná metoda, ale existuje i ta, kterou jsem použil výše.
Není na té stránce iframe?
Ano, ten element je hluboko v iframu.
https://www.selenium.dev/documentation/en/webdriver/browser_manipulation/
Ano, toto vyřešilo můj problém:
Díky moc. :)
selenium je mrtve, pouzivej puppeteer a nebudes mit takove problemy