如何在Selenium中填充下拉列表时等待Ajax调用

时间:2013-07-06 09:29:20

标签: selenium selenium-webdriver

好的,我有两个下拉列表。 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等始终保持不变,即使未填充列表也是如此。

4 个答案:

答案 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");
        }