WebDriver API を使用する場合のページ間の移動は、通常、ナビゲーションを発生させるアクションが発生したときに返される必要がある次のページを返すページ オブジェクトによって行われることをいくつかの場所で読みました。
このソリューションは、常に同じページを返すアクション (新しい ResultPage を返す SearchPage.search() など) ではうまく機能しますが、入力や状態によってアクションがユーザーを別のページに移動させる場合はどうなるでしょうか。Java では、戻り値の型に基づくメソッドのオーバーロードは許可されていません。では、これを行うにはどうすればよいでしょうか。
期待される結果に基づいてNavigator
汎用オブジェクトを返すために使用できるオブジェクトを実装しようと大雑把に試みました。Page
public class Navigator {
private WebDriver driver;
private String baseUrl;
private Map<Class, String> pagesToRelativePaths;
public Navigator(WebDriver driver) {
this.driver = driver;
}
public Navigator(WebDriver driver, String baseUrl, Map<Class, String> pagesToRelativePaths) {
this.driver = driver;
setBaseUrl(baseUrl);
setPagesToRelativePaths(pagesToRelativePaths);
}
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
public void setPagesToRelativePaths(Map<Class, String> pagesToRelativePaths) {
this.pagesToRelativePaths = pagesToRelativePaths;
}
public <T extends PageBase> T navigateTo(Class<T> type) {
driver.get(baseUrl + pagesToRelativePaths.get(type));
return type.cast(new PageBase(driver));
}
public <T extends PageBase> T expectedLandingPage(Class<T> type) {
return type.cast(new PageBase(driver));
}
}
ページをあるページ オブジェクトから別のページ オブジェクトに移動させるアクションは、次のようなメソッドを実装します。
public Navigator signIn(String username, String password) {
usernameField.type(username);
passwordField.type(password);
signInButton.click();
return new Navigator(driver);
}
テストは次のようになります。
@Test
public void SignInWithInvalidCredentialsTest() {
SignInPage signInPage = navigator.navigateTo(SignInPage.class);
signInPage = signInPage.signIn("invalid", "invalid").expectedLandingPage(SignInPage.class);
assertThat(signInPage.getTitle(), is(equalTo(driver.getTitle())));
}
しかし残念ながら、ユーザー入力に基づいてナビゲーターをどのページにも移動させることができませんでした。これを行う方法はありますか、またはこれを行う別の方法はありますか?
ソース: