Kod 1:"Stale odniesienia elementem" zachowanie błąd undestanding
element(by.id('myButtonId')).click();
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
Powyższy kod pracował dobrze wiele razy, a potem zaczął dawać poniżej błędu
„failed: nieświeże odniesienie elementów: elementu nie jest dołączony do strony " dokument"
ten id 'myValidationSum maryId "nie jest używane wcześniej, kliknięcie formularza postów przycisku i komunikat o sukcesie/niepowodzeniu dostępny od strony usługi w" myValidationSummaryId ".
Kod 2:
return element(by.id('myButtonId')).click().then(function() {
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
});
Mocowanie kod jak powyżej ustalonej pierwotną emisję i to działało konsekwentnie grzywny wiele razy, ale później zaczęło braku losowo z oryginalnym czerstwego błędu odniesienia elementem.
Kod 3:
return element(by.id('myButtonId')).click().then(function() {
return element(by.id('myValidationSummaryId')).waitReady().then(function (isReady) {
if (isReady) {
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
} else {
return 'Failed to check success/failure message';
}
});
});
Potem stały kod jak wyżej i teraz działa dobrze konsekwentnie waitReady funkcja aktywnie czekać na element obecnego i wyświetlany aż do określonego czasu.
Nie powinien kątomierz/WebdriverJS powinien poradzić sobie z tymi problemami dobrze natywnie.
1> Czy mógłbyś wyjaśnić, dlaczego kod 1 i kod 2 kiedyś działały, a czasami zawodziły?
2> Czy uważasz, że kod 3 jest teraz w porządku i oczekuje się, że będzie działał za każdym razem?
Element "myValidationSummaryId" użyty tylko raz i po kliknięciu, więc jeśli strony nie są w pełni załadowane, a element nie jest jeszcze dostępny, powinien powiedzieć Nie znaleziono elementu, ale dlaczego nieaktualne odwołanie do elementu? Użyłem pageLoadTimeout jako 5 minut, a strona jest ładowana w kilka sekund. To nie jest aplikacja AngularJS i browser.ignoreSynchronization = true.
wszędzie, gdzie mówiono o tym, jaki kod może to naprawić, ale nie znalazłem wiele informacji o tym, dlaczego to zachowanie i dlaczego WebdriverJS sam nie jest w stanie sobie z tym poradzić.
Tak, wyraźne oczekiwania jest zwykły sposób rozwiązania problemów, takich jak te. Ale miałem dokładnie to samo pytanie, dlaczego czasami czekanie jest rzeczywiście konieczne i nie należy go obchodzić naturalnie. Jedną z rzeczy, których protektor nie rozpoznał w moim przypadku była animacja - gdyby była animacja pokazująca element, musiałem użyć czekania. Świetne pytanie! – alecxe
Mogę potwierdzić, że miałem dzisiaj dokładnie ten sam błąd. Bez żadnego powodu zmieniono kod i rozpoczęły się testy. Jeśli chodzi o zachowanie dziwnego Kątomierza - mogę polecić ** asynchroniczne ** jako sposób na jego oswojenie. Jeśli ** asynchronizacja ** nie pomoże, to rzucę ręcznikiem. –