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() + " *************");
}
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 –