【问题标题】:Is there a way to check if page was reloaded with WebDriver (C#)?有没有办法检查页面是否使用 WebDriver (C#) 重新加载?
【发布时间】:2016-08-10 08:39:06
【问题描述】:

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

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% 的使用情况下正常工作? 或者也许有另一种方法来检查页面是否重新加载?

【问题讨论】:

    标签: c# selenium webdriver automated-tests


    【解决方案1】:

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

    【解决方案2】:

    可能有一些 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);
        }
    }
    

    【讨论】:

    • 那不会有帮助,如果我要等待所有 Ajax 完成,那么页面将被加载并准备好使用。我需要检查页面是否在重新加载时重新加载。
    • 您的情况与检查加载不同。为什么在“保存”按钮并检查它的断言之后没有找到应该存在的对象?
    • @MesutGüneş 问题是“保存”后的页面看起来与保存前完全相同。所以检查那个页面元素是否存在不会给我任何东西(这个元素的断言总是会找到它)。
    • 您说“单击会导致整个页面重新加载(重新加载后所做的更改将在页面上可见)”您可以检查此更改。或者检查数据库中应该发生的事情
    • 看来这对我来说是唯一的解决方案。数据库检查似乎是这种情况的唯一解决方案。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2011-06-26
      • 1970-01-01
      • 2023-04-04
      • 2022-11-10
      相关资源
      最近更新 更多