如何替换Command模式的静态元素初始化?

时间:2015-08-23 22:34:10

标签: java selenium-webdriver enums static-initialization

我想替换if else语句:

    if (userSalutation.equalsIgnoreCase("mr")) {
        screenPage.selectMr();
    } else {
        screenPage.selectMs();
    }

selectMr()只需单击此按钮即可执行。

使用 命令模式 实施 使用 枚举 实现此目标。

我必须使用if用于网页元素(按钮):

enter image description here

代码段

public class ScanScreenPageStep1 extends PageObject {
    public ScanScreenPageStep1() {
        PageFactory.initElements(new EasyWebFieldDecorator(getDriver()), this);
    }
    @FindBy(id = "salutation")
    protected Button mr;

    @FindBy(id = "salutation2")
    protected Button ms;

枚举

public enum PersonSalutations {
        MR("mr") {
            @Override
            public Button getButton() {
                return mr;
            }
        },    
        MS("ms") {
            @Override
            public Button getButton() {
                return ms;
            }
        };
        private String salutation;

        PersonSalutations(String salutation) {
            this.salutation = salutation;
        }

        public static final Map<String, Button> stringToButton = new HashMap<>();            
        static {
            for (PersonSalutations salut : values()) {
                stringToButton.put(salut.toString(), salut.getButton());
            }
        }

        public String getSalutation() {
            return salutation;
        }

        public abstract Button getButton();

        public static Button fromString(String stringSalutation) {
            return stringToButton.get(stringSalutation);
        }    

        @Override
        public String toString() {
            return salutation.toUpperCase();
        }
    }

要将按钮元素添加到stringToButton,我必须将我的按钮元素设为静态:

@FindBy(id = "salutation")
protected static Button mr;

@FindBy(id = "salutation2")
protected static Button ms;

在这种情况下如何避免使元素变为静态?

在这种情况下或其他一些情况。

1 个答案:

答案 0 :(得分:0)

您的enum定义了概念按钮,而protected Button mr定义了按钮的实例。除了单例模式之外,这就像向Class询问类的实例一样。您的代码有多个Button实例,因此单例不适用于此处。

您应该将getButton移至ScanScreenPageStep1,如下所示:

public Button getButton(PersonSalutations s) {
    if (s == PersonSalutations.MR)
        return this.mr;
    if (s == PersonSalutations.MS)
        return this.ms;
    throw new IllegalArgumentException("Invalid: " + s);
}

作为替代方案,将ScanScreenPageStep1作为参数添加到getButton,因此枚举已知 “步骤1”实例以获取按钮。