[英]Selenium Webdriver Switch/Case c#
[When(@"I click the Login button")]
public void WhenIClickTheLoginButton()
{
_driver.Click(ElementType.Id, VariableList.LoginButtonId); //Clicks login button first
string currentUrl = _driver.Url;
if (currentUrl == BaseUrls.HomepageUk)
{
_driver.AssertIsTrueByUrl(_driver.Url, BaseUrls.HomepageUk);
}
if (currentUrl == BaseUrls.LogonPageUk) //Takes into account erroneous login
{
_driver.AssertIsTrueByUrl(_driver.Url, BaseUrls.LogonPageUk);
}
if (currentUrl == BaseUrls.PromoPageUk) //Takes into account the possibility of a promotion being displayed
{
_driver.AssertIsTrueByUrl(_driver.Url, BaseUrls.PromoPageUk);
_driver.WaitForElementPresent(ElementType.Id, VariableList.PromoBanner);
_driver.AssertElementDisplayed(ElementType.Id, VariableList.PromoBanner);
_driver.AssertElementDisplayed(ElementType.XPath, VariableList.ContinueToHomepageButton);
_driver.Click(ElementType.XPath, VariableList.ContinueToHomepageButton);
}
}
我正在努力将其更改为case / switch语句,而不是使用多个if语句。 我多次使用类似的登录方法。
我希望这有帮助
switch (currentUrl)
{
case BaseUrls.HomepageUk
_driver.AssertIsTrueByUrl(_driver.Url, BaseUrls.HomepageUk);
break;
case BaseUrls.LogonPageUk
_driver.AssertIsTrueByUrl(_driver.Url, BaseUrls.LogonPageUk);
break;
case BaseUrls.PromoPageUk
_driver.AssertIsTrueByUrl(_driver.Url, BaseUrls.PromoPageUk);
_driver.WaitForElementPresent(ElementType.Id, VariableList.PromoBanner);
_driver.AssertElementDisplayed(ElementType.Id, VariableList.PromoBanner);
_driver.AssertElementDisplayed(ElementType.XPath, VariableList.ContinueToHomepageButton);
_driver.Click(ElementType.XPath, VariableList.ContinueToHomepageButton);
break;
}
阅读一些教程后,将if
语句转换为switch
应该非常简单。 但是...您的if
语句中存在一些逻辑问题,我认为应该在进行此操作之前先进行清理和简化。
一个例子:
if (currentUrl == BaseUrls.HomepageUk)
{
_driver.AssertIsTrueByUrl(_driver.Url, BaseUrls.HomepageUk);
}
上述断言什么时候会失败? 不会的 您实际上已经通过比较URL来完成断言,因此实际上不需要该断言,下一个或下一个断言。 您想要的是验证当前URL是否在3个URL的列表中。 您可以使用类似的switch
来执行此switch
[When(@"I click the Login button")]
public void WhenIClickTheLoginButton()
{
_driver.Click(ElementType.Id, VariableList.LoginButtonId); //Clicks login button first
switch (_driver.Url)
{
case BaseUrls.HomepageUk:
break;
case BaseUrls.LogonPageUk:
break;
case BaseUrls.PromoPageUk:
_driver.WaitForElementPresent(ElementType.Id, VariableList.PromoBanner);
_driver.AssertElementDisplayed(ElementType.Id, VariableList.PromoBanner);
_driver.AssertElementDisplayed(ElementType.XPath, VariableList.ContinueToHomepageButton);
_driver.Click(ElementType.XPath, VariableList.ContinueToHomepageButton);
break;
default:
// some assert that the URL is not one of the acceptable three
break;
}
}
您丢失的重要情况是实际上会导致故障的情况。 如果URL与三个不匹配怎么办? 您的if
不能解决这个问题,那就是default
情况下switch
。 default
情况包括比较是否与任何情况都不匹配。
因此,其工作方式是单击登录按钮,然后我们进入下一页。 我们获取该URL,并将其与两个URL进行比较。 如果它与任何一个都匹配,我们将退出开关,不执行任何操作。 如果它与BaseUrls.PromoPageUk
相匹配,那么我们将执行所需的步骤。 注意,在这三种情况下,我们都没有断言,因为没有必要。 我们知道测试会通过。 现在我们来看default
情况。 如果URL与以上3个都不匹配,则需要断言失败,因为我们登陆了意外页面。 我放置了一个注释占位符,因为您没有使用NUnit
或我熟悉的任何测试框架,所以我不知道如何在框架中对声明的代码进行编码。
这是您没有要求的其他建议... :)
您确实应该使用NUnit
或其他一些标准库。 我可以告诉您没有使用标准库,因为断言不应挂在_driver
引用上。 从NuGet中拿起NUnit,安装并使用它。 它带有您将需要的所有断言比较。 您不需要编写和测试自己的断言代码,也不需要这样做,因为它是由很多人建立和使用的。
由于很多原因,我通常不喜欢Click()
这样的通用方法,但如果要使用它,至少要传入By
定位符,这样就不必传入定位符的类型了,定位器。 使用此方法和您编写的其他方法,会使您的生活更加轻松。 例如
public static void Click(By locator) { _driver.FindElement(locator).Click(); }
您的VariableList
类看起来像
public static class VariableList { public static By LoginButtonId = By.Id("whateverTheIdIs"); }
你会这样称呼它
_driver.Click(VariableList.LoginButtonId)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.