example chrome java selenium selenium-webdriver

chrome - selenium webdriver java example



Cómo esperar hasta que un elemento ya no exista en Selenium (5)

Estoy probando una IU en la que el usuario hace clic en un botón de eliminación y desaparece una entrada de la tabla. Como tal, quiero poder comprobar que la entrada de la tabla ya no existe.

He intentado usar ExpectedConditions.not() para invertir ExpectedConditions.presenceOfElementLocated() , esperando que eso signifique "esperar que no haya presencia del elemento especificado". Mi código es así:

browser.navigate().to("http://stackoverflow.com"); new WebDriverWait(browser, 1).until( ExpectedConditions.not( ExpectedConditions.presenceOfElementLocated(By.id("foo"))));

Sin embargo, encontré que incluso haciendo esto, obtengo una TimeoutExpcetion causada por una NoSuchElementException que dice que el elemento "foo" no existe. Por supuesto, no tengo tal elemento es lo que quiero, pero no quiero que se lance una excepción.

Entonces, ¿cómo puedo esperar hasta que un elemento ya no exista? Preferiría un ejemplo que no dependa de la captura de una excepción si es posible (como yo lo entiendo, las excepciones deben ser lanzadas por un comportamiento excepcional).


¿Por qué no simplemente encuentras el tamaño de los elements ? Sabemos que el tamaño de la colección de elementos sería 0 si el elemento no existe.

if(driver.findElements(By.id("foo").size() > 0 ){ //It should fail }else{ //pass }


Encontré una solución alternativa para solucionar esto de manera eficiente, utilizando el siguiente código C # para manejar esto, puede convertirlo a Java

public bool WaitForElementDisapper(By element) { try { while (true) { try { if (driver.FindElement(element).Displayed) Thread.Sleep(2000); } catch (NoSuchElementException) { break; } } return true; } catch (Exception e) { logger.Error(e.Message); return false; } }


La solución todavía dependería del manejo de excepciones. Y esto está bastante bien, incluso las Condiciones esperadas estándar se basan en las excepciones findElement() por findElement() .

La idea es crear una condición esperada personalizada :

public static ExpectedCondition<Boolean> absenceOfElementLocated( final By locator) { return new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver driver) { try { driver.findElement(locator); return false; } catch (NoSuchElementException e) { return true; } catch (StaleElementReferenceException e) { return true; } } @Override public String toString() { return "element to not being present: " + locator; } }; }


También puedes usar -

new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(locator));

Si NoSuchElementException el origen del mismo, puede ver que se NoSuchElementException tanto NoSuchElementException como staleElementReferenceException .

/** * 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; } }


// pseudo code public Fun<driver,webelement> ElemtDisappear(locator) { webelement element=null; iList<webelement> elemt =null; return driver=> { try { elemt = driver.findelements(By.locator); if(elemt.count!=0) { element=driver.findelement(By.locator); } } catch(Exception e) { } return(elemnt==0)?element:null; }; // call function public void waitforelemDiappear(driver,locator) { webdriverwaiter wait = new webdriverwaiter(driver,time); try { wait.until(ElemtDisappear(locator)); } catch(Exception e) { } }

Como Findelement lanza una excepción en el elemento unviability.so implementé el uso de Findelements. por favor siéntase libre de corregirlo y usarlo según su necesidad.