W którym miejscu kończy się "pętla" w kodzie

0

Przeglądałem githuba w poszukiwaniu najlepszych praktyk dla Selenium Webdriver i znalazłem taki kod:

async function waitForVisible(driver, locator, retries = 3) {
    try {
        const element = await driver.findElement(locator);
        await driver.wait(until.elementIsVisible(element), WAIT_TIME_OUT)
    } catch (err) {
        throw new Error(`Element "${locator.toString}" is not visible after maximum retries, error message: ${err.message}`)
    }
    await driver.sleep(WAIT_TIME_BEFORE_RETRY);
    return waitForVisible(driver, locator, retries - 1)
  }

Wydaje się, że kod ten jest niekończącą się rekurencją, która może zostać zakończona jedynie poprzez wyrzucenie wyjątku. Jednak przetestowałem kod, użyłem go w swoim przykładowym projekcie, i zauważyłem że jednak funkcja ma swój koniec i nie jest wykonywana w nieskończoność. W żadnym miejscu projekt "nie utknął" i test w mocha został zakończony poprawnie.

Pytanie: w którym miejscu/w jakim przypadku kod kończy się i wychodzi z rekurencyjnej pętli?
The question is how it is possible and in what point/case the "loop" ends? I try to understand the code as much as possible.

0

Nie podoba mi się ten kod.

  1. Powinno się użyć fluentWait
  2. retries nigdzie nie jest ograniczone, że ma zejść do 0 i się zatrzymać
  3. Ten kod może zarówno rzucić TimeoutException jak i NoSuchElementException (czy coś podobnego)

Możesz zrobić takie testy:
Zakładając, że WAIT_TIMEOUT jest ustawiony np na 2s: ukryj szukany obiekt na stronie (display=none) i pokaż po 1s, w drugiej rundzie pokaż po 3s. Dodaj logowanie na retries.

1 użytkowników online, w tym zalogowanych: 0, gości: 1