我正在使用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");
}
}
由于嵌套接口的代码少得多,而且其成员不需要函数,使用它似乎是更好的选择,但与包含冗余代码的嵌套枚举相比,这有多少不好的做法。