0

テストの自動化のために、使用する Page クラスがたくさんあります。それぞれに、次の 3 つの必須要素があります。

  1. WebDriver
  2. ウリ
  3. そのページの必須要素。

次のように、すべてのページ クラスの基本クラスを作成することにしました。

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 クラスをマージできると思います。そのアイデアについてはわかりません。ただの考えです。

4

0 に答える 0