使用Delegates重构多个if else if语句

时间:2017-09-19 12:09:39

标签: c# selenium automation delegates

我写了一个基于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检查变量,但这并不是预期的行为。

2 个答案:

答案 0 :(得分:1)

你的代码很好!如果你只想稍微清理一下代码,你可以做一些事情。

  1. 你有两个选项(住宅和商业)的bool方法参数,但似乎只有两个选项。您可以将方法签名简化为一个bool for residential,如果为false,那么您知道其他选项是商业的。

  2. 我看到了一个IPage界面和一个驱动程序,所以我将假设您编写一个基于selenium的应用程序。您可以抽象出使用webdriver进行CSS查找的代码。看起来你已经有几个函数正在检查元素状态并单击一个按钮。你可以通过直接调用webdriver来缩小代码。

  3. 我不知道你在其他函数调用中做了什么,但假设它只是调用驱动程序方法你的代码可能是这样的:

    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);
    }