Selenium - Stale element reference exception

Selenium - Stale element reference exception
GR
  • Rejestracja:prawie 13 lat
  • Ostatnio:7 dni
  • Postów:94
0

Hej!

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

Kopiuj
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...

Kopiuj
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ć?

edytowany 3x, ostatnio: grzzpo
SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
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

edytowany 1x, ostatnio: Szczery
GR
  • Rejestracja:prawie 13 lat
  • Ostatnio:7 dni
  • Postów:94
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.

SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
0

??

  1. Pobierz + przeparsuj
  2. Pobierz + przeparsuj
  3. Porównaj przeparsowane
GR
  • Rejestracja:prawie 13 lat
  • Ostatnio:7 dni
  • Postów:94
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.

edytowany 2x, ostatnio: grzzpo
IE
IE
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:317
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.

KL
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:156
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.

Kopiuj
 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ść

GR
  • Rejestracja:prawie 13 lat
  • Ostatnio:7 dni
  • Postów:94
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.