W jednym z przepływów pracy aplikacji mam więcej niż 10 stron do nawigacji.
Muszę klikać przycisk „Dalej”ciągle - wywołuje wywołanie AJAX w celu ponownego załadowania nowej treści, a przycisk „Dalej” również zostanie ponownie załadowany. Liczba stron do nawigacji nie zawsze wynosi 10. Może to być od 10 do 100.
Mój test zostanie zakończony, gdy zostanie znaleziony element sieciowy o identyfikatorze „testcomplete”.
Więc obecnie używam ExpectedConditions ()
WebDriverWait wait = new WebDriverWait(driver, 30);
//Keep clicking next
while(isNextPresent()){
NextButton.click();
}
//testcomplete reached here
System.out.println("test complete");
private boolean isNextPresent(){
try{
WebElement element = wait.until(ExpectedConditions.visibilityOf(NextButton));
return true;
}catch(Exception e){
//
}
return false;
}
Obecnie mój kod działa dobrze. Ale staram się to poprawić. Nienawidzę niepotrzebnego oczekiwania 30 sekund, gdy obecny jest element o identyfikatorze „testcomplete”. Ponieważ czas „NextButton” nie będzie obecny.
Jak mogę to poprawić? isNextPresent
funkcjonować? Czyli, aby natychmiast zwrócić false, gdy pojawi się „testcomplete” zamiast czekać 30 sekund?
Uwaga: oznaczyłem również kątomierz, ponieważ mam również podobne wymagania dotyczące kątomierza.
Odpowiedzi:
1 dla odpowiedzi № 1Możesz łączyć warunki obu elementówi wykonaj działanie w zależności od tego, który z nich jako pierwszy zwraca wartość true dla „visibilityOf (myElement)”. Może coś takiego w pseudo (przepraszam, brak IDE w pobliżu):
loop(i < 30){
// wait NextBtn for 1 sec, if true click and break
// wait TestCopmlete for 1 sec
}
1 dla odpowiedzi nr 2
Użyj EC.or (), a la:
wait.until(ExpectedConditions.or(
ExpectedConditions.visibilityOf(NextButton),
ExpectedConditions.visibilityOf(element(by.id("testcomplete")))
));
A potem to wróci expect
pożądany stan:
expect(NextButton.isDisplayed()).toBeTruthy();