2012-03-28 31 views
8

Desidero ottenere l'eccezione del caricamento della pagina, ma non ho ancora risultati. Uso implicitamente Attendi per impostare il timer per generare un'eccezione.Java WebDriver attende il caricamento della pagina

WebDriver driver = new FirefoxDriver(); 
driver.manage().timeouts().implicitlyWait(1, TimeUnit.MILLISECONDS); 
driver.get("http://www.rambler.ru"); 
driver.quit(); 

Qualcuno può aggiornarmi con suggerimenti? Ho bisogno di questo per assicurarmi che il caricamento della pagina non sia infinito, e se il tempo di caricamento sarà maggiore di quello che ho definito nel timer -> genera un'eccezione come risultato e salta TC (come fallito).

Grazie, Volodymyr

risposta

17

Perché stai usando attesa implicita prima dell'apertura della pagina? Prova ad usare l'attesa esplicita. Trova alcuni elementi principali della pagina in ramber (ad esempio, la casella di testo di ricerca). Ad esempio:

WebDriverWait wait = new WebDriverWait(webDriver, 5); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_to_search_textbox"))); 

until() il metodo getterà TimeoutException se la casella di testo di ricerca non verrà visualizzata entro 5 secondi.

+0

Grazie per il tuo suggerimento, correggimi se ho torto, mi suggerisci di usare wait for element dopo driver.get ("http://www.rambler.ru"); ma WebDriver aspetterà fino a quando driver.get() non finirà il caricamento della pagina e andrà ad aspettare nell'elemento? Il web reader –

+0

attende sempre il caricamento della pagina. Forse ho sbagliato comprensione della tua domanda. In questo caso puoi usare il timer che avvierà il conteggio quando invochi get ("rambler.ru") e lancia tu stesso TimeoutException se il tempo di caricamento è superiore a 30 secondi (per esempio) –

+0

Voglio dire che: http: // stackoverflow .com/a/6107997/1165331 –

0

Non sono d'accordo che Pavel Zorins risposta funzionerà perché non mostra come gestire le eccezioni.

Ecco come faccio ad aspettare un iFrame. Ciò richiede che la vostra classe di test JUnit passare l'istanza di RemoteWebDriver nell'oggetto pagina:

public class IFrame1 extends LoadableComponent<IFrame1> { 

    private RemoteWebDriver driver; 

    @FindBy(id = "iFrame1TextFieldTestInputControlID") 
    public WebElement iFrame1TextFieldInput; 

    @FindBy(id = "iFrame1TextFieldTestProcessButtonID") 
    public WebElement copyButton; 

    public IFrame1(RemoteWebDriver drv) { 
     super(); 
     this.driver = drv; 
     this.driver.switchTo().defaultContent(); 
     waitTimer(1, 1000); 
     this.driver.switchTo().frame("BodyFrame1"); 
     LOGGER.info("IFrame1 constructor..."); 
    } 

    @Override 
    protected void isLoaded() throws Error {   
     LOGGER.info("IFrame1.isLoaded()..."); 
     PageFactory.initElements(driver, this); 
     try { 
      assertTrue("Page visible title is not yet available.", driver 
    .findElementByCssSelector("body form#webDriverUnitiFrame1TestFormID h1") 
        .getText().equals("iFrame1 Test")); 
     } catch (NoSuchElementException e) { 
      LOGGER.info("No such element."); 
      assertTrue("No such element.", false); 
     } 
    } 

    @Override 
    protected void load() { 
     LOGGER.info("IFrame1.load()..."); 
     Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
       .withTimeout(30, TimeUnit.SECONDS) 
       .pollingEvery(5, TimeUnit.SECONDS) 
       .ignoring(NoSuchElementException.class) 
       .ignoring(StaleElementReferenceException.class) ; 
      wait.until(ExpectedConditions.presenceOfElementLocated( 
      By.cssSelector("body form#webDriverUnitiFrame1TestFormID h1"))); 
    } 
.... 

NOTA: È possibile see my entire working example here.

Problemi correlati