【问题标题】:Selenium C# - click element, wait until page refreshes and check the element againSelenium C# - 单击元素,等到页面刷新并再次检查元素
【发布时间】:2019-06-05 05:19:45
【问题描述】:

我在网站上有一个元素,当它被点击时会改变它的文本。但是,当单击元素时,网页会刷新,并且只有在刷新元素文本后才会更改。我在 Selenium WebDriver C# 中创建了一个 POM 方法来测试这个功能:

public void ChangeLanguage(string language)
    {
        //Get current language and then change it
        this.executor.ExecuteScript("arguments[0].click();", currentLanguage);
        //Wait until page reloads and language change button is visible again
        wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.Id("language-change-link")));
    }

[Test]
        public void ChangeLanguage()
        {
            ExtentTest test = null;
            LoginPage loginPage = new LoginPage(_driver);
            ICapabilities driverCapabilities = ((RemoteWebDriver)_driver).Capabilities;
            string currentLanguage = null;

            try
            {
                //Create test
                test = extent.CreateTest("Change language").Info("Test started")
                    .Info("Browser:  " + (driverCapabilities.HasCapability("browserName") ? driverCapabilities.GetCapability("browserName") : "unknown") +
                    (driverCapabilities.HasCapability("version") ? " / " + driverCapabilities.GetCapability("version") : ""));

                //Get current language
                currentLanguage = loginPage.currentLanguage.Text;
                test.Log(Status.Info, "Currently selected language: " + currentLanguage);

                //Get current language and then change it
                loginPage.ChangeLanguage(currentLanguage);
                test.Log(Status.Info, "Switching languages...");

                switch (currentLanguage)
                {
                    //Current language is english
                    case "English":
                        try
                        {
                            Assert.AreEqual(loginPage.currentLanguage.Text, "German");
                            test.Log(Status.Pass, "Previously selected language: " + currentLanguage + ". New language: " + loginPage.currentLanguage.Text + ".");
                        }
                        catch (AssertionException)
                        {
                            test.Log(Status.Fail, "Language was not set! Expected language: German");
                            test.AddScreenCaptureFromPath(Reports.CaptureScreenshot(_driver, "CloudKiosk", "testScreenshot_" + DateTime.Now.Ticks));
                        }
                        break;
                    //Current language is german
                    case "German":
                        try
                        {
                            Assert.AreEqual(loginPage.currentLanguage.Text, "English");
                            test.Log(Status.Pass, "Previously selected language: " + currentLanguage + ". New language: " + loginPage.currentLanguage.Text + ".");
                        }
                        catch (AssertionException)
                        {
                            test.Log(Status.Fail, "Language was not set! Expected language: English");
                            test.AddScreenCaptureFromPath(Reports.CaptureScreenshot(_driver, "CloudKiosk", "testScreenshot_" + DateTime.Now.Ticks));
                        }
                        break;
                }
            }
            catch (Exception e)
            {
                test.Log(Status.Fail, "Test execution failed: " + e.Message + " ---> " + e.Message).CreateNode("Error details").Log(Status.Error, e.ToString());
                test.AddScreenCaptureFromPath(Reports.CaptureScreenshot(_driver, "CloudKiosk", "testScreenshot_" + DateTime.Now.Ticks));
                throw e;
            }
        }

问题是,一旦单击元素,网页就会刷新,但代码会在页面甚至刷新之前立即检查元素文本,从而给我一个否定的测试结果。有没有办法让测试在点击元素后等待网页刷新后再检查其文本?

【问题讨论】:

  • 最好的方法是等待当前元素变得陈旧。对此有一个 ExpectedCondition。一旦元素变得陈旧,您就知道页面已重新加载。现在您等待元素可见/可点击(无论您需要什么),然后继续您的测试。

标签: c# selenium-webdriver


【解决方案1】:

如果页面上有加载器,那么您可以先等待加载消失,然后检查文本,否则您可以等待带有旧文本的元素消失,然后等待带有新文本的元素。这里有一些代码可以让元素消失:

 var defaultWait = new WebDriverWait(this, TimeSpan.FromSeconds(30));
 defaultWait.Until(
                    ExpectedConditions.InvisibilityOfElementLocated(By.XPath((selector)))
                    );

【讨论】:

  • 点击元素后没有加载器,页面只是刷新。
  • 好的,那么您可以查找带有新文本的元素,我认为这将解决您的问题。
  • 谢谢,我修改了代码来检查文本是否改变了!
猜你喜欢
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 2014-06-23
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多