9

好的,所以我有两个下拉列表。列表 B基于使用 Ajax 技术对列表 A所做的选择进行填充。

现在的问题是,一旦我从List A中选择了一个选项,我就无法看到List B已填充,因为 Ajax 需要花费大量时间来加载。我想知道如何在这种情况下使用等待条件来给 Ajax 足够的时间来加载。我是初学者,如果我的问题听起来很愚蠢,我很抱歉。但我真的被困了很久。

我不能使用:

WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id/xpath)));

因为 idxpath等始终保持不变,即使未填充列表也是如此。

4

4 回答 4

9

我建议两种方法,一种是等待 option Item x,另一种是等待 options count 大于一个。

所以尝试以下(未经测试的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;
  }
});
于 2013-07-07T10:05:42.407 回答
1

有一个 onchange 事件调用 populatesubcategory fn。这个 fn 应该做第二个列表加载。如果可用,您能否发布该功能的代码..可以根据它完成等待

于 2013-07-07T02:24:36.493 回答
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);
    }
于 2015-03-13T12:09:50.807 回答
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");
        }
于 2016-11-01T22:02:15.940 回答