Sí, he encontrado este problema muchas veces cuando uso Selenium. Hay 2 formas en que trabajé alrededor de este problema. En primer lugar, puede cambiar el tiempo de espera implícito. Por ejemplo dado este pedazo de código:
Actions builder = new Actions(driver);
builder.click(driver.findElement(By.className("lala"))).perform();
Este código será una excepción si en el punto que se llama no existen elementos que se pueden encontrar para que coincida con la clase "lala". Puede cambiar este tiempo de espera implícita con:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
Esto hace que la encuesta piloto durante 5 segundos en lugar de fallar de inmediato. Si el elemento aún no puede ser localizado después de 5 segundos, la acción fallará. Por supuesto, puedes cambiar esa configuración. Descubrí que este método funciona bien la mayoría de las veces. La mayoría de las veces no le importa la carga completa de la página, solo una parte determinada.
También escribí otra función que es GetElementByClassAndText que hacer lo mismo que espera implícita en un elemento excepto que también comprueba el texto que contiene además de permitir más fino detalle de lo que quiere:
public static void waitAndClick(WebDriver driver, By by, String text) {
WebDriverWait wait = new WebDriverWait(driver, 10000);
Function<WebDriver, Boolean> waitForElement = new waitForElement(by);
wait.until(waitForElement);
for(WebElement e : driver.findElements(by)) {
if(e.getText().equals(text)) {
Actions builder = new Actions(driver);
builder.click(e).perform();
return;
}
}
}
Y el Función correspondiente que utiliza:
public class waitForElement implements Function<WebDriver, Boolean> {
private final By by;
private String text = null;
public waitForElement(By by) {
this.by = by;
}
public waitForElement(By by, String text) {
this.by = by;
this.text = text;
}
@Override
public Boolean apply(WebDriver from) {
if(this.text != null) {
for(WebElement e : from.findElements(this.by)) {
if(e.getText().equals(this.text)) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
} else {
try {
from.findElement(this.by);
} catch(Exception e) {
return Boolean.FALSE;
}
return Boolean.TRUE;
}
}
}
me doy cuenta de que está utilizando selenio en Ruby, pero espero que algunos de mi código (al menos conceptualmente) es transferible y útil para usted.
¿Podría elaborar un poco más sobre cómo controlar el valor? – emery
¿Puedes por favor elaborarlo –