我想替换if else
语句:
if (userSalutation.equalsIgnoreCase("mr")) {
screenPage.selectMr();
} else {
screenPage.selectMs();
}
selectMr()
只需单击此按钮即可执行。
使用 命令模式 实施 使用 枚举 实现此目标。
我必须使用if用于网页元素(按钮):
代码段 :
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;
在这种情况下如何避免使元素变为静态?
在这种情况下或其他一些情况。
答案 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”实例以获取按钮。