2017-07-26 3 views
1

Ich weiß, dass, nach einigen Meinungen, im perfekten Fall sollte ich nicht implizite Wartezeit verwenden. Aber ich habe eine langsame Benutzeroberfläche; Es wäre ein ziemlich großes Unterfangen, allen Orten, an denen Rendering stattfinden kann, explizite Wartezeiten hinzuzufügen. Eine standardmäßige implizite Wartezeit von 20 Sekunden, die bei der Treiberinitialisierungszeit festgelegt wird, deckt 80% des Wartens perfekt ab.Ändern Selen implizit warten innerhalb Testprozess

Aber dann muss ich die restlichen 20% behandeln. Manchmal muss ich warten, bis ein Element verschwindet - und die implizite Wartezeit bedeutet in diesem Fall zusätzliche 20 Sekunden. Und manchmal muss ich nach dem Vorhandensein eines Elements suchen, aber nicht auf alle 20 Sekunden warten (weil das Element im normalen Ausführungsfluss oft nicht vorhanden ist).

Also, ich möchte natürlich vorübergehend die implizite Wartezeit deaktivieren:

driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); 
new WebDriverWait(driver, MY_TIMEOUT)).until(ExpectedConditions.WHATEVER_I_NEED); 
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 

Aber wird diese stabil sein? Oder ändert sich das implizite Warten (in diesem Fall von 20 auf Null und zurück auf 20) irgendwie gefährlich?

+1

Perfekt gültig für diese. Noch wichtiger ist die korrekte Art, implizite und explizite Wartezeiten zu vermischen. Diese Mischung von Wartezeiten führt zu einigen schwer zu debuggenden Problemen mit langen Wartezeiten. Problem ist, dass Sie vergessen könnten, das implizite Warten ein- und auszuschalten. Es empfiehlt sich, eine Dienstprogrammfunktion zu schreiben, um diese Logik zu umbrechen, indem Sie das Kriterium für das explizite Warten übergeben und es in Ihrer Codebasis verwenden. – Grasshopper

+0

@Grasshopper könnten Sie dies zu einer Antwort machen? –

Antwort

0

Perfekt gültig, um dies zu tun. Noch wichtiger ist die korrekte Art, implizite und explizite Wartezeiten zu vermischen. Diese Mischung von Wartezeiten führt zu einigen schwer zu debuggenden Problemen mit langen Wartezeiten. Problem ist, dass Sie vergessen könnten, das implizite Warten ein- und auszuschalten. Es empfiehlt sich, eine Dienstprogrammfunktion zu schreiben, um diese Logik zu umbrechen, indem Sie das Kriterium für das explizite Warten übergeben und es in Ihrer Codebasis verwenden.

Ich habe einen Stich bei der Erstellung einer generischen Methode zu verwenden. Obwohl generische ist nicht meine Stärke.

protected static <T> T waitECTimeoutWrapped(WebDriver driver, ExpectedCondition<T> ec, int timeout) { 
    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); 
    WebDriverWait wait = new WebDriverWait(driver, timeout); 
    T data = waitDriver.until(ec); 
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 
    return data; 
} 

Sie können die Rückgabedaten für viele Fälle ignorieren aber auf diese Weise können Sie Elemente abrufen, die Sie in einem Aufruf suchen werden.

0

Wenn die Benutzeroberfläche langsam ist, was ist mit dem Hinzufügen eines Kellners, der wartet, bis die Seite vollständig geladen ist? Unten ist, was ich tue, um sicherzustellen, dass die Seite vollständig geladen ist.

public static void waitForDomToComplete(WebDriver driver) { 
    FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
      .withTimeout(60, TimeUnit.SECONDS) 
      .pollingEvery(700, TimeUnit.MILLISECONDS) 
      .withMessage("Time out is reached. Page is not loaded!"); 

    wait.until(new ExpectedCondition<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver driver) { 
      JavascriptExecutor js = (JavascriptExecutor) driver; 
      String domLoadStatus = (String) js.executeScript("return document.readyState"); 
      if (domLoadStatus.equals("complete")) { 
       return true; 
      } else { 
       return false; 
      } 
     } 
    }); 
} 
+0

UI-Engine unterstützt document.readyState nicht; Auch die Benutzeroberfläche ist dynamisch, sodass auch außerhalb des Szenarios "navigation clicked, page loading" gerendert wird. Theoretisch könnte ich das implizite Warten loswerden und die meisten Aufrufe von findElement/findElements durch Utility-Versionen ersetzen, die im Prinzip eine implizite Wartezeit reproduzieren, aber das würde noch viel Arbeit sein. –

+0

Verstanden. Gibt es eine Jquery oder eckige in der Benutzeroberfläche? – sen4ik

+0

Ich glaube nicht, und ich habe versucht, die Jquery-Methode und es hat nicht funktioniert. Es gibt Dijit in einer der UIs, die ich gerade teste; bin mir nicht sicher über den anderen. –