目前,我正在进行网络测试,使用WebDriver模拟浏览器。这个WebDriver必须经常查找HTML元素,其中许多元素通常是相同的(例如,某个按钮、表单字段等等)。WebDriver需要Selenium的By类的一个对象才能使用findElement()。
我认为,如果有一个enum或接口存储配置好的By实例,那么它的可读性和适应性会更好,可以用来定位元素。在测试中,反复进行硬编码的findElement(By.id("elementid"))转化为findElement(WebGui.Login.SUBMIT_BUTTON),其中WebGui.Login.SUBMIT_BUTTON可以返回一个By实例,搜索ID、名称、CSS类等所必需的内容,而不涉及只需要元素的测试本身。
问题一个层次结构似乎最适合代表网站的不同部分,但是枚举不能继承任何东西。哪种方式是最干净的方法和/或最佳实践?
嵌套Enum作为枚举不能继承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");
}
}由于嵌套接口的代码要少得多,而且其成员不需要函数,使用它似乎是更好的选择,但与包含冗余代码的嵌套枚举相比,这是一种糟糕的做法。
发布于 2019-07-29 23:29:00
您可以让枚举实现一个接口,就像我对这个question的回答一样。
https://stackoverflow.com/questions/45671024
复制相似问题