chrome - Cómo esperar que una llamada Ajax funcione para completar una lista desplegable en Selenium
selenium webdriver python (4)
Hay una llamada de evento onchange a populatesubcategory fn. Este fn shud estar haciendo la carga de la segunda lista. ¿Puedes publicar el código para esa función si está disponible ... Se puede esperar basándose en eso
Ok, tengo dos listas desplegables. La Lista B se llena según la selección realizada en la Lista A utilizando la tecnología Ajax.
Ahora el problema es que una vez que selecciono una opción de la Lista A , no puedo ver la Lista B poblada ya que Ajax tarda mucho tiempo en cargar. Quiero saber cómo usar la condición de espera en este escenario para darle a Ajax el tiempo suficiente para cargar. Soy un principiante, así que lo siento si mi pregunta suena estúpida. Pero estoy realmente atrapado en esto por mucho tiempo.
No puedo usar:
WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id/xpath)));
porque id, xpath
, etc. permanece igual siempre, incluso cuando la lista no está poblada.
Sugeriría dos enfoques, uno está esperando la opción Item x
, de otra manera está esperando que el conteo de opciones sea mayor que uno.
Por lo tanto, intente lo siguiente (código Java no probado, por lo que es posible que deba depurar un bit):
Espere una opción que desee (ya sea por su valor o por el texto):
By byValue = By.cssSelector("#alertSubCatSelectBox > option[value=''18222216517'']");
//By byText = By.xpath("//select[@id=''alertSubCatSelectBox'']/option[text()=''Item x'']");
new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(byValue));
O espere a que las opciones cuenten más de una
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(new ExpectedCondition<Boolean>() {
public Boolean hasMoreThanOneOptions(WebDriver driver) {
return driver.findElements(By.cssSelector("#alertSubCatSelectBox option")).size() > 1;
}
});
usando JQuery para verificar si hay llamadas ajax que no están completas (C #)
public void WaitForAjaxComplete(int maxSecondsToWait = 20)
{
var maxHundrethSeconds = maxSecondsToWait * 10;
for (int i = 1; i <= maxHundrethSeconds; i++)
{
bool isAjaxCompete = false;
isAjaxCompete = (bool)((IJavaScriptExecutor)driver).ExecuteScript("return window.jQuery != undefined && jQuery.active == 0");
if (isAjaxCompete)
{
return;
}
System.Threading.Thread.Sleep(100);
}
throw new Exception("Timed out after " + maxHundrethSeconds + " seconds");
}
public static void AvoidDropDownDelay(this IWebDriver driver, IWebElement element)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(d =>
{
try
{
if (element.Displayed)
return true;
}
catch (NoSuchElementException)
{
return false;
}
return false;
});
var randomOption = new Random();
wait.Until(d => element.FindElements(By.TagName("option")).Count > 1);
const int startOption = 1;
var endOption = element.FindElements(By.TagName("option")).Count;
var randomNumber = startOption + randomOption.Next(endOption - startOption);
var select = new SelectElement(element);
select.SelectByIndex(randomNumber);
}