我写了一个基于true / false条件选择过滤器(两个或多个)的方法.Below是我用来选择多个过滤器的方法。
public T SetPropertyTypes<T>(bool residential, bool commercial) where T : IPage, new()
{
// Residential Property Type Check logic
if (residential && (ElementIsNotActive(() => FindElement(By.CssSelector(propertyTypeResidentialCss))).Invoke(Driver)))
ClickButton(() => FindElement(By.CssSelector(propertyTypeResidentialCss)), "Residential");
else if (ElementIsActive(() => FindElement(By.CssSelector(propertyTypeResidentialCss))).Invoke(Driver))
ClickButton(() => FindElement(By.CssSelector(propertyTypeResidentialCss)), "Residential");
// Commercial Property Type Check logic
if (commercial && (ElementIsNotActive(() => FindElement(By.CssSelector(propertyTypeCommercialCss))).Invoke(Driver)))
ClickButton(() => FindElement(By.CssSelector(propertyTypeCommercialCss)), "Commercial");
else if (ElementIsActive(() => FindElement(By.CssSelector(propertyTypeCommercialCss))).Invoke(Driver))
ClickButton(() => FindElement(By.CssSelector(propertyTypeCommercialCss)), "Commercial");
}
后来我发现代码是冗余的,如果我把它变得更简单和不模糊可能会更好。我是C#的新手,我不知道很多功能,有什么办法吗?使用C#的任何功能重构这个?
我尝试使用if-else-if检查变量,但这并不是预期的行为。
答案 0 :(得分:1)
你的代码很好!如果你只想稍微清理一下代码,你可以做一些事情。
你有两个选项(住宅和商业)的bool方法参数,但似乎只有两个选项。您可以将方法签名简化为一个bool for residential,如果为false,那么您知道其他选项是商业的。
我看到了一个IPage界面和一个驱动程序,所以我将假设您编写一个基于selenium的应用程序。您可以抽象出使用webdriver进行CSS查找的代码。看起来你已经有几个函数正在检查元素状态并单击一个按钮。你可以通过直接调用webdriver来缩小代码。
我不知道你在其他函数调用中做了什么,但假设它只是调用驱动程序方法你的代码可能是这样的:
public void SetPropertyTypes(bool residential)
{
IWebElement _resident = Driver.FindElement(By.CssSelector(propertyTypeResidentialCss));
IWebElement _commercial = Driver.FindElement(By.CssSelector(propertyTypeCommercialCss));
// Residential Property Type Check logic
if (residential || _resident.Enabled ) // or _resident.Displayed depending on what you are doing
_resident.Click();
else
_commercial.Click();
}
希望这有帮助!
答案 1 :(得分:1)
没有太多细节,简单的重构看起来像这样:
public T SetPropertyTypes<T>(bool residential, bool commercial) where T : IPage, new()
{
TryClick(residental, propertyTypeResidentialCss, "Residential");
TryClick(commercial, propertyTypeCommercialCss, "Commercial");
}
private void TryClick(bool clickIfNotActive, object propType, string btnName)
{
var elem = FindElement(By.CssSelector(propType));
bool isActive = ElementIsActive(() => elem).Invoke(Driver);
if (clickIfNotActive && !isActive || isActive)
ClickButton(() => elem, btnName);
}