Selenium - Stale element reference exception

0

Hej!

Robię mniej więcej coś takiego na ChromeDriverze:

List<WebElement> myLinks = driver.findElements(By.xpath(...));

W tym miejscu otrzymuję wszystkie te elementy, które chcę.
Następnie driver odjeżdża gdzie indziej...

driver.get("http://4programmers.net/Forum/");

Ale po tej linijce chcę się odwołać do myLinks...
Niestety dostaję Stale element reference exception... bo te linki już nie są w DOM.
Jak to naprawić?

0

No ale przecież sam to sobie wyjaśniłeś. Wyszukujesz elementów na aktualnej stronie obrabiasz i idziesz dalej. A nie robisz przeplatankę

To tak jak powiedzieć, że wchodzisz na allegro skupiasz się na 10 aukcjach a pożniej przechodzisz na gmail i dziwisz się, żę już tych aktucji w gmail nie ma...bez sensu

0

Wiem dlaczego tak jest.
Pytanie jak temu zapobiec.
Chcę porównać treści dwóch stron i dlatego w międzyczasie "odjeżdżam" driverem na inną stronę.
Jeśli to możliwe chciałbym zachować kopię tych WebElementów.

0

??

  1. Pobierz + przeparsuj
  2. Pobierz + przeparsuj
  3. Porównaj przeparsowane
0

Wiem, ale chciałbym tego uniknąć.
Nie chcę wywoływać za każdym razem ani getAttribute, ani getText, a zachować cały obiekt lub jego kopię...

Na przykład po to, by zapewnić, że dwa elementy na dwóch różnych, niepowiązanych stronach są identyczne.

0

Chcesz zachować cały dynamiczny element w pamięci komputera. Tak na prawdę to dość skomplikowane.
Jeżeli Cię to zadowala, to zapisz sobie do pliku atrybuty tych elementów które chcesz porównywać np. wspomniane getText().

Możesz popróbować jeszcze z zapamiętywaniem do cookies, być może to spełni Twoje oczekiwania.

0

Witam, akurat ja pisze w c#, nie wiem czy inaczej się to zachowuje ale WebElement u mnie jest traktowane jako uchwyt. Czyli jak coś się zmieni w elemencie i ponowne pobranie getatrybut sprawia iż inne wartości pobiera.

Proste rozwiązanie, lecz może trochę bardziej czasochłonne na początek

niech np myLinks ta lista będzie dla Ciebie zawsze listą aktualnych uchwytów.

 List<WebElement> myLinks = driver.findElements(By.xpath(...)) 

Stwórz sobie clase obiektu ktra będzie posiadałą parametry jak tagname id name itp. Oraz warstości jakie chcesz porównywać np text size czy location jak do szczęścia Ci to jest potrzebne.

I za każdym razem jak pobierzesz listę uchwytów. Stwórz z tych elementów obiekty wcześniej zdefiniowane i wrzuć do 2 listy. Może nie będziesz potrafił łatwo je porównać i weryfikować lecz będziesz wstanie się odnieść

0

Dzięki za odpowiedzi.

Ostatecznie pobrałem cały element przez .getAttribute("outerHTML"), do tego wartości zwracane przez metody typu isEnabled(), isSelected(), zamieniając is na was, getLocation() itp.
Nadpisałem equals() oraz hashCode() i git.

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