attendere fino a quando l'invisibilità utilizzando la fabbrica di pagine non funziona [duplicato]

Aug 22 2020

ho questo codice:

@FindBy(how = How.CLASS_NAME, using = "loading-class")
WebElement loadingAnimation;

Quando provo a usare questa riga:

waitDriver.until(ExpectedConditions.invisibilityOf(this.loadingAnimation));

Genera un'eccezione:

org.openqa.selenium.TimeoutException: Expected condition failed: waiting for invisibility of Proxy element for: DefaultElementLocator 'By.className: loading-container' (tried for 30 second(s) with 500 milliseconds interval)

per qualche motivo funziona quando eseguo il debug del codice.

Devo dire che funziona anche:

while(true)
        {
            try {
                this.loadingAnimation.isDisplayed();
            }
            catch (Exception e) {
                break;
            }
        }

Come farlo funzionare usando Page Factory?

Risposte

1 AlexeyR. Aug 23 2020 at 03:04

Quando implementi il ​​modello Page Object e inizializzi la tua pagina con PageFactorySelenium, ti offre la possibilità di utilizzare custom ElementLocator. C'è AjaxElementLocatorquello che dovrebbe essere usato per gli elementi dinamici.

Per applicare la tua logica su come considerare il tuo elemento pronto per l'uso, esiste un metodo che è l'implementazione predefinita

protected boolean isElementUsable(WebElement element) {
  return true;
}

Quindi sei libero di ignorare quello per implementare la tua condizione. In poche parole devi implementare la tua abitudine ElementLocatorFactoryche produrrebbe AjaxElementLocatoroggetti con il tuo isElementUsablemetodo personalizzato. Quindi inizializzeresti la tua pagina con

public class YourPage{

   ...   

   public YourPage(...){
      PageFactory.initElements(new YourCustomLocatorFactory(...), this);
   }

   ...

}

Puoi trovare qui l'esempio completo di come attendere un determinato stato degli elementi dinamici degli oggetti della tua pagina senza utilizzare ExpectedConditionsutility .