2016-09-02 2 views
0

Ich habe 2 Objekte auswählen, nach einem Wert der erste ausgewählt ist, der zweite einen Ajax-Aufruf auslösen und seine Werte aktualisieren. Dieses Verhalten scheint nicht funktionieren Selen mit dem folgenden Code:Selen Wählen Objekt nicht feuern Ajax Anruf

driver.get("MyURL"); 
WebElement regionElement = driver.findElement(By.id("FirstID")); 
Select dropDownRegion = new Select(regionElement); 
dropDownRegion.selectByValue("myValue"); 
WebElement provinceElement = driver.findElement(By.id("DDLProvince")); 
Select dropDownProvince = new Select(provinceElement); 
for(WebElement optionProvince :dropDownProvince.getOptions()) { 
    System.out.println("*****************Province: " + optionProvince.getText() + " *************"); 
} 

Das Ergebnis des Drucks immer die Standardoption/Wertes („Bitte wählen Sie eine Provinz“ in meinem Fall).

Dank

+0

Ich denke, Sie müssen eine Wartezeit erstellen, bis das Element dort ist. Der Ajax-Aufruf wird höchstwahrscheinlich ausgelöst werden, aber Ihr Code wartet nicht darauf –

Antwort

0

Ich habe 2 Objekte auswählen, nach einem Wert der erste ausgewählt ist, einen Ajax-Aufruf der zweiten auslösen und ihre Werte aktualisieren.

In diesem Fall Sie WebDriverWait verwenden versuchen sollten, zu warten, bis <select> Optionen wie unten: -

Select dropDownRegion = new Select(driver.findElement(By.id("FirstID"));); 
dropDownRegion.selectByValue("myValue"); 

WebDriverWait wait = new WebDriverWait(driver, 10); 

//Now wait for nested options for this select element 
List<WebElement> optionProvinces = wait.until(ExpectedConditions.presenceOfNestedElementsLocatedBy(By.id("DDLProvince"), By.tagName("option"))); 

for(WebElement optionProvince : optionProvinces) { 
     System.out.println("*****************Province: " + optionProvince.getText() + " *************"); 
} 

Editiert: - Wie Sie wissen obigen Code wird bis Optionen in der Auswahlbox warten würde es jedoch eine Option als Standardoption finden, die bereits vorhanden ist, würde dies zutreffen und Sie würden immer noch keine tatsächlichen Optionen finden.

In diesem Fall Sie numberOfElementsToBeMoreThan verwenden versuchen sollten, wie unten, bis Element präsentiert mehr als gegebene Zahl warten: -

List<WebElement> optionProvinces = wait.until(ExpectedConditions.numberOfElementsToBeMoreThan(By.cssSelector("select#DDLProvince option"), 2)); 

for(WebElement optionProvince : optionProvinces) { 
     System.out.println("*****************Province: " + optionProvince.getText() + " *************"); 
} 

Oder Sie können auch bis Ajax-Aufruf vollständig warten, bevor zweite Dropdown wie unten zu finden: -

Select dropDownRegion = new Select(driver.findElement(By.id("FirstID"));); 
dropDownRegion.selectByValue("myValue"); 

WebDriverWait wait = new WebDriverWait(driver, 10); 

//Now wait until ajax call complete 
wait.until(new ExpectedCondition<Boolean>() { 
    public Boolean apply(WebDriver driver) { 
     JavascriptExecutor js = (JavascriptExecutor) driver; 
     return (Boolean)js.executeScript("return jQuery.active == 0"); 
}}; 

//Now find the second dropdown 
Select dropDownProvince = new Select(driver.findElement(By.id("DDLProvince"));); 
for(WebElement optionProvince : dropDownProvince.getOptions()) { 
    System.out.println("*****************Province: " + optionProvince.getText() + " *************"); 
} 
+0

Danke für Ihren Vorschlag Saurabh. Selbst mit diesen Änderungen wurde die Auswahl nicht aktualisiert. es zeigt nur das Standardelement (Pleae select ....) – Aboullaite

+0

Ah, dann sollten Sie versuchen mit 'numberOfElementsToBeMoreThan' zu warten, bis das Element mehr als die angegebene Anzahl vorhanden ist. Versuchen Sie mit bearbeiteter Antwort und lassen Sie es mich wissen –

+0

Oder Sie können auch versuchen zu warten, bis Ajax Anruf abgeschlossen .. Siehe aktualisierte Antwort .. :) –