有没有办法检查页面是否重新加载了WebDriver(C#)?

时间:2016-08-10 08:39:07

标签: c# selenium webdriver automated-tests

在我的一些项目中,要正确保存表单,用户需要执行单击“保存”或“保存更改”按钮。该单击导致整个页面重新加载(完成更改将在重新加载后的页面上显示),但如果出现错误,验证将阻止页面重新加载。 我想创建一个简单的断言来检查该页面是否重新加载,如果不是,我的测试将失败。我试着使用这段代码:

public bool WasPageRefreshed(float seconds)
{
    DriverLocal.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.MinValue);
    string getReadyState = "return document.readyState;";

    for (int i = 0; i < 10; i++)
    {
        string readyState = GetJsExecutor().ExecuteScript(getReadyState) as string;
        if (readyState != "complete")
            return true;
        Thread.Sleep(TimeSpan.FromMilliseconds(seconds / 10));
    }

    DriverLocal.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(60));
    return false;
}

我在Assert.True()中使用它来检查页面是否重新加载但是它总是不起作用(我可以在同一个表单上使用它5次 - 确定3次,2次测试将失败)。 有没有办法升级它以100%的使用率正常工作? 或者可能有另一种方法来检查页面是否重新加载?

3 个答案:

答案 0 :(得分:0)

可能有一些Ajax调用是异步的。你可以等到ajax调用结束,然后再做你的情况,看看:

public void WaitForAjax()
{
    while (true) // break if ajax return false
    {
        var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
        if (ajaxIsComplete)
            break;
        Thread.Sleep(100);
    }
}

答案 1 :(得分:0)

正如我的观点,你最好使用SeleniumWait而不是Sleep。试试这个

        public bool WasPageRefreshed(double seconds)
    {
        WebDriverWait wait = new WebDriverWait(DriverLocal, TimeSpan.FromSeconds(seconds));
        wait.PollingInterval = TimeSpan.FromSeconds(1);
        string getReadyState = "return document.readyState;";
        try
        {
            wait.Until(d =>
            {
                string readyState = GetJsExecutor().ExecuteScript(getReadyState) as string;
                if (readyState == "complete")
                    return true;
            });
        }
        catch (Exception)
        {
        }
        return false;
    }

我建议您等待标记刷新页面状态的特定元素。

答案 2 :(得分:0)

对于网页加载,遗憾的是没有一种尺寸适合所有解决方案。每种情况都不一样您如何在自动化套件中等待非常关键。显式等待是推荐的等待方式,而不是使用Javascript选项,您可以在页面加载后等待新元素或等待某个元素不可见,告诉您页面已加载

 new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut))
.Until(ExpectedConditions
.ElementExists((By.Id("new Element Id"))));

 new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut))
.Until(ExpectedConditions
.InvisibilityOfElementLocated((By.Id("old Element Id"))));

您可以查看ExpectedElements docs here