自動化されたWebアプリケーションテスト(MS単体テストフレームワーク+ Selenium WebDriver C#)。 パート3:WebPages-ページの説明

ウェブページ

はじめに


これまでの記事が役立った、または単に興味を持ったすべての人を歓迎します。 最後の部分では、Selenium WebDriverを理解しました。テストを作成する前に、テスト対象のアプリケーションのページを記述する必要があります。 プレビューでは、主なポイントをリストします





参照資料


パート1:はじめに

パート2.1:Selenium APIラッパー-ブラウザー

パート2.2:Selenium APIラッパー-WebElement

パート3:WebPages-ページの説明

パート4:最後にテストを書く

フレームワークの公開



PageBaseクラス


基本クラスの設計から始めるのが論理的です。 ページに共通するものは何ですか? 少なくとも:



これに加えて、PageBaseクラスには、アプリケーション固有のすべてのページに共通のメソッドが含まれます。 たとえば、カスタムポップアップウィンドウがサイトのすべてのページにポップアップできる場合、ClosePopup()メソッドを記述します。 または、たとえば、すべてのページにサイトメニューがあります。 次に、このメニューを基本クラスで説明できます。 例では、これを省略します。

namespace Autotests.WebPages { public abstract class PageBase { public Uri Url { get { Browser.WaitAjax(); return GetUriByRelativePath(RelativePath); } } public void Open() { Contract.Requires(Url != null); Contract.Ensures(Browser.Url == Url, string.Format("{0} != {1}", Browser.Url, Url)); Browser.WaitAjax(); if (Browser.Url == Url) return; Browser.Navigate(Url); } public Type PageName() { return GetType(); } protected void Navigate(Uri url) { Contract.Requires(url != null); Browser.Navigate(url); } protected static Uri GetUriByRelativePath(string relativePath) { Contract.Requires(!string.IsNullOrEmpty(relativePath)); return new Uri(string.Format("{0}{1}", SharedSettings.TestEnvironmentUrl, relativePath)); } private string RelativePath { get { const string rootNamespaceName = "Autotests.WebPages.Root"; const string stringToDelete = "Page"; var fullName = GetType().FullName; Contract.Assume(fullName != null); return fullName.Replace(rootNamespaceName, "").Replace(".", "/").Replace(stringToDelete, ""); } } } }
      
      





RelativePathは、それを記述するクラスの名前と場所に基づいて、Webページへの相対パスを取得します。 魔法の言葉「ページ」を削除することは、サイト上のページの名前が予約名または使用中の名前と一致する場合の松葉杖です。 この場合、「ページ」という単語は、単にページ記述クラスの名前に割り当てられます。

SharedSettings.TestEnvironmentUrl-テストされたサイトのアドレス。 定数またはプロジェクト設定に保存できます。



ログオンページの説明


次に、サイトにアクセスするために、承認を行う必要があります(ところで、誰もが認証と認証の違いを知っていますか?)。

ログオンページについて説明しましょう。

 public class LogOn : PageBase { #region Elements private static readonly WebElement LoginEdit = new WebElement().ById("Login"); private static readonly WebElement PasswordEdit = new WebElement().ById("Password"); private static readonly WebElement RememberMeCheckbox = new WebElement().ById("Remember"); private static readonly WebElement ValidationSummary = new WebElement().ByClass("ValidationSummary"); #endregion public void DoLogOn(UserLoginInfo userLoginInfo) { LoginEdit.Text = userLoginInfo.Login; PasswordEdit.Text = userLoginInfo.Password; RememberMeCheckbox.SetCheck(userLoginInfo.RememberMe); Browser.ExecuteJavaScript("$('#LogOnForm').submit()"); if (Browser.Url == Main.Url) return; if (ValidationSummary.Exists()) throw new LogOnValidationException(); throw new Exception("Unknown logon exception."); } }
      
      





そのため、ページには2つの入力フィールド(ユーザー名とパスワード)、チェックボックス「Remember me」および「Login」ボタンがあります。 私はこのボタンを意図的に説明しませんでしたが、Browser.ExecuteJavaScriptを介してクリックし、要素を操作するこの方法を示します。

DoLogOnメソッドは、データ構造を取り、フォームに入力して送信します。 その後、メインページBrowser.Url == Main.Urlが表示される場合、メソッドはその作業を正常に完了します。 入力が失敗し、ValidationSummary.Exists()エラーが表示された場合、メソッドはLogOnValidationExceptionをスローします。 他のすべての(意図しない)場合、例外がスローされ、「不明なログオン例外」というメッセージが表示されます。

LogOnクラスは、PageBaseからいくつかのメソッドとプロパティ、たとえばOpen()メソッドを継承しました。 パラメータを使用してページを開く必要がある場合があります。 これを行うには、LogOnクラスでOpenクラスのオーバーロードを記述する必要があります。

 public void Open(int userId) { var url = new Uri(string.Format("{0}?userId={1}", Url, userId)); Navigate(url); }
      
      





このメソッドでは、新しいUrlを作成し(ユーザーIDを追加)、基本クラスのNavigateメソッドを呼び出します。



非表示の初期化はない(PageFactoryを思い出してください)ことに注意してください。要素はそれらにアクセスしたときに検索されます。



ファサードページ


原則として、ファサードを使用することはできません。 ページクラスは静的ではなく、インスタンスを作成する必要があるため、非常に便利でした。 例(上の図を参照)の場合、Pagesクラスは次のようになります。

 namespace Autotests.WebPages { public static class Pages { public static LogOn LogOn = new LogOn(); public static class Home { public static Help Help = new Help (); public static Main MainLogOut = new MainLogOut (); } } }
      
      





したがって、テストから次のようにページを操作できます。

 Pages.LogOn.DoLogOn(...); Pages.Home.Help.Open();
      
      





これは非常に便利です。ページ階層はサイトの階層を繰り返します。



おわりに


Fuf、この部分は非常に簡単に思いついたもので、コードはあまりありませんでした。 いつものように、PMかコメントに質問/提案を書いてください。 次のパートでは、最後に自動テストを記述します=)その中で、最も一般的な質問への回答を提供し、フレームワークの作業バージョンへのリンクを提供します。



All Articles