2013-01-24 9 views
5

Ich sende einige Schlüssel zu einigen Eingabefeldern. Wenn der Fokus von diesem Element entfernt wird, wird eine Ajax-Anforderung an den Server gesendet, wenn dieser eingegebene Wert gültig ist. Wenn es ist, passiert nichts, wenn nicht eine Fehlermeldung auftritt. Es gibt einige dieser Felder.Selenium Ajax warten, wenn Ajax keine Elemente zurückgibt?

Wenn ich sage:

driver.findElementById(firstId).sendKeys(firstValue); 
driver.findElementById(secondId).sendKeys(secondValue); 

Der zweite Wert wird nicht auf das zweite Element gesendet werden, da es ein sehr kurzer Ajax-Request in der Zwischenzeit sein wird. Aber da der Wert ok (firstValue) ist, wird kein Text oder irgendetwas anderes angezeigt.

Wie kann ich Selenium sagen, auf diesen Ajax zu warten? Ich möchte Thread.sleep nicht verwenden.

+1

Sie können Selen implizite warten und explizite warten. – Manigandan

+0

@Manigandan Was ist implizit warten und Expilicit warten? –

Antwort

7

Selen wird nicht auf AJAX laden warten. Es wartet automatisch auf das Laden einer Seite. Um auf das Laden des AJAX-Typs zu warten, müssen Sie implizit und explizit warten.

Sie können implizites Warten und explizites Warten verwenden, um auf ein bestimmtes Webelement zu warten, bis es auf der Seite angezeigt wird. Die Wartezeit, die Sie definieren können, hängt von der Anwendung ab.

Explicit Warten:

eine explizite wartet ist Code, den Sie definieren, zu warten, bis eine bestimmte Bedingung, bevor Sie fortfahren weiter im Code auftreten. Wenn die Bedingung erfüllt ist, wird die Wartezeit beendet und die weiteren Schritte ausgeführt.

Code:

WebDriverWait wait = new WebDriverWait(driver,30); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(strEdit))); 

Oder

WebElement myDynamicElement = (new WebDriverWait(driver, 30)) 
.until(new ExpectedCondition<WebElement>(){ 
@Override 
public WebElement apply(WebDriver d) { 
return d.findElement(By.id("myDynamicElement")); 
}}); 

Diese wartet bis zu 30 Sekunden, bevor Sie einen Timeout werfen oder wenn es das Element findet kehrt es in 0-30 Sekunden. WebDriverWait ruft die ExpectedCondition standardmäßig alle 500 Millisekunden auf, bis sie erfolgreich zurückgegeben wird. Eine erfolgreiche Rückgabe ist für den ExpectedCondition-Typ Boolean return true oder nicht null return value für alle anderen ExpectedCondition-Typen.

Sie können die ExpectedConditions-Klasse verwenden, die Sie für die Anwendung benötigen.

Implizite Warten:

Eine implizite Warten ist WebDriver zu sagen, das DOM für eine gewisse Zeit abzufragen, wenn man versucht, ein Element oder Elemente zu finden, wenn sie

-Code nicht sofort verfügbar sind :

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

Eine Sache im Auge zu behalten ist, dass, sobald die implizite Warte gesetzt - es ist für die gesamte Lebensdauer des WebDriver obj bleiben Link Instanz ect

Für weitere Informationen verwenden http://seleniumhq.org/docs/04_webdriver_advanced.jsp

You can use these waits during your AJAX loading.

Ich hoffe, dass dies hilfreich sein wird.

+0

Danke. Also muss ich auf etwas Zeit warten? Weil der AJAX in meiner Situation kein Element sichtbar oder unsichtbar macht. –

+0

Ya right. Wenn diese Antwort Ihr Problem behebt, markieren Sie es als akzeptiert. – Manigandan

+0

Es ist nicht wirklich .. –

Verwandte Themen