diff --git a/skripte/10.md b/skripte/10.md index 9c61cbf..9c0eb54 100644 --- a/skripte/10.md +++ b/skripte/10.md @@ -663,33 +663,119 @@ njega. ### Česti problemi -Koristan materijal: -* [Selenium Stale Element Exception with Code Example (14m14s)][selenium exceptions stale] -* [Selenium Element Not Interactable Exception wtih Python & Java Code Examples (9m20s)][selenium exceptions not interactable] - * uglavnom se rešava čekanjem da se element prikaže ili bude dostupan za interakciju -* [Selenium Element Not Clickable At Point Exception (13m16s)][selenium exceptions not clickable] - * uglavnom se rešava čekanjem ili zatvaranjem popup-a koji blokira dati element (za ovaj kurs nije neophodno znati druga rešenja) +* [Selenium Docs: Understanding Common Errors][selenium troubleshooting] --- #### NoSuchElementException -Najčešće se javlja kada se pretraga za elementom završi neuspešno zbog pogrešno -definisanog lokatora. +Koristan materijal: +* [Let's Kode It: How To Handle No Such Element Exception (15m39s)][selenium exceptions no such element - Let's Kode It] + +--- + +**Element ne može da se pronađe u datom trenutku.** + +Najčešće se javlja kada se pretraga za elementom završi neuspešno kao greška uzrokovana +pogrešno sa pokrešno definisanim lokatorom. Dešava se i da element nije na mestu na kome +ga tražimo ili nije prisutan u datom trenutku na mestu na kome ga tražimo. -Neki od mogućih razloga za dobijanje ovog exception-a su: -* pretraga se završila pre nego što je obavljeno render-ovanje stranice +Mogućih razloga za dobijanje ovog exception-a su i: +* pretraga (`findElement/s`) se završila pre nego što je obavljeno render-ovanje stranice * element se nalazi u **drugom tab-u** * element se nalazi na **drugom prozoru** * element se nalazi unutar `frame` ili `iframe` * element se nalazi unutar [**Shadow DOM-a**][shadow dom] +Rešenja: +1. čekanje (implicitno ili eksplicitno), ukoliko je problem sa trenutnom u kome je izvršena pretraga +2. prelazak pomoću `driver.switchTo()`, ukoliko se element nalazi u drugom tabu, prozoru ili frame-u +3. prelazak u Shadow DOM ukoliko se element nalazi u njemu: + ```Java + SearchContext shadowRoot = shadowContainer.getShadowRoot(); + WebEleemnt element = shadowRoot.findElement(...); + ``` + #### StaleElementException +Koristan materijal: +* [Let's Kode It: How To Handle Stale Element Exception (5m31s)][selenium exceptions stale - Let's Kode It] +* [Selenium Stale Element Exception with Code Example (14m14s)][selenium exceptions stale] + +--- + +**Element je prethodno pronađen, ali referenca više ne važi jer sada preko nje ne možemo da mu pristupimo.** + +Dešava se da dođe do nekih izmena nakon lociranja elementa i da ono što smo prethodno pronašli +više nije validno. + +Mogući uzroci: +* stranica je osvežena +* pronađeni element je **obrisan** u nekom trenutku pa sada referenca na njega + (`WebElement`) ne važi +* pronađeni element je **premešten** u nekom trenutku pa sada referenca na njega ne važi +* element je **obrisan i potom zamenjen** istim ili sličnim elementom (može i da ima isti id) +* element je **pronađen, a potom smo prešli na drugo mesto, tj. kontekst** (stranicu, prozor, tab, frejm, ...) + +**Ukoliko dođe do problema zbog promene DOM-a, možemo pronaći element opet**. To nije baš efikasno +i još uvek postoji verovatnoća da opet dođe do ove greške sa datim elementom, ali period u kome +ona može da nastane je veoma kratak pa je time i verovatnoća znatno mala. Drugo rešenje je +da taj element **wrap-ujemo unutar nekog objekta koji čuva lokator elementa i kešira ga.** +Tada će ovaj objekat ponovo pronaći element kada postane stale (nevalidan). To možemo odraditi +sa anotacijom `@CacheLookup`. Ovo rešenje je efikasnije. + +Ukoliko dođe do promene konteksta, potrebno je da se **vratimo nazad** jer je referenca još uvek +validna, ali ukoliko promenimo stranicu potrebno je i da **ponovo lociramo** element jer je +prethodni kontekst obrisan. + #### ElementNotInteractableException +Koristan materijal: +* [Let's Kode It: How To Handle Element Not Interactable Exception (14m34s)][selenium exceptions not interactable - Let's Kode It] + * prikazuje razne uzroke koji mogu izazvati ovu grešku, a o kojima se ne priča toliko često +* [Selenium Element Not Interactable Exception wtih Python & Java Code Examples (9m20s; opciono)][selenium exceptions not interactable] + * uglavnom se rešava čekanjem da se element prikaže ili bude dostupan za interakciju + +--- + +Najčešće se javlja: +1. kada je element sakriven ili onemogućen ili +2. kada se nad elementom vrši akcija koju ne podržava + +**Vršenje nepoznate akcije se može dogoditi i greškom**. Na primer, koristimo id za lociranje +elementa. Mi očekujemo da je jedinstven i da jednoznačno određuje element, ali to +ne mora biti uvek slučaj. **Stranica može da sadrži više elemenata sa istim id-jem**, iako +je pravilo da se to ne radi. U ovakvoj situaciji, lociran je prvi element sa koji ima +dati id, pa se može dogoditi da mi nad tim pogrešnim elementom izvršavamo akciju koja nije +podržana (npr. unos teksta u element koji predstavlja labelu). + +Može se javiti, ali ređe, i: +* kada je element u DOM-u prisutan, ali nije prikazan (već mora da se skrola do njega da bi se video) +* kada ga neki element prekriva + #### Element is not clickable at point +Koristan materijal: +* [Let's Kode It: How To Handle Element Not Clickable At Point Exception (12m36s)][selenium exceptions not clickable - Let's Kode It] + +--- + +Mogući uzroci: +1. element je onemogućen +2. element još uvek nije dostupan (učitan) +3. element se preklapa sa drugim elementima + +Rešenja: +1. omogućavanje kroz neku interakciju sa stranicom (ukoliko je moguće) +2. čekanje, implicitno ili eksplicitno, na dati element (visibility, presence, ..) ili element koji ga preklapa (invisibility, ...) +3. uklanjanje elementa (koji preklapa dati element) kroz neku interakciju (npr. zatvaranje popup-a) + +Neke stvari koje nam još mogu pomoći su: +* `JavascriptExecutor`-a za scroll i/ili klik +* maksimizacija stranice (`driver.manage().window().maximize()`) kako bi se rasporedili elementi i smanjilo preklapanje +* korišćenje klase `Actions` + + #### Cannot find BROWSER binary Poruka je ovog oblika (za `ChromeDriver`): @@ -712,9 +798,17 @@ Ova greška se javlja kada: [selenium api docs]: https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebDriver.html [selenium guru99]: https://www.guru99.com/selenium-tutorial.html +[selenium troubleshooting]: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors + +[selenium exceptions no such element - Let's Kode It]: https://www.youtube.com/watch?v=y6SYtAh-kCk + [selenium exceptions stale]: https://www.youtube.com/watch?v=Yb_2u6BWYE4 +[selenium exceptions stale - Let's Kode It]: https://www.youtube.com/watch?v=yYQrtmNn6Uo + +[selenium exceptions not interactable - Let's Kode It]: https://www.youtube.com/watch?v=e2tSki_Ossc [selenium exceptions not interactable]: https://www.youtube.com/watch?v=czzbm4bHI0w -[selenium exceptions not clickable]: https://www.youtube.com/watch?v=Yb_2u6BWYE4 + +[selenium exceptions not clickable - Let's Kode It]: https://www.youtube.com/watch?v=iaI1vcEAWlM [webdrivermanager]: https://bonigarcia.dev/webdrivermanager/#motivation