分层存储常量的最佳实践

时间:2017-08-14 09:07:31

标签: java enums interface

我正在使用WebDriver模拟浏览器,正在进行网络测试。此WebDriver必须经常查找HTML元素,其中许多通常是相同的(即某个按钮,表单字段等)。 WebDriver需要Selenium By类的对象才能使用findElement()

如果有枚举接口存储By的已配置实例,我认为可读性和适应性会很好,这可能会用于找到元素。在测试中,反复硬编码findElement(By.id("elementid"))变为findElement(WebGui.Login.SUBMIT_BUTTON),其中WebGui.Login.SUBMIT_BUTTON可能会返回By的实例,搜索ID,名称,CSS类等等。没有关于只需要元素的测试本身的必要性。

  

问题   层次结构似乎是表示网站不同部分的最佳选择,但枚举不能继承任何内容。哪种方式是最干净的方式和/或最佳实践?

嵌套枚举由于枚举不能继承getBy()和构造函数,因此必须在每个嵌套枚举中定义它们,因此代码更加冗余。

public enum WebGui {
    BUTTON1(By.id("button1")),
    SEND_BUTTON(By.name("sendButton"));

    private By searchCriteria;

    WebGui(By by) {
        searchCriteria = by;
    }

    public By getBy() {
        return searchCritera;
    }

    private enum SubPage {
        BUTTON2(By.id("button2")),
        SEND_BUTTON(By.linkText("Send"));

        private By searchCriteria;

        WebGui(By by) {
            searchCriteria = by;
        }

        public By getBy() {
            return searchCritera;
        }
    }
}

嵌套接口/抽象类使用它看起来不那么“干净”,不提供类型安全(尽管这里不太相关)并且经常被称为不好的做法,因为存储固定的集合可用常量是一个枚举目的。

修改嵌套界面不能为私有,因此将interface更改为abstract class

public abstract class WebGui {
    By BUTTON1 = By.id("button1");
    By SEND_BUTTON = By.name("sendButton");

    private interface SubPage {
        By BUTTON2 = By.id("button2");
        By SEND_BUTTON = By.linkText("Send");
    }
}

由于嵌套接口的代码少得多,而且其成员不需要函数,使用它似乎是更好的选择,但与包含冗余代码的嵌套枚举相比,这有多少不好的做法。

1 个答案:

答案 0 :(得分:0)

您可以让枚举实现类似于我对此question的回答的接口。