2012-11-27 3 views
6

Ich mache zum ersten Mal Selen-Tests. Auf der Homepage rufe ich AJAX an und ich möchte, dass Selenium auf das Laden des Elements wartet. Ich bin mir nicht sicher, ob es funktioniert, aber ich gebe einfach Selen ein und die waitForCondition kann wählen.Selenium waitForCondition

Ich egal, was ich wähle es immer "falsch" zurückgeben. Ich nicht jetzt, wenn die waitForCondition sogar arbeiten?

Wie kann ich testen, ob es funktioniert? Und was mache ich falsch in diesen Codes?

selenium.waitForCondition("//input[@name='Report'", "3000"); 
selenium.waitForCondition("//*[@id='MyTable']", "3000"); 
selenium.waitForCondition("css=.someClass2", "3000"); 

Wenn ich durch eigene Klasse implementieren - es zurückgeben "true"

private boolean isElementPresent(By by) { 
    try { 
     driver.findElement(by); 
     return true; 
    } catch (NoSuchElementException e) { 
     return false; 
    } 
} 

isElementPresent (By.xpath ("// * [@ id = 'MyTable']")) - return " true "

Antwort

3

waitForCondition ist nur für Javascript-Aufrufe gedacht, nicht zum Warten auf das Laden von Elementen.

Was Sie in isElementPresent haben, ist in Ordnung. Ich würde es mit expliziten wartet kombiniert ein bisschen genauer zu sein, wenn ein Element tatsächlich geladen wird und auf dem Bildschirm sichtbar:

http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

in Ordnung, diese Arbeit. Haben Sie ein Beispiel dafür, was Sie in JAVA verwenden. Ich denke, das ist viel Code, den ich jedes Mal schreiben muss, wenn ich es benutze. WebElement myDynamicElement = (neue WebDriverWait (Treiber, 10)). Bis (new ExpectedCondition () { \t \t \t \t @Override \t \t \t \t public WebElement gelten (WebDriver d) { \t \t \t \t \t Rückgabe d.findElement (By.id ("MyTable")); \t \t \t \t}}; ' – boje

+0

@ Arran diese Lösung funktioniert. Ich stimme es auf. Danke für die Lösung. – RNS

0

Aaran Sie Selenium WebDriver waits auf die richtige Dokumentation bezeichnet.

Sie können sehen, dass sie auch über ExpectedConditions-Klasse schreiben. Dies enthält mehrere hilfreiche Implementierungen von ExpectedCondition-Klassen, z. B. "is element present one" (ExpectedConditions.presenceOfElementLocated). Hier

ist ein Beispiel für die Verwendung es:

WebDriver driver = new ChromeDriver(); 
driver.get("http://www.degraeve.com/reference/simple-ajax-example.php"); 

driver.findElement(By.name("word")).sendKeys("bird is the word");; 
driver.findElement(By.cssSelector("input[type='button']")).click(); 
WebDriverWait driverWait = new WebDriverWait(driver, 10); 
WebElement dynamicElement = driverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#result p"))); 
System.out.println(dynamicElement.getText()); 

Wenn Sie es zu ausführlich zu finden, warum nicht Sie es gerade Refactoring und eine Funktion zu extrahieren, die das Element Locator akzeptieren und die WebDriver und kehrt Du das Element?

DriverWait.until() akzeptieren eine ExpectedCondition-Instanz ist wie eine Möglichkeit, eine Prädikatfunktion zu übergeben, nur durch eine Klasse oder im Dokumentationsbeispiel eine anonyme geschachtelte Klasse, da unter Java Sie keine Funktion senden können .

Die Funktion "ExpectedCondition", die Sie übergeben, gibt auch einen Wert zurück, der nützlich sein kann, wenn Sie auf eine Bedingung auf einem Element (oder einem anderen Wert vom WebDriver) warten Anruf.

+0

Aus irgendeinem Grund ist die _ExpectedConditions_ nicht bekannt. Text: ExpectedConditions kann nicht aufgelöst werden – boje

+0

Aus irgendeinem Grund habe ich nicht _org.openqa.selenium.support.ui.ExpectedConditions_ Wo kann ich die richtige JAR-Datei erhalten? Ich habe org.openqa.selenium.support.ui.ExpectedCondition (mit out "S" on) – boje

+0

Welche Version von Selen verwenden Sie? Ich testete den Code auf 2.25.0, durch Maven, aber es ist verfügbar zum Download unter http://seleniumhq.org/download/ –

1

Sie können es wie folgt tun:

selenium.waitForCondition("selenium.isElementPresent(\"//input[@name='Report']\")", "30000"); 

Das für das Element warten, bis 30 Sekunden geladen werden.

+0

Dies funktioniert nicht. Laut @Arran ist die _waitForCondition_ nur für Javascript-Aufrufe. Dies wird durch JAVA und IE8 getan. – boje

+0

Es sollte funktionieren .. Zum Testen Ajax-basierte Anwendung bevorzuge ich immer diese Methode .. Siehe diesen Link http://www.seleniumwiki.com/selenium-rc/using-selenium-waitforcondition/ –

1

Hoffnung das funktioniert für Sie

new WebDriverWait(driver, 30).until(new ExpectedCondition<Boolean>() { 
public Boolean apply(WebDriver driver) { 
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    return (Boolean) js.executeScript("return jQuery.active == 0"); 
} 

});

Dies überprüft, ob die jQuery-Bibliothek für 30 Sekunden aktive AJAX-Anforderungen hat.

2

C#

Sie können es wie folgt tun:

allererst Sie Timeout-Wert für den Zustand einstellen.

Dann können Sie die Bedingung verwenden.

var Wait = new WebDriverWait(GlobalDriver, TimeSpan.FromMinutes(1)); 
Wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("xPath")))); 

ODER

Wait.Until(driver => driver.FindElement(By.XPath("xPath"))); 

Das ist alles.

0

Probieren Sie dies einmal:

await().atMost(10, SECONDS).until(() -> driver.findElements(By.id("elementId")).size() >1);