【问题标题】:Use Switch for element instead of if/elseif使用 Switch 代替 if/elseif
【发布时间】:2016-01-13 14:37:36
【问题描述】:
public void profileSection(String displayName, String fName, String lName, String Address_1,) throws Exception
{
    myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
    clickLink(CONSTANTs.MY_PROFILE_SECTION);        

    if(driver.findElement(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX)).isDisplayed())
    {
        log.step("Optional..... BUT you will need it when Commenting on any article....");
        elementPresent_Click(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX), displayName);
        Thread.sleep(2000);
    }else if(driver.findElement(By.cssSelector(CONSTANTs.MYACCT_EMAIL_TXTBOX)).isDisplayed())
    {
        log.step("Check if Email txtbox is enabled or not...... pls wait.");
        txtBoxDisabled(By.cssSelector(CONSTANTs.MYACCT_EMAIL_TXTBOX),null);
        Thread.sleep(2000); 
        log.step("Text box is disabled..... move to next step");
        Thread.sleep(2000);
    }else if(driver.findElement(By.cssSelector(CONSTANTs.FIRST_NAME)).isDisplayed())
    {
        log.step("Input First Name......");
        txtBoxDisabled(By.cssSelector(CONSTANTs.FIRST_NAME),fName);
        Thread.sleep(2000);
    }else if(driver.findElement(By.cssSelector(CONSTANTs.LAST_NAME)).isDisplayed())
    {
        log.step("Input Last Name......");
        txtBoxDisabled(By.cssSelector(CONSTANTs.LAST_NAME),lName);
        Thread.sleep(2000);
    }else if(driver.findElement(By.cssSelector(CONSTANTs.ADDRESS_1)).isDisplayed())
    {
        log.step("Input Address 1......");
        txtBoxDisabled(By.cssSelector(CONSTANTs.ADDRESS_1),Address_1);
        Thread.sleep(2000);
    }
        log.step("Click Save Changes Button......");
        txtBoxDisabled(By.cssSelector(CONSTANTs.SAVE_CHANGES_BTN),null);            
    }

请尝试使用开关而不是过多的 if 语句。只是为了让我的代码更具可读性。由于 switch 评估单个变量,我可以在我的代码中使用 switch,因为我猜它看起来有点复杂。 请提出建议,因为所有元素都有不同的元素需要使用 css Selector 进行选择。

提前致谢。

【问题讨论】:

  • 在任何时候只有其中一个元素有isDisplayed() == true吗?是否保证任何时候都准确无误?
  • 看看这个 stackoverflow 帖子:stackoverflow.com/questions/28049094/…
  • @Erick ...不,一切都将始终正确,因为在 .sendKeys() 之前首先验证文本框。因此,如果显示文本框/按钮,则 sendKey。该代码工作正常,但只是想知道我是否可以使用 switch,因为我在不同阶段验证不同的元素。它是一个显示所有文本框的帐户页面。文本框是可选的,但只是出于测试目的进行验证。
  • 那我真的不明白。你在做一个if/else-if/else 的条件永远都是真的吗?我们中的一个人很困惑。
  • @Erick .....我现在才想到...你说得对。我应该只检查禁用的文本框。由于其他文本框将始终为真,那么我不需要 if 语句,只需 .sendKeys() 就可以了……由于文本框是可选的,因此它们不需要验证。 ......谢谢你的光。

标签: java webdriver


【解决方案1】:

我认为这可能是一个更合适和优雅的解决方案。构建一个包含您要检查的元素的数组并循环遍历这些元素。

public void profileSection(String displayName, String fName, String lName, String Address_1, 
        String Address_2, String city, String country, 
        String postcode, String telephone) throws Exception
{
    myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
    clickLink(CONSTANTs.MY_PROFILE_SECTION);

    String [] elementNames = new String [] {
            CONSTANTs.DISPLAY_NAME_TXTBOX,
            CONSTANTs.MYACCT_EMAIL_TXTBOX,
            CONSTANTs.FIRST_NAME,
            CONSTANTs.LAST_NAME,
            CONSTANTs.ADDRESS_1
    };

    for (String elementName : elementNames) {
        if(driver.findElement(By.cssSelector(elementName)).isDisplayed()) {
            elementPresent_Click(By.cssSelector(elementName), displayName);
            Thread.sleep(2000);
            break; // when found break out of loop
        }
    }

    log.step("Click Save Changes Button......");
    txtBoxDisabled(By.cssSelector(CONSTANTs.SAVE_CHANGES_BTN),null);            
}

【讨论】:

  • 非常感谢您的回答.... Erick G. Hagstrom 也是对的,因为我从来没有想过它....要么我删除所有 if/elseif 并仅验证文本框需要或者也许,使用你的代码。两者都运作良好。再次感谢各位。在这个论坛上获得更多帮助和力量......让我的工作变得更轻松,因为我确实得到了我困惑的解决方案的答案......谢谢。
  • 只是浏览您的示例代码。如果我猜对了,这是否意味着我将拥有多个 if 语句,因为我将不同的键发送到不同的元素?该方法接受4个参数(字符串显示名称,字符串fName,字符串lName,字符串地址_1)
  • 每个 elementNames 都会有一个 if 语句,直到你得到一个具有 isDisplayed() 的 if 语句,然后它会跳出循环。
  • 猜一猜...谢谢磨坊 :)
【解决方案2】:

您在这里有一个误解(对于新程序员来说这是完全可以理解的)。

您似乎认为使用 if/else 切换会使您的代码更具可读性,但实际上很可能不会。那么如何让你的代码更具可读性呢?很简单,摆脱你所有的重复。

例如,您在每个 if/else 中调用 Thread.sleep。而是将其拉出并放在 if/else 语句之后。

您可以做的另一件事是您可以将您的查找元素移动到类顶部的它们自己的变量中。然后只需调用它们的isDisplayed

例子:

displayNameTextbox = driver.findElement(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX));
if(displayNameTextbox.isDisplayed())
{
    log.step("Optional..... BUT you will need it when Commenting on any article....");
    elementPresent_Click(By.cssSelector(CONSTANTs.DISPLAY_NAME_TXTBOX), displayName);

}

由于这似乎是在 Selenium 中,我实际上建议创建一个页面对象并使用它来简化您的代码。

另外需要注意的是,您可以将这些 if 中的每一个分离到它们自己的方法中,并在必要时简单地检查它们,而不是一次检查它们。但这更多地取决于您打算如何使用它。

【讨论】:

    【解决方案3】:

    你已经得到了答案,但我仍然试一试。我将使用enum 删除if/else,代码将更加面向对象。顺便说一句 - 除了 if/else 之外,还有许多其他领域可以改进代码,例如命名约定。

    MyTest 类

    public class MyTest {
    
        public void profileSection(String displayName, String fName, String lName,
                String Address_1, String Address_2, String city, String country,
                String postcode, String telephone) throws Exception {
            myAccountPageNative(CONSTANTs.MY_ACCOUNT_LINK);
            clickLink(CONSTANTs.MY_PROFILE_SECTION);
    
            Driver driver = null;
            MyEnum.test(driver, displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
            MyEnum.SAVE_CHANGES_BTN.doOperation(displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
    
        }
    
        private void clickLink(String myProfileSection) {
            // TODO Auto-generated method stub
        }
    
        private void myAccountPageNative(String myAccountLink) {
            // TODO Auto-generated method stub
        }
    }
    

    MyEnum 类

    public enum MyEnum {
    
        DISPLAY_NAME_TXTBOX {
            @Override
            public void doOperation(String displayName, String fName, String lName,
                    String Address_1, String Address_2, String city, String country,
                    String postcode, String telephone) {
                elementPresent_Click(By.cssSelector(name()),
                        displayName);
            }
    
            private void elementPresent_Click(Selector cssSelector,
                    String displayName) {
    
            }
        },
        MYACCT_EMAIL_TXTBOX {
            @Override
            public void doOperation(String displayName, String fName, String lName,
                    String Address_1, String Address_2, String city, String country,
                    String postcode, String telephone) {
                txtBoxDisabled(By.cssSelector(name()), null);
            }
    
            private void txtBoxDisabled(Selector cssSelector, Object object) {
    
            }
        },
        FIRST_NAME {
            @Override
            public void doOperation(String displayName, String fName, String lName,
                    String Address_1, String Address_2, String city, String country,
                    String postcode, String telephone) {
                txtBoxDisabled(By.cssSelector(name()), fName);
            }
    
            private void txtBoxDisabled(Selector cssSelector, Object object) {
    
            }
        },
        LAST_NAME {
            @Override
            public void doOperation(String displayName, String fName, String lName,
                    String Address_1, String Address_2, String city, String country,
                    String postcode, String telephone) {
                txtBoxDisabled(By.cssSelector(name()), lName);
            }
    
            private void txtBoxDisabled(Selector cssSelector, Object object) {
            }
        },
        ADDRESS_1 {
            @Override
            public void doOperation(String displayName, String fName, String lName,
                    String Address_1, String Address_2, String city, String country,
                    String postcode, String telephone) {
                txtBoxDisabled(By.cssSelector(name()), Address_1);
            }
    
            private void txtBoxDisabled(Selector cssSelector, Object object) {
            }
        },
        SAVE_CHANGES_BTN {
            @Override
            public void doOperation(String displayName, String fName, String lName,
                    String Address_1, String Address_2, String city, String country,
                    String postcode, String telephone) {
            }
        };
    
    
        public static void test(Driver driver, String displayName, String fName, String lName,
                String Address_1, String Address_2, String city, String country,
                String postcode, String telephone) {
            for(MyEnum enum1 : MyEnum.values()) {
                if(driver.findElement(By.cssSelector(enum1.name())).isDisplayed()) {
                    enum1.doOperation(displayName, fName, lName, Address_1, Address_2, city, country, postcode, telephone);
                }
            }
        }
    
        abstract public void doOperation( String displayName, String fName, String lName,
                String Address_1, String Address_2, String city, String country,
                String postcode, String telephone);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多