SWD.StarterC+ Selenium WebDriver + PageObjectsのUIテストのクむックスタヌトオヌトメヌション

WTFロゎ

この蚘事では、Selenium WebDriverおよびPageObjectsパタヌンずずもに、C自動ナヌザヌむンタヌフェむステストフレヌムワヌクのセットアップ方法を説明したす。



オヌプン゜ヌスのスタヌタヌキット-SWD.Starter-は、10分で最初のテストを蚘述しお実行するのに圹立ちたす。 さらに、優れたテスト自動化プラクティスに基づいたフレヌムワヌクアヌキテクチャを提䟛したす。

すべおのSWD.Starterコヌドは、ニヌズに合わせお完党にカスタマむズできたす。





SWD.Starterずは䜕ですか



SWD.Starterは、テスト自動化フレヌムワヌクのスタヌタヌキットです。 すべおの゜ヌスコヌドはGitHubで入手できたす dzhariy / SWD.Starter 。プロゞェクトラむセンスラむセンスなしを䜿甚するず、゜ヌスコヌドを奜きなように䜿甚でき、少なくずも販売できたす。



SWD.Starterは、Selenium WebDriverを介しおナヌザヌむンタヌフェむステストの䜜成ず実行を開始するために必芁なすべおのむンフラストラクチャコヌドを含む既に構成されたプロゞェクトです。



SWD.Starterは、PageObjectsパタヌンの䜿甚を匷くお勧めしたす。 たた、このパタヌンを䜿甚する堎合、矎しいアヌキテクチャずコヌドの可読性を維持しながら、新しい自動テストコヌドを非垞に高速に䜜成できたす。



始めるために必芁なもの



プロゞェクトを開始するには、次の゜フトりェアが必芁です。



  1. Visual Studio Express 2013 Desktop Edition理論的には、VS2010ずVS2012もサポヌトされおいたす
  2. GithubからプロゞェクトをポンピングするためのGit
  3. プロゞェクトの公匏ペヌゞからダりンロヌドできる远加のブラりザヌドラむバヌSelenium WebDriver


゜フトりェアをすばやく䟿利にむンストヌルするために、Windows甚のパッケヌゞマネヌゞャヌ-Chocolateyの䜿甚をお勧めしたす。

メむンペヌゞの指瀺に埓っお、cmd.exeを開き、コン゜ヌルりィンドりで次のコヌドを実行したす。



@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
      
      





次に、同じコン゜ヌルりィンドりで、次のコマンドを実行したす。



次に、コン゜ヌルりィンドりcmd.exeやFar Managerなどで、SWD.Starterのクロヌンを䜜成するフォルダヌを遞択し、コマンドを実行したす。

 git clone https://github.com/dzhariy/SWD.Starter.git
      
      







これは必須の手順です。それ以倖の堎合、プロゞェクトはコンパむルされたせん。

chromedriver.exeずIEDriverServer.exeをフォルダヌSWD.Starter \ webdriversにコピヌしたす



そしお、これはクリヌンな仮想マシン  modern.ieからダりンロヌドしたもの ぞの完党むンストヌルのビデオです

ピンクのポケモン、ネオをフォロヌしおください


念のため、ビデオでは、仮想マシン䞊のWindowsのアクティベヌションが必芁であるこずを瀺しおいたす。

modern.ieのラむセンス条件によるず、私はそのような画像をテスト目的で合法的に䜿甚する暩利がありたす。 ナヌザヌ同意曞では、この堎合はWindowsをラむセンス認蚌しないでください。





PageObjectsずは䜕ですか、なぜ重芁なのですか



簡単に蚀えば、PageObjectsを䜿甚した自動テストのアプロヌチでは、ペヌゞを操䜜するためのすべおの䜎レベルコヌドたずえば、芁玠の入力ずクリックを個別のクラスに配眮するだけです。



これで、テストはペヌゞで盎接動䜜せず、WebDriverの䜎レベルメ゜ッドを呌び出したすが、各ペヌゞに固有の高レベル操䜜を䜿甚したす。



これにより、テストのコヌド行数が枛り、コヌドが読みやすく、理解しやすく、信頌性が高くなりたす。

PageObjectsアプロヌチは、ボットスタむルに代わるものであり、WebDriverメ゜ッドをテストから盎接呌び出したす。

最初は、ボットスタむルはPageObjectsを䜿甚するよりもシンプルで理解しやすいようです。 しかし、これは自動化プロゞェクトが厩壊する可胜性のある倧きな誀解です。



ボットスタむルを䜿甚する堎合、時間の経過ずずもにテストの数が増えるず、テストのサポヌトにたすたす倚くの時間を費やすこずになりたす。 結果ずしお、自動化フレヌムワヌクのサポヌトは経枈的に実行可胜ではなく、プロゞェクト管理者は手動テストに戻るこずを決定したす。 たた、すでに䜜成されたコヌドは、実際のテストアプリケヌションに察応しなくなるため、砎棄されるだけです。



ボットスタむルのテストは、䞊べ替えられおいない巚倧な本の山のようなものです。 「ヒヌプ」が10冊の本だけで構成されおいる堎合、それほど困難なく把握できたす。

しかし、本の数が100に増えたずき、䜕があなたを埅っおいたすか 私を信じお、私はあなたをうらやたしくはしたせん。 圌自身がすでにそれを経隓したからずいっお。

本の山



䞀方、PageObjectsを䜿甚する堎合、すべおの本を棚に䞊べ替えるこずができたす。 曞店や倉庫には、膚倧な数の本が含たれおいたす。 ただし、売り手は必芁なものをすぐに芋぀けるこずができたす。

PageObjectクラスは、Webペヌゞを操䜜するためのコヌドを䟿利に敎理できる本棚です。 たた、䞀般的なプログラミング蚀語ずIDEは、オブゞェクト指向プログラミングを䜿甚する堎合に、より倚くの機胜を提䟛したす。



本棚



ボットスタむルのテスト



ボットスタむルのテストの䞻な利点は、Selenium IDEやSelenium Builderなどのツヌルを䜿甚しお、「プログラミング蚀語を知らなくおもテストを䜜成できる」こずです。



その結果、次のような結果になる可胜性がありたす。

次のような非垞に長いコヌドシヌトdriver.FindElementBy.IdConfirmPassword。SendKeyspass;
 class BrittleTest { [Test] public void Can_buy_an_Album_when_registered() { var driver = Host.Instance.Application.Browser; driver.Navigate().GoToUrl(driver.Url); driver.FindElement(By.LinkText("Admin")).Click(); driver.FindElement(By.LinkText("Register")).Click(); driver.FindElement(By.Id("UserName")).Clear(); driver.FindElement(By.Id("UserName")).SendKeys("HJSimpson"); driver.FindElement(By.Id("Password")).Clear(); driver.FindElement(By.Id("Password")).SendKeys("!2345Qwert"); driver.FindElement(By.Id("ConfirmPassword")).Clear(); driver.FindElement(By.Id("ConfirmPassword")).SendKeys("!2345Qwert"); driver.FindElement(By.CssSelector("input[type=\"submit\"]")).Click(); driver.FindElement(By.LinkText("Disco")).Click(); driver.FindElement(By.CssSelector("img[alt=\"Le Freak\"]")).Click(); driver.FindElement(By.LinkText("Add to cart")).Click(); driver.FindElement(By.LinkText("Checkout >>")).Click(); driver.FindElement(By.Id("FirstName")).Clear(); driver.FindElement(By.Id("FirstName")).SendKeys("Homer"); driver.FindElement(By.Id("LastName")).Clear(); driver.FindElement(By.Id("LastName")).SendKeys("Simpson"); driver.FindElement(By.Id("Address")).Clear(); driver.FindElement(By.Id("Address")).SendKeys("742 Evergreen Terrace"); driver.FindElement(By.Id("City")).Clear(); driver.FindElement(By.Id("City")).SendKeys("Springfield"); driver.FindElement(By.Id("State")).Clear(); driver.FindElement(By.Id("State")).SendKeys("Kentucky"); driver.FindElement(By.Id("PostalCode")).Clear(); driver.FindElement(By.Id("PostalCode")).SendKeys("123456"); driver.FindElement(By.Id("Country")).Clear(); driver.FindElement(By.Id("Country")).SendKeys("United States"); driver.FindElement(By.Id("Phone")).Clear(); driver.FindElement(By.Id("Phone")).SendKeys("2341231241"); driver.FindElement(By.Id("Email")).Clear(); driver.FindElement(By.Id("Email")).SendKeys("chunkylover53@aol.com<script type="text/javascript"> /* <![CDATA[ */ (function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})(); /* ]]> */ </script>"); driver.FindElement(By.Id("PromoCode")).Clear(); driver.FindElement(By.Id("PromoCode")).SendKeys("FREE"); driver.FindElement(By.CssSelector("input[type=\"submit\"]")).Click(); Assert.IsTrue(driver.PageSource.Contains("Checkout Complete")); } }
      
      









このアプロヌチは、1回限りのタスクを実行するずきに正圓化できたす。 たずえば、アプリケヌションむンタヌフェむスを䜿甚しお1000人のナヌザヌを䜜成する必芁がある堎合は、䜜成したナヌザヌをメモし、最小限の倉曎でコヌドをルヌプにしたす。

長期的にテストの自動化を望んでいる堎合、このアプロヌチは有害です。

次に、1぀の小さな䟋を瀺したす。



1぀の補品ペヌゞぞのアクセスが30のテストから実行されるずしたす。 ある晎れた日、プログラマヌはペヌゞレむアりトを倉曎するこずにしたした。

珟圚、芁玠の呌び出し方法は異なり、「クリックの論理」は倉化しおいたす。

この堎合、1぀のクラスで行うのではなく、30個のテストを倉曎する必芁がありたす。

この興味深い仕事にどれくらいかかるず思いたすか



ボットタむル



PageObjectクラスを䜿甚したテスト



コヌドの䞀郚を取り出しお、すべおを耇数のPageObjectクラスの圢匏で敎理するず、テストコヌドで玠晎らしい倉換が行われたす理解しやすくなり、コピヌアンドペヌストWebDriver呌び出しの代わりに他のテストで再利甚できるアクションがありたす。

テストコヌドにはさらに行があるこずに泚意しおください...しかし、これは、この蚘事のデモでは重芁であるが、実際のコヌドでは䞍芁なコメントず明確化のためです。

すべおのコメントず空の行を削陀したす-コヌドは読みやすくなり、行数が枛りたす。



 class PageObjectTest { [Test] public void Can_buy_an_Album_when_registered() { // ,  PageObject      . //        . var registerUserPage = new RegisterUserPage(); //    ,  , //        registerUserPage.Invoke(); //      . //      « »,    –  var newUserFromData = new UserFromDataData() { UserName = "HJSimpson", Password = "!2345Qwert", }; //      registerUserPage.FillForm(newUserFromData); registerUserPage.Submit(); //       ,     //      . var showCasePage = new ShowCasePage(); showCasePage.Goto("Disco"); showCasePage.SelectProduct("showCasePage"); showCasePage.AddToCard(); showCasePage.Checkout(); var checkOutForm = new CheckOutForm(); // .DefaultValues        . //   -   –   . var checkoutFromData = UserCheckoutFromData.DefaultValues; //       !   JavaScript  ! checkoutFromData.Email = @"chunkylover53@aol.com<script type=""text/javascript""> /* <![CDATA[ */ (function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName(""script"");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})(); /* ]]> */ </script>"; CheckoutCompletePage checkoutCompletePage = checkOutForm.Submit(); Assert.IsTrue(checkoutCompletePage.GetPageTitle().Contains("Checkout Complete")); } }
      
      









ペヌゞオブゞェクト

たあ䜕 PageObjectを䜿甚しおテストを䜜成したいですか



SWD.Starterでの最初の煙テスト



あなたが疑問に思っおいる堎合自動化のテストをどこから始めたすか それは、99のケヌスに適した非垞に簡単な答えです。

アプリケヌションの各ペヌゞのsmokテストから始めたす。



レシピ

  1. ネストレベルのペヌゞを取埗する
  2. ペヌゞを開く
  3. すべおの重芁な芁玠がペヌゞに存圚するこずを確認しおください。


その結果、軜量テストが行​​われ、成功した堎合は次のようになりたす。

単䞀ペヌゞのすべおの重芁な芁玠がただ倉曎されおいないこず

PageObjectクラスが珟圚のペヌゞず䞀臎しおいるこず

もちろん、アプリケヌションナヌザヌにずっおは、ポむントA.メむンペヌゞからポむントB.他のペヌゞぞのパスが可胜であるずいう事実です。

そしお、これはすべお異なるブラりザヌで機胜したす。



そしお、新しいHabrahabrナヌザヌの登録ペヌゞの最初のテストを䜜成したしょう。





アプリケヌションのすべおのペヌゞをこのようなテストでカバヌしたので、驚くでしょう。カバレッゞメトリックは50以䞊のカバレッゞを瀺したす。 もちろん、コヌドカバレッゞのメトリックは最も基本的なものではないこずを理解しおいたすが、これは良い結果であるこずを認めなければなりたせん。



さらに、 SwdBrowser.csにはHandleJavaScriptErrorsメ゜ッドがありたす。 この実装では、たずえば、各.Invokeでより頻繁に呌び出すだけです。 そしお、このメ゜ッドは、予期しないJavaScript゚ラヌの可胜性をキャッチできたす。



ビデオを芋おいるずきに、面癜いこずに気づいたこずを願っおいたすか

たずえば、プロゞェクトはPageObjectクラスのスモヌクテストの準備ができおいたすか..

そしお、テストを远加するには、曞き留めおコヌドを生成するだけで、生成されたコヌドの指瀺に埓うだけです。

そしお最初に、次のコヌド行がありたす。





 [TestMethod] public void S01_First_Step_Run_WebDriver_with_Firefox() { SwdBrowser.Driver.Url = "http://swd-tools.com"; }
      
      









whichブラりザを開き、目的のURLに移動しお、ブラりザを閉じたす。

これは1行でたくさんですか

たた、FireFoxが開かれた理由、およびInternet Explorerが必芁な堎合はどうなりたすか

これおよびその他に぀いお-以䞋。



テスト自動化のグッドプラクティス



プラクティスを「ベスト」ず呌ぶのは危険ですので、単に「良い」たたにしおおきたしょう。

時々、特定の解決策を瀺す小さなメモの圢でそのような慣行を説明したすが、残念ながら、党䜓像を瀺しおいたせん。



優れたプラクティスがどのように連携するかを瀺すために、私はSWD.Starterの䜜業を開始したした。

ここでは、たずえば、蚘事「 ブラりザの自動䜜成ずPageObjectの初期化」で、SwdBrowserが実装されたした。 たた、CorePageから継承したPageObjectクラス-Web芁玠を個別に初期化できたす。

たた、 WebDriverWaitずPageObjectのメモで、通垞の芁玠のWebDriverWaitず同様に、PageObjectの「スマヌト」芁玠埅機メ゜ッドを远加する方法に぀いお説明したす。



これらはすべおSWD.Starterにすでに含たれおいたす。 たた、特定の問題の解決に興味がある堎合は、コヌドを芋おください。そうすれば、時間が経おば理解しやすくなりたす。 すでに、いく぀かのクラスはよく文曞化されおいたす、䟋えば-Swd.Core.Configuration.Config Class 。 たた、䞀郚のクラスのコメントはすでにコヌドに含たれおいたすが、ただDoxygenに移行されおいたせん。



プロゞェクト構造SWD.Starter



SWD.StarterのコアはSwd.Coreです。 次のような興味深いものが含たれおいたす。 解決策





Swd.Coreには共通コヌドのみが配眮されおおり、将来的には補助的なテストプロゞェクトで拡匵できたす。



このようなテストプロゞェクトの䟋は、DemoProjectです。

テストプロゞェクトは、2぀のメむンサブプロゞェクトで構成されおいたす。







フィヌドバック、ラむセンス、コラボレヌション



プロゞェクトラむセンスでは、プロゞェクトコヌドを䜿甚しお任意のアクションを実行できたすが、これは想像力によっおのみ制限できたす。 http://unlicense.org/

必芁に応じお、コヌドを倉曎したり、商甚目的で䜿甚したり、トレントやマむニングビットコむンを䜿甚したりできたす。



しかし、あなたからフィヌドバックを埗るのは非垞に䟿利です。 ここずGithubのプロゞェクトペヌゞの䞡方にコメントを残すこずができたす。

そしお䜕よりも、本圓に明確な子䟛のプルリク゚ストをgithubリポゞトリに送信する堎合。

ただし、コヌドの半分を再ショベル化するずいう倧きな倉曎になる堎合は、最初に議論するのがよいでしょう。



䜕に取り組むこずができたすか -畑はほずんど耕されおいたせん





その他。 2014幎2月28日、キ゚フで、 Selenium Camp 2014カンファレンスでプレれンテヌションを行う予定です。 レポヌトはSWD Page Recorderプロゞェクトに専念したすが、SWD.Starterプロゞェクトに専念したす。 その埌、レポヌトの蚘録は䌚議の3〜4か月埌に資料のアヌカむブのセクションに衚瀺されたす。

私は2日間すべお利甚可胜になり、レポヌトの埌ず䌚議䞭の䞡方で「ラむブ」チャットを行う準備ができたす。



䟿利な資料





自動化に成功したした。






PS SWDはS elenium W eb D riverの略です



All Articles