2012-07-31 12 views
51

Ich bin auf der Suche nach etwas ähnlich zu waitForElementPresent, um zu überprüfen, ob Element angezeigt wird, bevor ich es anklicke. Ich dachte, das durch implicitWait getan werden kann, so habe ich die folgenden:WebDriver - warten auf Element mit Java

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

und klicken Sie dann auf von

driver.findElement(By.id(prop.getProperty(vName))).click(); 

Leider manchmal wartet sie auf das Element und manchmal nicht. Ich sah eine Weile und fand diese Lösung:

for (int second = 0;; second++) { 
      Thread.sleep(sleepTime); 
      if (second >= 10) 
       fail("timeout : " + vName); 
      try { 
       if (driver.findElement(By.id(prop.getProperty(vName))) 
         .isDisplayed()) 
        break; 
      } catch (Exception e) { 
       writeToExcel("data.xls", e.toString(), 
         parameters.currentTestRow, 46); 
      } 
     } 
     driver.findElement(By.id(prop.getProperty(vName))).click(); 

Und es wartete alles in Ordnung, aber bevor es eine Zeitüberschreitung musste 10 mal warten 5, 50 Sekunden. Ein bisschen viel. Also habe ich implizit auf 1sec gewartet und alles schien bis jetzt in Ordnung zu sein. Weil jetzt manche Dinge 10 Sekunden vor dem Timeout warten, aber einige andere Dinge nach 1 Sekunden.

Wie decken Sie das Warten auf Element, das in Ihrem Code vorhanden/sichtbar ist? Jeder Hinweis ist nennenswert.

Antwort

100

So mache ich es in meinem Code.

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

oder

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

genau zu sein. auch

Siehe:

+1

Vielen Dank! Wenn ich nur früher über diese Klasse wüsste, wäre mein Leben einfacher :) – tom

+0

Wie integriere ich Ihren Code in dieses Format?\t '@FindBy (wie = How.ID, mit =" Anmelde-Button ") \t WebElement signUpButton;' Darüber hinaus bekomme ich immer noch eine NPE mit Ihrem Code. Sieht so aus, als ob es versucht, elementToBeClickable zu erhalten. Wie können wir diese Methode verwenden, wenn das Element nicht geladen ist? – HelloWorldNoMore

-1

Oben warte Aussage ist ein schönes Beispiel für Explicit warten.

Als Explicit Waits sind intelligente Wartezeiten, die auf ein bestimmtes Webelement beschränkt sind (wie oben in x-path erwähnt).

Mit Explicit Waits geben Sie WebDriver im Allgemeinen an, dass es maximal auf X-Einheiten (was auch immer Sie als timeoutInSeconds angegeben haben) wartet, bevor es aufgibt.

+2

Fügen Sie Ihrer Antwort ein Code-Snippet hinzu, da andere Benutzer die Antworten möglicherweise anders sortieren und sich der Kontext für "Above" ändern kann. –

3

können Sie explizite wait verwenden oder Fluent Warten

Beispiel Explicit Wait -

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20); 
WebElement aboutMe; 
aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me")));  

Beispiel Fluent Wait -

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

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

prüfen diese TUTORIAL für weitere Details.

1

Wir haben viele Wettlaufbedingungen mit elementToBeClickable. Siehe https://github.com/angular/protractor/issues/2313. Etwas in dieser Richtung funktionierte einigermaßen gut, auch wenn ein wenig roher Gewalt

Awaitility.await() 
     .atMost(timeout) 
     .ignoreException(NoSuchElementException.class) 
     .ignoreExceptionsMatching(
      Matchers.allOf(
       Matchers.instanceOf(WebDriverException.class), 
       Matchers.hasProperty(
        "message", 
        Matchers.containsString("is not clickable at point") 
       ) 
      ) 
     ).until(
      () -> { 
       this.driver.findElement(locator).click(); 
       return true; 
      }, 
      Matchers.is(true) 
     ); 
Verwandte Themen