2016-09-02 3 views
0

У меня есть 2 Выберите объекты, после того, как значение выбрано первым, второе вызовет вызов ajax и обновит его значения. Такое поведение, похоже, не работать, используя селен со следующим кодом:Selenium Select object not airing Ajax Call

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

Результат печати всегда опции по умолчанию/значение («Выберите область» в моем случае).

Благодаря

+0

Я думаю, вам нужно создать ожидание, пока элемент не появится. Вызов ajax, скорее всего, будет запущен, но ваш код не дождался его результата. –

ответ

0

Я 2 Выберите объекты, после того, как значение выбирается первый один, второй один вызвать вызов AJAX и обновлять свои значения.

В этом случае вы должны попытаться использовать WebDriverWait подождать, пока <select> не имеет опции, как показано ниже: -

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

Edited: - Как вы знаете, выше код не будет ждать, пока параметры, присутствующие в окне выбора но если бы он нашел опцию в качестве опции по умолчанию, которая уже присутствует, это станет правдой, и вы все равно не найдете реальных опций.

В этом случае вы должны попытаться использовать numberOfElementsToBeMoreThan подождать, пока элемент представит более заданного числа, как показано ниже: -

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

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

Или вы можете подождать, пока Ajax вызова завершена, прежде чем найти второй выпадающее меню, как показано ниже: -

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

Спасибо за ваше предложение Saurabh. даже с этими изменениями, выбор не обновлялся. он отображает только элемент по умолчанию (Pleae select ....) – Aboullaite

+0

А, тогда вы должны попытаться использовать 'numberOfElementsToBeMoreThan', чтобы ждать, пока элемент окажется больше заданного числа. Попробуйте отредактировать ответ и дайте мне знать –

+0

Или вы также можете попытаться дождаться завершения ajax-звонка ... обновленный ответ .. :) –