由于Ajax导致部分页面加载时无法在页面中等待

时间:2016-12-22 14:36:35

标签: selenium selenium-webdriver selenium-firefoxdriver

我在html的section标签中有一些控件,当ajax请求完成时,这些控件会加载。现在有一个场景,ajax已加载,但控件没有出现在页面上,我想停止代码执行,直到所有控件都被加载并在页面上可见。

如何识别页面上是否已加载所有控件。

我不想使用以下解决方案:

1)在代码中显式等待(因为我不知道何时加载控件)。

2)我不想使用wait.Until(ExpectedConditions.ElementIsVisible(By.Id(id)));(因为如果页面上没有特定控件,那么它将无限期地等待)

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:-1)

  1. 创建一个名为ExtensionMethods
  2. 的类
  3. 将以下方法添加到此类

    public static void WaitForPageToLoad(this IWebDriver driver) {     TimeSpan timeout = new TimeSpan(0,0,30);     WebDriverWait wait = new WebDriverWait(driver,timeout);

    IJavaScriptExecutor javascript = driver as IJavaScriptExecutor;
    if (javascript == null)
        throw new ArgumentException("driver", "Driver must support javascript execution");
    
    wait.Until((d) =>
    {
        try
        {
            string readyState = javascript.ExecuteScript(
            "if (document.readyState) return document.readyState;").ToString();
            return readyState.ToLower() == "complete";
        }
        catch (InvalidOperationException e)
        {
            //Window is no longer available
            return e.Message.ToLower().Contains("unable to get browser");
        }
        catch (WebDriverException e)
        {
            //Browser is no longer available
            return e.Message.ToLower().Contains("unable to connect");
        }
        catch (Exception)
        {
            return false;
        }
    });
    

    }

  4. 此代码将等待所有JavaScript加载。

    1. 在与页面上的元素交互之前使用此方法