2013-04-15 12 views
5

Nel codice di webdriver se utilizzo thread.sleep(20000). Aspetta 20 secondi e anche il mio codice funziona correttamente. Per archiviare lo stesso se io uso attesa implicita comewebdriver implicitAttendere il funzionamento come previsto

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

Non sta aspettando con forza per 20 secondi e va a passi successivi solo in 3 o 4 secondi. e la pagina si sta ancora caricando.

Questa è la situazione cablata mentre sto usando una fluente attesa per trovare alcuni elementi. se gli elementi ancora caricati nella pagina non mostrano errori e fanno passare il test.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
    .withTimeout(50, TimeUnit.SECONDS) 
    .pollingEvery(5, TimeUnit.SECONDS) 
    .ignoring(NoSuchElementException.class); 

WebElement foo = wait.until(new Function<WebDriver, WebElement>() { 
    public WebElement apply(WebDriver driver) { 
    return driver.findElement(By.id("jxxx")); 
    } 
}); 

Ma se dico id sbagliato attende per 50 secondi, ma altri test ottenuto superato senza fare clic .. è non mostrando alcun errore.

mia domanda è come devo evitare Thread.sleep() come altri metodi di selenio non mi stanno aiutando ..

+0

grazie per aver esaminato questo @JimEvans, ho modificato il mio codice e ora sto usando solo un'attesa fluente, ma non ci sono errori e non faccio nulla. – user2254173

risposta

3

Usa di seguito il metodo di attesa per un elemento:

public boolean waitForElementToBePresent(By by, int waitInMilliSeconds) throws Exception 
{ 

    int wait = waitInMilliSeconds; 
    int iterations = (wait/250); 
    long startmilliSec = System.currentTimeMillis(); 
    for (int i = 0; i < iterations; i++) 
    { 
     if((System.currentTimeMillis()-startmilliSec)>wait) 
      return false; 
     List<WebElement> elements = driver.findElements(by); 
     if (elements != null && elements.size() > 0) 
      return true; 
     Thread.sleep(250); 
    } 
    return false; 
} 

E sotto metodo è quello di aspettare per la pagina carico:

public void waitForPageLoadingToComplete() throws Exception { 
    ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() { 
     public Boolean apply(WebDriver driver) { 
      return ((JavascriptExecutor) driver).executeScript(
        "return  document.readyState").equals("complete"); 
     } 
    }; 
    Wait<WebDriver> wait = new WebDriverWait(driver, 30); 
    wait.until(expectation); 
} 

Supponiamo che tu stia aspettando il caricamento di una pagina. Quindi chiama il 1 ° metodo con il tempo di attesa e qualsiasi elemento che appare dopo il caricamento della pagina, quindi restituirà true, altro saggio false. Utilizzarlo come,

waitForElementToBePresent(By.id("Something"), 20000) 

La detta funzione sopra attende finché non trova l'elemento dato entro data durata.

Prova una di codice di seguito dopo che il metodo sopra

WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>)); 

o

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>)); 

Aggiornamento:

public boolean waitForTextFiled(By by, int waitInMilliSeconds, WebDriver wdriver) throws Exception 
    { 
     WebDriver driver = wdriver; 
     int wait = waitInMilliSeconds; 
     int iterations = (wait/250); 
     long startmilliSec = System.currentTimeMillis(); 
     for (int i = 0; i < iterations; i++) 
     { 
      if((System.currentTimeMillis()-startmilliSec)>wait) 
       return false; 
      driver.findElement(By.id("txt")).sendKeys("Something"); 
      String name = driver.findElement(by).getAttribute("value"); 

      if (name != null && !name.equals("")){ 
       return true; 
      } 
      Thread.sleep(250); 
     } 
     return false; 
    } 

Questo cercherà il testo di entrare dentro al campo di testo fino a un dato momento in Millis. Se non è adatto nel tuo caso usa getText(). Se il testo è eneterizzato, restituisce true. Metti il ​​tempo massimo che puoi aspettare fino a quando.

+0

Grazie per la risposta. ma il problema è se la pagina è ancora in condizione di caricamento, non so come il conducente trova tutti i locatori. e fai passare il test. Ma in realtà non entra o fa clic su nessun elemento. Ma se metto Thread.sleep, aspetta e riempie e clicca sugli elementi. caricamento della pagina perfettamente solo Ho inserito thread.sleep()  – user2254173

+0

il driver trova il localizzatore quando i rispettivi elementi sono visibili solo.Devi aspettare fino a quando una pagina è stata caricata correttamente e completamente. Quindi solo tutti gli elementi sono visibili e possono essere identificati dal conducente con i locatori di elementi appropriati. vedi la mia modifica. – user2087450

+0

Ho usato il codice. E la sua attesa di elemento da presentare, Ma solo e solo se metto thread.sleep() il suo testo di scrittura nella casella di input (in quell'elemento). come elemento è caricato alraedy perché non sta scrivendo ??? waitForElementToBePresent (By.id ("txt"), 20000); driver.manage() finestra() massimizzare()..; Thread.sleep (10000); driver.findElement (By.id ("txt")) Sendkeys ("testo").; – user2254173

0

Si potrebbe desiderare di provare questo affinché un elemento diventi visibile sullo schermo.

new WebDriverWait(10, driver).until(ExpectedConditions.visibilityOfElementLocated(By.id("jxxx")). 

In questo caso, il tempo di attesa è un massimo di 10 secondi.

+0

Grazie per la risposta. ma il problema è se la pagina è ancora in condizione di caricamento, non so come il conducente trova tutti i locatori. e fai passare il test. Ma in realtà non entra o fa clic su nessun elemento. Ma se metto Thread.sleep, aspetta e riempie e clicca sugli elementi. caricamento della pagina perfettamente solo Ho inserito thread.sleep() 23 – user2254173

+0

Vedo che stai aspettando che l'elemento sia presente. Controllare che l'elemento sia presente guarda se l'elemento è caricato nel DOM, se ancora visibile o meno. Aspettare che l'elemento diventi visibile è la cosa giusta da fare. –

Problemi correlati