好的,我有两个下拉列表。 List B 根据使用Ajax技术在 List A 上进行的选择进行填充。
现在的问题是,一旦我选择了一个选项表单 List A ,我就无法看到 List B 填充,因为Ajax需要花费大量时间加载。我想知道如何在这种情况下使用Wait条件为Ajax提供足够的时间来加载。我是初学者,所以如果我的问题听起来很愚蠢,我很抱歉。但我真的很坚持这一点。
我无法使用:
WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id/xpath)));
因为id,xpath
等始终保持不变,即使未填充列表也是如此。
答案 0 :(得分:8)
我建议使用两种方法,一种是等待选项Item x
,另一种方法是等待选项计数大于一。
请尝试以下方法(未经测试的Java代码,因此您可能需要稍微调试一下):
等待您想要的一个选项(通过其值或文本):
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));
或等待大于一的选项数
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;
}
});
答案 1 :(得分:1)
有一个onchange事件调用来填充子类别fn。这个fn应该是第二个列表加载。你可以发布该功能的代码(如果可用的话......等待可以基于它完成)
答案 2 :(得分:0)
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);
}
答案 3 :(得分:0)
使用JQuery检查未完成的ajax调用(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");
}