テストの自動化のために、使用する Page クラスがたくさんあります。それぞれに、次の 3 つの必須要素があります。
- WebDriver
- ウリ
- そのページの必須要素。
次のように、すべてのページ クラスの基本クラスを作成することにしました。
internal class Page
{
protected IWebDriver _webDriver;
protected string _uri;
protected By _essentialElementCriteria;
internal Page(IWebDriver driver, WebDriverPageType pageType, string uri, By criteria)
{
try
{
PageLoader.LoadPage(driver, _uri, new SearchAndWaitCriteria(_essentialElementCriteria));
this._webDriver = driver;
}
catch (Exception exc) { throw new PageLoadFailedException(pageType, exc); }
}
}
派生クラスは次のようになります。
internal class LoginPage : Page
{
internal LoginPage(IWebDriver driver)
: base (driver, WebDriverPageType.LoginPage, "loginpage_url", By.Id("xyz")) { }
// Other LoginPage specific methods like Login().
}
PageLoader クラスは次のとおりです。
internal class PageLoader
{
internal static void LoadPage(IWebDriver driver, string uri, SearchAndWaitCriteria criteria)
{
if (driver == null) throw new ArgumentNullException("WebDriver is null.");
driver.Navigate().GoToUrl(uri);
var waitElement = driver.WaitForElement(criteria.SearchCriteria, criteria.MaximumWaitSeconds, criteria.SleepMilliSecondsBetweenTwoSearches);
if (waitElement == null) throw new NotFoundException(String.Format("Failed to find the waitElement. Element details: {0}", criteria.SearchCriteria.ToString()));
}
internal static bool IsPageLoaded(IWebDriver driver, SearchAndWaitCriteria criteria)
{
IWebElement essentialElement = driver.GetElement(criteria.SearchCriteria);
return essentialElement != null;
}
}
私の基本的な考えは、多くのページ クラスを作成するので、ページを構築する同じコードを書くことを排除することでした。したがって、PageLoader クラスの助けを借りて、そのコードを基本クラスに「共通化」しました。私はまだ何かが完全に正しくないと思います。基本クラスに例外をスローする責任を負わせましたが、これで問題ありません。しかし、それを行うには、派生クラスの PageType を引数として基本クラスに渡す必要がありますが、これは私には良くないようです。
このデザインのどのような改善点を提案できますか? 基本クラスを削除して、代わりにコンポジションを使用する必要がありますか? それを実現するために PageLoader と Page クラスをマージできると思います。そのアイデアについてはわかりません。ただの考えです。