Ausgabe
Ich teste eine Benutzeroberfläche, in der der Benutzer auf eine Schaltfläche zum Löschen klickt und ein Tabelleneintrag verschwindet. Daher möchte ich überprüfen können, ob der Tabelleneintrag nicht mehr vorhanden ist.
Ich habe versucht, mit ExpectedConditions.not()
to invert zu verwenden ExpectedConditions.presenceOfElementLocated()
, in der Hoffnung, dass dies bedeuten würde, “erwarte, dass das angegebene Element nicht vorhanden ist”. Mein Code ist so:
browser.navigate().to("http://stackoverflow.com");
new WebDriverWait(browser, 1).until(
ExpectedConditions.not(
ExpectedConditions.presenceOfElementLocated(By.id("foo"))));
Ich habe jedoch festgestellt, dass ich selbst dabei TimeoutExpcetion
ein NoSuchElementException
Sprichwort bekomme, das besagt, dass das Element “foo” nicht existiert. Natürlich möchte ich kein solches Element haben, aber ich möchte nicht, dass eine Ausnahme ausgelöst wird.
Wie kann ich also warten, bis ein Element nicht mehr existiert? Ich würde ein Beispiel bevorzugen, das möglichst nicht auf das Abfangen einer Ausnahme angewiesen ist (so wie ich es verstehe, sollten Ausnahmen für außergewöhnliches Verhalten ausgelöst werden).
Lösung
Sie können auch verwenden –
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(locator));
Wenn Sie die Quelle durchgehen , können Sie sehen, dass sowohl NoSuchElementException
als staleElementReferenceException
auch behandelt werden.
/**
* An expectation for checking that an element is either invisible or not
* present on the DOM.
*
* @param locator used to find the element
*/
public static ExpectedCondition<Boolean> invisibilityOfElementLocated(
final By locator) {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
try {
return !(findElement(locator, driver).isDisplayed());
} catch (NoSuchElementException e) {
// Returns true because the element is not present in DOM. The
// try block checks if the element is present but is invisible.
return true;
} catch (StaleElementReferenceException e) {
// Returns true because stale element reference implies that element
// is no longer visible.
return true;
}
}
Beantwortet von – Vivek Singh
Antwort geprüft von – Timothy Miller (FixError Admin)