很抱歉,如果这个问题已经被问过,我还没有找到类似我的问题的东西......
我正在工作/玩耍/学习建立某种测试环境......在其中,我正在构建一个应用程序层(一个类包,是不同页面/窗口/表单的虚拟表示)应用。简化的设置如下:
public abstract class WebPage {
protected WebDriver driver;
protected WebElement getElement(By by){
WebElement element = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(by));
return element;
}
public void menuLogout(){
System.out.println("Logged out");
}
}
public class HomePage extends WebPage {
public ProfilePage ClickLinktoProfilePage(){
return new ProfilePage();
}
public DashBoardPage clickViewDashboard(){
return new DashBoardPage();
}
public String getTitle(){
return getElement(By.id("title")).getText();
}
}
public class ProfilePage extends WebPage {
public String getUsername(){
return getElement(By.id("name")).getText();
}
public String getEmail(){
return getElement(By.id("email")).getText();
}
public HomePage clickReturnToHomePage(){
return new HomePage();
}
}
public class DashBoardPage extends WebPage {
public String getcurrentPeriod(){
return getElement(By.id("name")).getText();
}
}
这背后的想法是我希望我的测试只保存一个当前网页。我不希望每次更改页面时都创建一个新变量。
我也不想被迫提前知道我要进入哪个页面。我希望应用程序层给我应用程序的流程。就像单击链接时,您会被带到下一页一样,我希望当我单击将我带到另一个页面的链接时,该方法会告诉我我将进入哪个页面。
(WebPage 抽象类还公开了所有具体 WebPage 之间的许多共享方法)
所以我的预期用途是:
WebPage currentPage = new HomePage();
currentPage = currentPage.ClickLinktoProfilePage(); //currentPage = new ProfilePage();
System.out.println(currentPage.getUsername());
currentPage.menuLogout();
遗憾的是,这不起作用,因为 currentPage 变量被键入为 WebPage,它看不到任何具体类的方法。我觉得它既合乎逻辑又很奇怪,因为我可以问“currentPage.getClass().getName();” 它会返回“packageName.ConcreteClassName”。
为了使 Typecasting 起作用,我需要重新定义变量的类型......(不确定它是否可能甚至是好做)。
所以我知道我可以在变量中找到类的名称,但我不确定从那里去哪里。
有人有解决方案吗?