Czy istnieje sposób sprawdzenia, czy element jest obecny? Każda metoda findElement zakończyłaby się wyjątkiem, ale nie tego chcę, ponieważ może się zdarzyć, że element nie jest obecny i to jest w porządku, to nie oznacza niepowodzenia testu, więc wyjątek nie może być rozwiązaniem.
Znalazłem ten post: Selenium c # Webdriver: Czekaj, aż element jest obecny Ale to jest dla C # i nie jestem w tym zbyt dobry. Czy ktoś może przetłumaczyć kod na Javę? Przepraszam chłopaki, wypróbowałem to w Eclipse, ale nie rozumiem tego od razu w kodzie Java.
To jest kod:
public static class WebDriverExtensions{
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){
if (timeoutInSeconds > 0){
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
}
java
selenium
selenium-webdriver
próbnik
źródło
źródło
Odpowiedzi:
Użyj
findElements
zamiastfindElement
.findElements
zwróci pustą listę, jeśli zamiast wyjątku nie zostaną znalezione żadne pasujące elementy.Aby sprawdzić, czy element jest obecny, możesz spróbować tego
To zwróci wartość true, jeśli zostanie znaleziony co najmniej jeden element i false, jeśli nie istnieje.
Oficjalna dokumentacja zaleca tę metodę:
źródło
A co z metodą prywatną, która po prostu wyszukuje element i określa, czy jest obecny w ten sposób:
Byłoby to dość łatwe i spełnia swoje zadanie.
Edycja: możesz nawet pójść dalej i wziąć
By elementLocator
parametr jako, eliminując problemy, jeśli chcesz znaleźć element za pomocą czegoś innego niż id.źródło
Zauważyłem, że to działa dla Java:
źródło
presenceOfElementLocated
zgłosi wyjątek, jeśli element nie zostanie znaleziony przy żadnej konkretnej próbie. Aby tego uniknąć, dodajwait.ignoring(NoSuchElementException.class);
instrukcję między pierwszą a drugą linią.źródło
Miałem ten sam problem. Dla mnie, w zależności od poziomu uprawnień użytkownika, niektóre linki, przyciski i inne elementy nie będą się wyświetlać na stronie. Część mojego pakietu testowała, czy brakuje elementów, których POWINIEN brakować. Spędziłem godziny, próbując to rozgryźć. W końcu znalazłem idealne rozwiązanie.
Powoduje to, że przeglądarka ma szukać wszystkich określonych elementów na podstawie. Jeśli tak
0
, oznacza to, że nie znaleziono żadnych elementów opartych na specyfikacji. Następnie mam kod, aby wykonać instrukcję if, aby poinformować mnie, że nie została znaleziona.To jest w
C#
, więc tłumaczenia musiałyby być zrobioneJava
. Ale nie powinno być zbyt trudne.Istnieje również inna ścieżka, którą możesz wybrać w zależności od tego, czego potrzebujesz do testu.
Poniższy fragment służy do sprawdzania, czy na stronie nie ma określonego elementu. W zależności od istnienia elementu test wykonuję if else.
Jeśli element istnieje i jest wyświetlany na stronie, dałem
console.write
mi znać i przechodzę dalej. Jeśli dany element istnieje, nie mogę wykonać testu, którego potrzebowałem, co jest głównym powodem, dla którego muszę to skonfigurować.Jeśli element nie istnieje i nie jest wyświetlany na stronie. Mam else w if else wykonuje test.
Wiem, że jestem trochę spóźniony z odpowiedzią na OP. Mam nadzieję, że to komuś pomoże!
źródło
Spróbuj tego: wywołaj tę metodę i przekaż 3 argumenty:
Przykład: waitForElementPresent (driver, By.id ("id"), 10);
źródło
Możesz przyspieszyć działanie kodu, skracając limit czasu selenu przed instrukcją try catch.
Używam następującego kodu, aby sprawdzić, czy element jest obecny.
źródło
Napisz następującą funkcję / metody w Javie:
Wywołaj metodę z odpowiednim parametrem podczas asercji.
źródło
jeśli używasz rspec-Webdriver w Rubim, możesz użyć tego skryptu, zakładając, że element naprawdę nie powinien być obecny i jest to pozytywny test.
Najpierw napisz tę metodę najpierw z pliku klasy RB
Następnie w pliku specyfikacji wywołaj tę metodę.
Jeśli twój element NIE jest obecny, twoja specyfikacja przejdzie, ale jeśli element jest obecny, wyrzuci błąd, test się nie powiódł.
źródło
To działa dla mnie:
źródło
źródło
Osobiście zawsze wybieram kombinację powyższych odpowiedzi i tworzę statyczną metodę Utility wielokrotnego użytku, która wykorzystuje
size() > 0
sugestię:To jest schludne, nadające się do ponownego użycia, w utrzymaniu ... wszystkie te dobre rzeczy ;-)
źródło
Aby znaleźć konkretny element jest obecny lub nie, musimy użyć metody findElements () zamiast findElement ().
to działa dla mnie .. zasugeruj mi, jeśli się mylę ..
źródło
To powinno wystarczyć:
źródło
Podaję mój fragment kodu. Zatem poniższa metoda sprawdza, czy na stronie istnieje przycisk „ Utwórz nową aplikację ” losowego elementu WWW, czy nie. Zauważ, że użyłem okresu oczekiwania jako 0 sekund.
źródło
Użyłbym czegoś takiego (ze Scalą [kod w starej „dobrej” Javie 8 może być podobny do tego]):
a więc wtedy,
źródło
Najprostszy sposób, jaki znalazłem w Javie to:
źródło
Możesz spróbować niejawnego oczekiwania:
Lub możesz spróbować jawnie czekać jeden:
Jawnie sprawdzi, czy element jest obecny przed jakąś akcją. Niejawne oczekiwanie można wywołać w każdym miejscu kodu. Na przykład po niektórych akcjach AJAX.
Więcej na stronie SeleniumHQ
źródło