是否有一种方法来检查页面是否被WebDriver (c#)重新加载

本文关键字:是否 WebDriver 新加载 加载 检查 一种 方法 | 更新日期: 2023-09-27 18:01:44

在我的一些项目中,为了正确保存表单,用户需要执行点击"保存"或"保存更改"按钮。该单击会导致整个页面重新加载(重新加载后页面上可以看到所做的更改),但如果出现错误,验证将阻止页面重新加载。我想创建一个简单的断言来检查页面是否被重新加载,如果没有,我的测试将失败。我尝试使用这个代码:

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次ok, 2次测试将失败)。是否有一种方法可以升级它,使其在100%的使用率下正常工作?或者可能有另一种方法来检查页面是否被重新加载?

是否有一种方法来检查页面是否被WebDriver (c#)重新加载

对于网页加载,不幸的是没有一个适合所有的解决方案。情况各不相同。如何在自动化套件中等待是非常关键的。显式等待是推荐的等待方式,而不是使用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文档

可能有一些Ajax调用是异步工作的。您可以等到ajax调用完成后,再处理您的case,见如下:

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);
    }
}

在我看来,你最好使用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;
    }

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