我正在开发一个selenium WebDriver框架[Java],其中有一个Base类,其他所有类都从这个类扩展而来。此外,我遵循页面对象模型,其中每个页面对应于一个类和方法,其中导航到下一页返回下一页/类的新实例。简而言之,每个UI页面对应于Class
现在每个页面都有一些共同的功能,所以不要把它们放到每个类中,而是避免DRY我把它放在我的Base Page类中
for go goBack方法在每个页面上,基本上导航到上一页。
我担心的是我想跟随页面/类之间的链接,因此我不确定什么应该是前goBack的常用方法的返回类型。
请记住导航到下一页的任何方法都应该返回该页面的新实例。
我认为一个解决方案是实现泛型,但仍然在苦苦挣扎。任何人都可以帮助我如何实现这一目标。
public class BasePage {
public WebDriver driver;
public BasePage(WebDriver driver) {
this.driver=driver;
}
public BasePage clickGoBack() throws Exception{
driver.click(goBackButton);
return this;
}
}
答案 0 :(得分:7)
BasePage
需要知道链接的实现类型:
/**
* @param <T> The implementing type.
*/
public abstract class BasePage<T extends BasePage<T>> {}
然后,您可以使用:
public T clickGoBack() { return (T) this; }
这里的问题是,this
不一定是T
的一个实例,所以演员阵容不安全,例如使用以下类:
public class Page1 extends BasePage<Page2> {}
解决方案是询问子类this
:
public abstract class BasePage<T extends BasePage<T>> {
protected final WebDriver driver;
public BasePage(WebDriver driver) {
this.driver = driver;
}
public T clickGoBack() throws Exception{
driver.click(goBackButton);
return getThis();
}
protected abstract T getThis();
}
public class HomePage extends BasePage<HomePage> {
public HomePage(WebDriver driver) {
super(driver);
}
@Override
protected HomePage getThis() {
return this;
}
}