【发布时间】: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