Skip to content

Commit

Permalink
skripte(10): dodat materijal za selenium exception-e
Browse files Browse the repository at this point in the history
  • Loading branch information
TodorovicSrdjan committed Jan 8, 2024
1 parent 091fe49 commit da197bf
Showing 1 changed file with 105 additions and 11 deletions.
116 changes: 105 additions & 11 deletions skripte/10.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`):
Expand All @@ -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

Expand Down

0 comments on commit da197bf

Please # to comment.