tutorial - selenium webdriver java
¿Cuál es la mejor manera de evitar NoSuchElementException en Selenium? (7)
Estoy completamente de acuerdo con Petr Mensik arriba. La materia nunca se puede decir si el elemento está presente. Debes entender claramente por qué cuando sucede. Desde mi experiencia debo decir que sucede debido a las siguientes razones:
- 1) La página aún se está procesando y ya ha terminado su búsqueda de elementos y no ha obtenido ninguna excepción de elementos.
- 2) La segunda razón es que AJAX no ha regresado todavía y ya ha obtenido la
NoSuchElementException
- 3) El tercero es el más obvio: el elemento realmente no está en la página cuando.
por lo tanto, la manera más robusta de manejar mi humilde opinión para manejar estas tres condiciones usando una llamada de función es usar fluentWait
como Amith003 sugirió.
por lo que el código será el siguiente:
deja que tu elemento tenga el localizador:
String elLocXpath= "..blablabla";
WebElement myButton= fluentWait(By.xpath(elLocXpath));
myButton.click();
public WebElement fluentWait(final By locator){
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(org.openqa.selenium.NoSuchElementException.class);
WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
}
);
return foo;
};
Además, si su propósito es el código robusto, fluentWait()
con un bloque try{} catch{}
.
Además no te olvides de
public boolean isElementPresent(By selector)
{
return driver.findElements(selector).size()>0;
}
Eso también es útil.
Entonces, para concluir todo lo mencionado, si quiere evitar la excepción NoElement
simplemente NoElement
adecuadamente, ya que nadie puede garantizar la presencia del elemento en la página.
Espero que ahora te quede más claro. Saludos
He escrito algunos casos de prueba en Selenium WebDriver utilizando Java y los ejecuto en cuadrícula (hub y nodos múltiples). Me he dado cuenta de que algunos casos de prueba fallan debido a la NoSuchElementException
. ¿Cuál es la mejor y más robusta manera de evitar la NoSuchElementException
y garantizar que el elemento se encuentre siempre?
Nunca puede estar seguro de que se encontrará ese elemento; en realidad, este es el propósito de las pruebas funcionales: para informarle si algo cambió en su página. Pero una cosa que definitivamente ayuda es agregar esperas a los elementos que a menudo causan NoSuchElementException
como
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));
Podemos aplicar los siguientes códigos para eliminar esta condición de excepción.
Al aplicar WebDriverWait, el objeto webdriver espera un tiempo específico (en segundos) de un elemento para su visibilidad.
WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.visibilityOf(link));
Podemos manejar NoSuchElementException a través del bloque try-catch dentro del método genérico
public boolean isElementPresent(By by) { boolean isPresent = true; try { driver.findElement(by); } catch (NoSuchElementException e) { isPresent = false; } return isPresent }
http://selenium-code.blogspot.in/2017/08/selenium-exception-nosuchelementexcepti.html
Suelo utilizar esta línea en la función principal.
public static void main(String[] args) throws ParseException {
driver= new ChromeDriver();
driver.manage().window().maximize();
**driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);**
Espero que esto ayude.
También puedes usar FluentWait
,
Cada instancia de FluentWait
define la cantidad máxima de tiempo para esperar una condición, así como la frecuencia con la que se verifica la condición.
Además, el usuario puede configurar la espera para ignorar tipos específicos de excepciones mientras espera, como NoSuchElementExceptions
al buscar un elemento en la página.
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) {
FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
.pollingEvery(pollingSec, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class, TimeoutException.class);
for (int i = 0; i < 2; i++) {
try {
//fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id=''reportmanager-wrapper'']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title=''We are processing through trillions of data events, this insight may take more than 15 minutes to complete.'']")));
fWait.until(ExpectedConditions.visibilityOf(element));
fWait.until(ExpectedConditions.elementToBeClickable(element));
}
catch (Exception e) {
System.out.println("Element Not found trying again - " + element.toString().substring(70));
e.printStackTrace();
}
}
return element;
}
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));
elementToBeClickable espera a Habilitar y Visible de un Elemento