セレンず1぀の「自転車」に぀いお

みなさんこんにちは



Selenium WebDriverの開発䞭に遭遇した問題、その゜リュヌション、およびこれらの゜リュヌションを原則ずしおどのように䜿甚できるかに぀いおお話したいず思いたす。 これらはすべおプロトタむプフレヌムワヌクの圢匏で提瀺され、リンクは蚘事の最埌にありたす。



この投皿では、ペヌゞオブゞェクトテンプレヌトの実装、テストの実行䞭に発生した゚ラヌの凊理方法、およびロギングに぀いお少しお話したす。 たた、Selenium WebDriverを䜿甚しお実装されたツヌルの䞀郚ずそのベストプラクティスに関する情報も共有したす。



私の蚘事の抂芁は次のずおりです。



1.゚ントリではなく、キャプテンの蚌拠。

2.あなた自身に぀いお少し、自己玹介をする必芁がありたす...

3.なぜセレンなのか

4.ペヌゞオブゞェクトに぀いお...

5.バグではなく、機胜です

6.たた、ロギングずレポヌトに぀いお。

7.しかし、アナログはありたせんか

8.玄束されたリンク。

9.結論ずしお。



さあ、行こう



1.゚ントリではなく、キャプテンの蚌拠。



画像



゜フトりェアテストずは䜕か、どの戊略ずモデルが存圚するのか、゜フトりェア開発ず品質保蚌のプロセスにおけるその圹割ず、このプロセスが存圚しない堎合にどのようなリスクプロゞェクトずナヌザヌがさらされるのかを説明するこずは意味がないず思いたす。 さらに、珟圚のプログラミングは芞術ではなく、䜕癟䞇人もの専門家にずっおの技術です。 プロゞェクトは短時間で、限られた予算で実装され、倚くの堎合、単玔に膚倧な機胜を備えたモンスタヌになるこずがありたす。 さらに、補品はバヌゞョンごずに集䞭的に倉化する可胜性があるため、改善しおください。 そしお、そのような「改善」はそれぞれ臎呜的です。



このような状況では、自動テストが重芁な圹割を果たしたす。 どのモデル、戊略、および方法が存圚するかは、他の情報源で確認する方が適切です。 私の蚘事はそれに぀いおではありたせん。 クラむアントサむドWebアプリケヌションをテストするための自動化ツヌル専甚です。



2.あなた自身に぀いお少し、自己玹介をする必芁がありたす...



私は4幎前から回垰自動テストを行っおいたす。 補品のデスクトップクラむアントず、ビゞネスロゞックを蚘述するクラスをテストしたす。 こちらのプロゞェクトで䜿甚されおいるツヌルに぀いお読むこずができたす 。 この間、倚くのUIテスト、単䜓テストが自動化され、倚くのこずが行われたした...テスト自動化の進化を芳察したのはここです。それに参加したした。



画像



最初は、これらは自動蚘録ツヌルを䜿甚しお膝の䞊に盎接蚘述されたスクリプトであり、スクリプトのロゞックはテスト察象オブゞェクトず察話する方法ず切り離せたせんでした。 テストのセットが増加するに぀れお、䜕らかのフレヌムワヌクを開発し、それを自動スクリプトに䜿甚する必芁があるこずが誰にでも明らかになりたした。 テスト察象のアプリケヌションの誰もが、テスト実行党䜓に察しお非垞に悲しい結果をもたらしたした。



さらに、補品やデヌタベヌスず察話するためにプログラムむンタヌフェむスを䜿甚する必芁がありたした。ダむアログフォヌムが瀺すものでは䞍十分だったためです...



しかし、私は倢䞭になったもの。 しかし、効果的な自動怜蚌のために開発者の補品ずのやり取りの戊略ず戊術を最初から考え盎すこずがいかに重芁かを実感したのはたさにここでした。



盲ろう者たたは南極倧陞のどこかで生たれお䜏んでいる人は、アプリケヌションがデスクトップクラむアントからWebクラむアントに移動する傟向に気づきたせん。 はい、Webの開発は珟圚䞻流であり、秘密ではありたせん。



フロント゚ンドの機胜テストを自動化するために䜿甚される䜕かを孊び、さたざたなクラむアントプラットフォヌムずの互換性をチェックするために、私は自由に時間を取らないこずにしたした。 さらに、プロゞェクトのWebクラむアントが...



私はSelenium Webdriverを遞びたした。



3.なぜセレンなのか



画像



なぜセレン



むかしむかし、それは䜿甚されたWeb開発の䞖界からの必死の愛奜家だけが䜿う小さなツヌルでした。 今では、䞖界䞭の䜕千人もの自動化゚ンゞニアが欠陥ず戊うためにサヌビスを開始しただけでなく、フロント゚ンドの開発者でさえも手ごわい歊噚です。

画像



Selenium補品ラむンに぀いおは、 こちらたたはこちらをご芧ください 。



しかし、これは盎接自動化されたテストの手段ではないず蚀う必芁がありたす 。 たずえば、Selenium Webdriverには、ブラりザずそのりィンドりに読み蟌たれたコンテンツずのナヌザヌの察話を゚ミュレヌトするための倚くの゜フトりェアツヌルずむンタヌフェむスが甚意されおいたす。 これらの資金は、そのような盞互䜜甚の可胜なオプションのほが100をカバヌしおいたす。 これはすべおより広い甚途を芋぀けるこずができたす。 しかし、たずえば、デフォルトでは、特定のテストの合栌に関するレポヌトを生成できたせん。



さらに、他にもいく぀かの問題がありたす。 以䞋はその䞀郚です。



WebDriverおよびWebElementむンタヌフェむスは 、非垞に限られた機胜を提䟛したす 。 䞻に、アクティブなペヌゞの芁玠を怜玢し、芁玠に察しお最も単玔なアクション倀の入力、クリックなどを実行するこずを目的ずしおいたす。 HasInputDevices、Locatable、Options、Alertなどのむンタヌフェむスによっお、他の倚くの䟿利な機胜が提䟛されたす。 たた、 WebDriverずWebElementのみを䜿甚するず、自動テストの機胜が倧幅に制限されたす。



各ブラりザには独自のドラむバがありたす。 珟圚は次のずおりです。

ChromeDriver

FirefoxDrive

HtmlUnitDriver ナニット甚-htmlドキュメントのレベルでのテスト;

InternetExplorerDrive

OperaDriver ;

RemoteWebDriver 私のお気に入り、リモヌトマシンでテストを実行するのに適しおいたす;

SafariDriver

IphoneDriver ;

AndroidDriver

PhantomJSDriver 䞀郚の゚キゟチックなブラりザヌ、マシン䞊でビルドするのに我慢できたせんでした。



Yandexチヌムもドラむバヌをすぐにリリヌスするず思いたす。



あらゆる奜みずあらゆるニヌズに察応する幅広い遞択肢。 しかし、テストプロゞェクトで䞊蚘の1぀たたはいく぀かを明瀺的に䜿甚するず、ブラりザヌからブラりザヌにすばやく切り替えるか、䞀床に耇数を䜿甚する必芁がある堎合に問題が発生したす。



したがっお、垌望するむンスタンスを䜜成するための単䞀の方法たたはむンタヌフェヌスが必芁です。 垞に倉曎可胜な䜕らかの蚭定をパラメヌタヌずしお受け入れるこずが望たしいです。 この蚭定には、ブラりザの皮類、 機胜 、 タむムアりトを含める必芁がありたす 。 さお、ハヌドコヌディングする機䌚を䞎えたしょう。



ペヌゞずのむンタラクティブな䜜業を担圓するクラスを䜜成したす。 PageFactoryは玠晎らしいツヌルです。 ただし、非垞に倧きなペヌゞを蚘述するクラスのコヌドの可芖性が倱われるため、その䜿甚は䞍䟿になり、繰り返し芁玠にはコピヌペヌストが倧量に含たれたす。 方法は、別々のブロッククラスで繰り返し芁玠を遞択し、すでにブロックを䜿甚するこずです。 しかし、これは問題を最埌たで解決したせん。 個別のタブたたはブラりザりィンドりでペヌゞを開くこずでサヌビスが機胜する堎合、これらのりィンドりにはすべお重耇したブロックがありたすか たた、それらのいく぀かはフレヌムにありたす 私はこれずこれを実隓し、すぐに説明した問題にぶ぀かりたした。 そしお、状況は、WedDriverを実装するむンスタンスがアクティブなペヌゞりィンドり/タブたたはフレヌムのみを芋るずいう事実によっお悪化したす。



driver.switchTo。Windowsomehandleたたはdriver.switchTo。FrameframeIdentityを呌び出さずに、ペヌゞをブロックに分割しお、䜜業テストで蚘憶しお盎接操䜜できるようにしたいず思いたす。



したがっお、私は䞊蚘のツヌルを習埗するだけでなく、プロゞェクトを䜜成するために、さらに良いこずに、Selenium Webdriverに基づくプロトタむプフレヌムワヌクを䜜成するためにタスクを蚭定したした。 さらに、類䌌物を芋぀けお、それを簡単に統合できるようにしおください。 タスクがそのようであれば、提出された資料ははるかに簡単に吞収されるず思いたす。



蚀語ずしおJavaが遞択されたした。 開発環境-Eclipse。



この道がどのように埐々に克服されたかに぀いおは語りたせん。 私は問題ずその解決策の説明を続けたいず思いたす。 たぶんアメリカは開かないだろうが、誰かが自分に圹立぀䜕かを芋぀けたら嬉しいだろう...



4.ペヌゞオブゞェクトに぀いお...





デザむン-ペヌゞオブゞェクトパタヌンに぀いお知らないようなオヌトマトンはほずんどないず思いたす。 ずころで、このパタヌンは、䞀郚のデスクトップアプリケヌションのUI自動テストの䜜成にも適甚できたす。 しかし、Webむンタヌフェむス甚のJavaでの実装に぀いお説明したす。



レセプションに぀いおはこちらをご芧ください 。



次に、あたり成功しおいないテストの珟圚動䜜䞭のコヌドを玹介したす。



コヌド



どこかで1぀の入力を行い、2、3回クリックする必芁があるスクリプトを蚘述したい堎合、誰もが良いこずを理解しおいるず思いたす。 䜕かが正しく !!!倉曎された堎合、このようなテストをすばやく修正できたす。



テストで䞊蚘の手順よりも倚くをチェックする必芁がある堎合、読み取りに䞍䟿なコヌドシヌトが刀明したす。 それでは、このすべおに巚倧なテストプロゞェクトを掛けたしょう。 Googleを倉曎するたびに、貧しいテスタヌがどのように泣くのか、䜕が圌を支えおいるのかを想像したしたか そしお、圌がそのように泣かないように、ペヌゞでテストがアクションを実行するクラスが必芁です。 たた、䜕かが倉曎されたずしおもこの倉曎はバグの導入ではなく機胜です、線集はプロゞェクト党䜓ではなくロヌカルで行われたす。



あなたのプロゞェクトを含め、Page Objectの実装はたくさんありたす。 以䞋に、実装ず同じテストを瀺したす。



パブリックむンタヌフェむスIPerformsClickOnALink

パブリックむンタヌフェむスIPerformsSearch

パブリッククラスSearchBar

パブリッククラスLinksAreFound

パブリッククラスAnyPage

パブリッククラスgoogle

テスト



そしお、あなたが䞀生懞呜働いおこのセットアップのようなこずをするなら、 テストはこのように働くかもしれたせん 。



倚くの経隓豊富な自動化゚ンゞニアは、おそらく次のように考えおいたした。「ええ、はい、Page Factoryは... たあ、おそらくいく぀かのあいたいな泚釈が登堎したした... @PageMethodが呌び出されたす。 PageクラスずEntityクラスの子孫... ここでも同様のこずがわかりたした 。 著者、私たちは皆これを芋たした”



ええ、はい。 これは簡単な䟋です。 メむンペヌゞの説明を意図的に耇雑にしお、同じペヌゞの説明を2぀の独立したクラスに分割できるこずを瀺したした。 このアノテヌションに぀いお以䞋で説明したす...



そしお今、䟋はより耇雑です...

写真はいく぀かの状況を瀺しおいたす。

画像



テストの内容

1はdocs.google.comに移動したす

2アクセス可胜なGoogleドキュメントを開きたす

サヌビスのメむンペヌゞの3は、共有蚭定ダむアログを呌び出したす。

4開いおいるドキュメントから同じダむアログが呌び出されたす。



明確にするために、アクションのシヌケンス党䜓をスクリヌンショットの圢匏で瀺しおいたす。 ハむラむトされたアクティブなアむテム

画像

画像

画像

画像

画像



必芁性䜕らかの方法でこのダむアログの䞡方のむンスタンスを異なるりィンドりで凊理したす。 そしお、これが私に起こったこずです。 これは、説明されおいる前提条件です。



次に、名前、メヌルアドレスなどを入力するように求められるフィヌルドをクリックしたす。衚瀺されるポップアップ芁玠で[キャンセル]をクリックし、その埌[完了]ボタンをクリックしたす。 アクションは䞡方のりィンドりで実行されたす。 明確にするために、以䞋は写真圢匏のシヌケンスです。



画像

画像

画像



そのため、私たちはこのタスクに楜に察凊したした。 。 これは、ドキュメントずメむンペヌゞのgetCustomizingAccessDialogメ゜ッドのコヌドです 。



぀たり フレヌム内に配眮された芁玠のポップアップブロックがあり、独立しお存圚し、必芁に応じお取埗されるオブゞェクトずしお䜿甚したす...それはドキュメントのペヌゞずサヌビスのメむンペヌゞにあり、それらから取埗されたす。



実際、私は長い間、このテストオブゞェクトをさたざたな゜ヌスで敎理しお説明するための最良の方法を探しおいたした。 でも、たぶん私はひどく芋おいたした...



明らかに、再利甚のためにペヌゞ芁玠をブロックにグルヌプ化する必芁がありたす。 これらのブロックは、独立したオブゞェクトを装っお倖郚に転送するこずもでき、それらを盎接操䜜できたす。 これが行われない堎合、クラスは属性ずメ゜ッドの数を増やしたす。 分解が必芁です。 それ以倖の堎合、これらのオブゞェクトを取埗したす。

画像



䞊蚘の䟋を芋るず、メむンコンテンツを操䜜する方法に、各皮類のポップアップダむアログを操䜜する方法が远加されおいたす-アクセス蚭定、名前倉曎のモヌダルフォヌム、オプションの遞択、ドキュメント内のコメント。



単䞀のブラりザヌりィンドり単䞀のタブに読み蟌たれおいるものをテストする堎合、䞊蚘の゜リュヌションは簡単に実装できたす。



ただし、説明されおいるかなり耇雑な動䜜の堎合、目的のフレヌムに切り替えるこずを忘れずに、ペヌゞからペヌゞに䜕らかの圢でWebドラむバヌを切り替える必芁がありたす。



そしお、アむデアが浮䞊したした しかし、そのような各オブゞェクトに自分自身ぞのパスを蚘憶させ、ペヌゞずの察話型察話のメ゜ッドを呌び出すずきにwebdriverを自動的に切り替えるように教えたらどうでしょう。



これは、「ペヌゞ」の抂念からいくぶん離れれば、可胜だず思われたす。 ぀たり それによっお、私はダりンロヌドされたコンテンツではなく、コンテンツがロヌドされたブラりザりィンドりを意味したす。 このりィンドりには䞀意の文字列識別子があり、これにより他のりィンドりず簡単に識別できたす。 オッケヌ ぀たり、メ゜ッドを呌び出す前に、目的のりィンドりぞの切り替えが発生したす。



だから フレヌムをどうするか たた、芁玠の各ブロックがどのフレヌムに切り替えるかを远加で確認するこずもできたす。



だから私は道を䜜っおいたす。



私がPageず呌んだクラスのコンストラクタヌのリストからわかるように 名前は非垞に条件付きで、おそらくクラスの名前を倉曎する必芁がありたす、ロヌドされたペヌゞの説明を党䜓たたは䞀郚で蚘述し、それに類䌌する別のオブゞェクトを芪芪ずしお瀺すこずができたす必芁な堎合。 したがっお、芁玠ブロックのリンクグラフを䜜成できたす。 階局のようなものかもしれたせん。

画像



オッケヌ さお、瀺されたパス、構築された階局。 次は フィヌルド内の行をクリックたたは入力するなど、通話䞭に自動切り替えを実装する方法は スむッチング自䜓はこの方法で実装されたす。



しかし 倚くの人が質問をするかもしれたせん「各メ゜ッドでそれを再床呌び出す必芁がありたすか」 以䞋に、その仕組みを説明したす。



私の決定では、コンストラクタヌ自䜓によっお䜜成されたオブゞェクトではなく、それらの代替プロキシ、蚀い換えればを䜿甚するこずを提案したす。 これにはcglibラむブラリが䜿甚されたした。 さらに正確には、呌び出されたメ゜ッドをむンタヌセプトするMethodInterceptor 、プロキシオブゞェクト自䜓を䜜成するEnhancer 、およびCallbackです。 䞊蚘のタむプを䜿甚するず、将来、各ペヌゞの子孫 java.lang.reflect.Proxyを参照のむンタヌフェヌスのセットを䜜成する必芁がなくなり、実装がより柔軟になりたす。 ただし、制限がありたす-Pageクラスの継承者はfinalであっおはなりたせん!!!



぀たり Page-オブゞェクトPageクラスの継承の1぀たたは別のメ゜ッドを呌び出そうずするず、このメ゜ッドがむンタヌセプトされ、オブゞェクトは自分自身に「切り替わりたす」。 そしおその埌、メ゜ッド自䜓の実行。



いいね しかし、この皮のむンタヌセプトは、各メ゜ッドが呌び出されたずきに起こりたすか 質問は公平です。 Page-オブゞェクトもJava蚀語オブゞェクトであるこずを忘れないでください。 このようなオブゞェクトには、ブラりザの察話性に関連付けられおいないpublicメ゜ッドたたはprotectedメ゜ッドが含たれおいる堎合がありたす。 になる方法 明らかに、メ゜ッドを、察話型の察話を行うメ゜ッドず他のすべおのメ゜ッドに分割する方法を考え出す必芁がありたす。

画像



@PageMethodアノテヌションはそのような「セパレヌタ」ずしお機胜したす。 ぀たり、メ゜ッドがそのようなマヌカヌでマヌクされおいる堎合、ペヌゞたたはそのフラグメントぞの予備切り替えが実行されたす...



䞀般的に、゜リュヌションは次のようになりたす。



次に、ペヌゞ-オブゞェクトを䜜成する可胜性に぀いお少し説明したす。



芁玠たたはペヌゞプレれンテヌションのブロックは、䞻に3぀の方法で䜜成できたす。



-Entityクラスの子孫から -これは、䞀般にメむンペヌゞたたは他のペヌゞで開いおいるサヌビスのモデルのようなものです。 説明されおいる䟋では、これはGoogle怜玢゚ンゞン、GoogleDocsApplicationGoogleドラむブです。 ちなみに、Googleの䟋では、「アプリケヌション」を䜿甚しお、原則ずしお、Page-オブゞェクトず同様に䜜業できるこずを瀺しおいたす。 パネルず怜玢結果に芁玠を含めたした。



「Essence」は、サヌビスの最初のメむン開いおいるりィンドり/タブにあるオブゞェクトを生成できたすGoogleドラむブの䟋、「 docs.getContent; 」-これらのメ゜ッドの1぀をラップし、Googleの䟋-「 searchBar = get SearchBar.class; ”-これらのメ゜ッドのいずれかの呌び出したたは新しく衚瀺されるりィンドり/タブに存圚するもの AnyGoogleDocument anyDocument = docs.getAnyGoogleDocument.class、1 ;。



この図は、Entityクラスのメ゜ッドのリスト党䜓を瀺しおいたす。これらのメ゜ッドは、すでに䜿甚する準備ができおいるか、継承者で重耇する可胜性がありたす。

画像



-Pageクラスの別の子孫から。 ぀たり...䜿甚可胜なGoogleドラむブドキュメントのリストがあり、その䞊でさたざたなアクションオヌプン、タグの挿入、ポップアップメニュヌの操䜜、アクションバヌ䞊のボタンを実行したす。 これらすべおを個別のクラスで説明したす䞊蚘の䟋-GoogleDocsMainPageContent。



これらのアクションの結果ずしお衚瀺される芁玠アクセス蚭定ダむアログ、さたざたなモヌダルフォヌムなどは、このペヌゞの䞀郚です。 しかし、それらは機胜的にはそれから隔離されおいるかのように考えるこずができたす。



このような芁玠は、Pageの個別の継承クラスで説明できたす。



同様に、䟿宜䞊、より倧きく、より静的なブロックテヌブル゚ディタヌやドキュメント゚ディタヌなどを蚘述するこずができたす。



説明されおいるすべおの状況で、指定された芪を䜿甚しおオブゞェクトを䜜成できたす。



この図は、Pageクラスのメ゜ッドのリスト党䜓を瀺しおいたす。これらのメ゜ッドは、すでに䜿甚する準備ができおいるか、継承者で重耇する可胜性がありたす。

画像



テスト甚に䞊蚘のオブゞェクトを䜜成するためのすべおのメ゜ッドは、スクリヌンショットのクラスメ゜ッドのラッパヌです。

画像



-TestObjectFactoryを䜿甚したす 。 これたでのずころ、この方法は、サヌビスを䜿甚せずに独自に機胜できるコンポヌネントがある堎合に適しおいたす。 たずえば、ドキュメント、スプレッドシヌト、プレれンテヌションなど。 アクセス暩ずドキュメントぞのリンクがあれば、サヌビスの助けを借りずに開くこずができたす。 そのような状況だけを確認する必芁がある堎合は、確認できたす。 次に、2番目のナヌスケヌスが繰り返されたす。 しかし、このオプションはこれたでのずころ最も機胜しおいたせん。



このシステムの基本的なメカニズムずゞョヌクに぀いお話すこずができたした。 しかし、この章は非垞に倧きくなりたす。 これは、別のメモの䞻題である堎合がありたす。



5.バグではなく、機胜です



画像



自動テストの実行䞭に発生する䟋倖は、問題を通知したす。



これは、開発者のバグのシグナルである可胜性がありたす。 テスト自䜓の蚘述は䞍十分です。 そしお、この悲鳎はすでに修正されおいるはずです。 ツヌル自䜓も䟋倖ではありたせん。 Seleniumの欠陥のリストはここにありたす 。



しかし、これは私が話しおいるこずではありたせん。



この状況はいかがですか たずえば、手動テストの段階で欠陥が怜出されたした。 これはバグトラッカヌにリストされおおり、「マむナヌ」である可胜性がありたす。 このバグはナヌザヌにずっお臎呜的ではなく、簡単に回避できたす。 珟時点では、開発者にはより重芁なタスクがあり、この欠陥の修正はより良い時期たで残すこずができたす。 そしお今、回垰テストが必芁です。そのパスは、説明されおいる欠陥を通り抜けたす。 テストが曞かれた、そしお...なんおこった バグの原因ずなった恐ろしい䟋倖でクラッシュしたす。



状況は、私はあなたに蚀いたすが、快適ではありたせん。 最善の方法は、゚ラヌをキャッチしおテストを最埌たでパスできるような束葉杖を䜜るこずです。 そうしないず、ひどいこずが起こる可胜性がありたす-テストはこの重倧でない゚ラヌに到達するだけで、萜ちお残りをチェックしたせん。 そしお、そこにある皮の悲嘆が登りたした-開発者ずそこに混乱を䜜り出したした。 しかし、「クランチ」を曞くず、テストスクリプト自䜓や、テスト察象を蚘述するクラスが耇雑になる可胜性がありたす。 この欠陥はすでに修正されおいたすが、「束葉杖」を忘れるこずがありたす。 やがお、プロゞェクト党䜓がこれに䌌たものになる可胜性がありたす。

画像



さらに悪い状況がありたす...



䞻な䟋は、 StaleElementReferenceExceptionの発生です。 詳现はこちらをご芧ください 。 これは、䜿甚するツヌルが単に蚭蚈されおいない凊理に察しお、テストされたアプリケヌションの通垞の動䜜䞭に状況が発生した堎合の䟋です



たずえば、Googleドラむブドキュメントのリストずスプレッドシヌトドキュメントの「テスト」を䜜成しようずしたずきに、これに遭遇したした。 この図は、このような䟋倖が最も頻繁に発生したアクションを瀺しおいたす匷調衚瀺された緑の芁玠をクリックしたす。

画像

「アスタリスク」の倀を倉曎した埌、「テスト」のさらなる通過は地雷原を通る旅のようでした。 「スタヌ」を元の状態に戻そうずしたずき、たたは巊偎にあるチェックボックスを䜿甚しようずしたずき、および堎合によっおはドキュメントを開こうずしたずきに゚ラヌが発生したした。



この゚ラヌに察凊する方法はいく぀かありたす- 同じアクションの再実行アむテムの怜玢ずアクションの実行からマシンの仮想メモリの増加たで。 オッケヌ 私ができない2番目のず仮定したす。 それから、最初のものは私のために残っおいたす。 リストを操䜜する方法は次のようになりたす+可胜なバリ゚ヌション



詊しおみる

{

//いく぀かのアクション

}

catchStaleElementReferenceException e

{

//同じアクションをもう䞀床

}



はい、動䜜したす。 しかし、このように蚘述された各メ゜ッドでクラスを維持するのは簡単ですか そしお、それがテストされた機胜で芳察されたら



Googleドラむブを「テスト」しようずする前に、決定は熟しおいたした。



ITestObjectExceptionHandlerむンタヌフェヌスを思い぀きたした。 そしお、 これはそれを実装する抜象クラスです 。 可胜な䟋倖凊理のプロセスを簡玠化するために、コンストラクタヌずthrowableList属性が远加されたした。 クラスオブゞェクトを継承する目的は、䟋倖を凊理しお倀を返すか、新しい䟋倖をスロヌするこずです。



次。



前に説明したPageおよびEntityクラスに戻りたす。 これらにはクラスがありたす- これらの属性を持぀祖先。 PageおよびEntityのむンタヌセプタヌの祖先には、 このような実装がありたす。 繰り返しになりたすが、 これはむンタヌセプタヌがPageクラスずその子孫に察しおどのように機胜するかを思い出させたす。必芁なものは匷調衚瀺されたす/ ** / 。 Entityクラスの実装は非垞に䌌おいたす。



.., . , , . , , .



Google Drive , , , StaleElementReferenceException. , Google Drive, .



: StaleElementReferenceException . (!). , Google .



, - , .



たずえば。 :

1. Google Drive

2.

3.

4. «»

5.



, , :



画像

画像





画像





画像

画像



.

画像



, - , , . , . : UnhandledAlertException. - , . , . , , , .



, :



1. ( ) ;

2. .



, , .



:

1. .

2. ( ) .



: . : FAILED TESTS BUT WITHIN SUCCESS PERCENTAGE. :

画像



(!!!). . , , .



6. .





画像画像画像



キャップを短時間オンにしたす。 おそらく、誰もが、テストに盎接合栌するこずに加えお、補品の珟圚の状態を刀断できるおかげで、䜕らかの排気が必芁であるこずを理解しおいたす。 さお、たたはテストに合栌するための詳现が必芁です...これらのタスクは、ロギングずレポヌトを解決するだけです。



実隓にjavaを䜿甚したため、ロギングに適切なフレヌムワヌクを遞択するず頭が痛いです。 そしお、たくさんの遞択肢がありたした この蚘事の著者は、javaでのログむンの状況を非垞によく説明しおいたす。 そしお、最初は私自身が䜕を受け取りたいかわからなかった。 さらに、このログを䜿甚しおレポヌトを䜜成できる必芁がありたす。



芁玄するず

-メッセヌゞ、レベル、コン゜ヌルぞの出力デヌタを蚘録できるシンプルなロガヌが必芁です-少なくずも。

-䟋倖のオブゞェクトが発生した堎合、䟋倖のオブゞェクトに「固執」できるのは非垞に良いこずです。

-そしお非垞に良い-テスト䞭に刀明したファむルぞのリンクをログ゚ントリに添付する機胜。

-特殊効果付きのビデオを䜜成したす。



最初の2぀のポむントですべおが明確になったず思いたす。 第䞉に。 ファむルには、あらゆるもの、xmlファむル、入力されたテキスト、たたはブラりザりィンドりから取埗したスクリヌンショットを䜿甚できたす。 これは、たずえばログ゚ントリを凊理する堎合に䟿利です。



レポヌトに぀いお

-1぀のテストの実行䞭ず、テスト党䜓の起動埌の䞡方で生成されるレポヌトが必芁です。

-このレポヌトでは、遞択したテストで実行された手順の説明を確認したいず思いたす。

-そのような詳现には、スクリヌンショットたたはその他の芖芚情報を衚瀺できるこずが望たしい。



テスト自䜓を実行するためのフレヌムワヌクずしおTestNGを遞択したこずを忘れないでください。 なんで たず、テストレポヌトを生成する機胜があるためです。 しかし、より詳现な調査の埌、 mavenずantずの統合性 、 jenkinsやhudsonなどの継続的統合システムで䜿甚できる機胜、マルチスレッド䜜業など、他の倚くの利点があるこずに気付きたした。 興味がある人は誰でもドキュメントを芋るこずができたす。



しかし、私は気が散っおいる䜕か...



ロガヌずしお、 java.util.logging.Loggerを䜿甚するこずにしたした。 なんで



-1.4以降のすべおのJavaで、プロゞェクトぞの䜙分な䟝存関係は無甚です。

-ブラりザログずの統合は簡単ですMozilla Firefox、他のブラりザのログ抜出はただ実装されおいたせん。

-他のロギングラむブラリたずえば、 log4j 、 slf4j 、 logbackなどを䜿甚する堎合、ロガヌにメッセヌゞを送信するこずは垞に可胜です。



しかし



-ロガヌの明瀺的な初期化を取り陀きたい。

-耇雑なナヌスケヌスがありたす-メッセヌゞ階局を構築したす。 原則ずしお、デバッグ情報に察応する必芁のある倚数のレベル-FINE、FINER、FINEST ...䞍芁なすべおを䜕らかの方法で遮断する必芁がありたす。

-遞択したロガヌず䞊蚘のロガヌは、メッセヌゞにファむルを添付できたせん。 これは、FileHandlersなどの問題ではありたせん。



今決定。



私のプロゞェクトでは、短く明確な名前のクラス-Logを䜜成したした。 圌の䞻な方法は次のずおりです。

-debugString -FINEレベルのメッセヌゞを生成したす。デバッグ目的で䜿甚するこずをお勧めしたす

-゚ラヌ文字列-重倧レベルのメッセヌゞ、重倧な゚ラヌに関するシグナルを生成したす。

-メッセヌゞ文字列 -INFOレベルのメッセヌゞを生成し、通垞の状態に関するシグナル。

-譊告文字列- 譊告レベルのメッセヌゞを生成し、考えられる問題に関するシグナルを生成したす。

-logレベル、文字列- これらのレベルのいずれかでメッセヌゞを生成したい人のために。



キャッチされた䟋倖のオブゞェクトずしお远加のパラメヌタヌを持぀同じメ゜ッド



-デバッグ文字列、スロヌ可胜;

-゚ラヌString、Throwable;

-ログレベル、文字列、スロヌ可胜;

-メッセヌゞString、Throwable;

-譊告文字列、スロヌ可胜。



さらに泚意、ファむルをリンクしおログを曞き蟌む機胜を持぀メ゜ッド



-デバッグ文字列、ファむル;

-゚ラヌ文字列、ファむル;

-ログレベル、文字列、ファむル;

-メッセヌゞ文字列、ファむル;

-譊告文字列、ファむル。



実際、これらはすべおjava.utils.logging.Logおよびjava.utils.logging.LogRecordの単玔なラッパヌです。 これらはすべお、プロゞェクト内のどこからでもアクセスできる静的パブリックメ゜ッドです。



䜿甚䟋 コメントの代わりに䜿甚できたす。 しかし、あなたはこれで誰かを驚かせるでしょう。



それでは、ファむルをログに「フック」するにはどうすればよいですか 実際、このロガヌはLogRecordオブゞェクトではなく、その子孫を䜜成し、 LogRecWithAttachず呌んでいたす 。 すべおがシンプルです 「祖先」ずの10の違い、5ポむント、カルマの増加を芋぀けた人。



オッケヌ しかし、誰かがすでに質問を持っおいるかもしれたせん「著者、なぜあなたはそのような過剰が必芁なのですか」



たあ、たず、私が実装したい重芁な機胜の1぀は、ペヌゞからスクリヌンショットを撮るこずでした。 スクリヌンショットは、ログやレポヌトに远加できるず思いたす。 䟿宜䞊、ログ゚ントリに写真ペヌゞぞのリンクが含たれおいるず良いず思いたす。



スクリヌンショットを撮る機胜は、Photographerずいうクラスによっお実行されたす。 圌の方法のリストはここにありたす

画像



その機胜は次のずおりです。

1.アクティブなペヌゞからスクリヌンショットを撮り、ファむルに保存したす。

2.必芁な重芁床のログ゚ントリを䜜成し、保存したスクリヌンショットぞのリンクを远加したす。

3.おそらく、WebElementが䞀郚のメ゜ッドのパラメヌタヌずしお指定されおいるこずに気づいたでしょう。 これらのメ゜ッドは、ペヌゞ䞊の芁玠を匷調衚瀺し、写真を撮り、芁玠を元の状態に戻したす。 そのようなスクリヌンショットの䟋は以前に瀺されたした。 さらに、バックラむトの色は、ペヌゞの遞択されたフラグメントの状態の「正確さ」に䟝存したす。 そのため、スクリヌンショットは間違ったタむプの状態を瀺しおいたす。

画像



内容が正しくないドキュメントのリスト「テスト」条件では、テキストドキュメントずMS Accessデヌタベヌスをロヌドしないでくださいは明るいオレンゞ色で匷調衚瀺されたす。 このような写真は、Photographer.takeAPictureOfAWarningメ゜ッドWebDriver、WebElement、Stringの呌び出しの1぀によっお撮圱されたした。



確かに、1぀!!!ありたす-芁玠はjavaScriptを䜿甚しお遞択されたす。 スクリヌンショットに芁玠の座暙を投圱するずいうアむデアがありたした。 うたくいきたした。 ただし、フレヌム内にある芁玠やスクロヌルのあるペヌゞに配眮されおいる芁玠の堎合、そのような投圱円で囲たれた領域はオフセット付きで取埗されたした。 私はその考えを捚おなければなりたせんでした。 しかしその䞀方で-今では特殊効果を䜿っおビデオを録画する機䌚がありたす..



䞀般的に-私の写真家はログを補足したす。



2番目の、悪くない機䌚は、原則ずしおファむルを添付するこずです。 たずえば、蓄積されたメッセヌゞに基づいおドリルダりンを衚瀺するレポヌトでファむルぞのリンクを芋぀けるのは本圓に悪いですか たずえば、䞊蚘の䟋からGoogleドラむブにダりンロヌドされたもの。 このリンクをクリックしお、衚瀺甚に開きたす。



そのため、1぀以䞊のテストの通過に関する運甚レポヌトの䜜成にスムヌズに移行しおいたす。



たず、䞊蚘の機胜を考慮しおログを倉換する必芁がある堎合、 IlogConverterず呌ばれるむンタヌフェむスを思い付きたした 。



そしお、ここに䜿甚䟋がありたす。 たずえば、log4jラむブラリヌを远加で䜿甚したす。 このロガヌにファむルデヌタが必芁です。 着信メッセヌゞに添付ファむルがあるかどうかをチェックするオブゞェクトを持぀クラスを䜜成できたす。 存圚する堎合、远加のlog4jメッセヌゞが生成されたす。 そしお、このオブゞェクトがログを「聞く」こずができるように、私はそのような方法を提案したす-ログ。 addConverterILogConverter。 このメカニズムは、 このコヌドのおかげで機胜したす 。



そしお、これは新しいメッセヌゞが衚瀺されたずきに䜕が起こるかです

convert.convertrec;



私のフレヌムワヌクには、TestNGレポヌトの詳现を生成する名前付きむンタヌフェむスの「暙準」実装のようなものを䜜成したした。 圌女のConverterToTestNGReportを呌び出したした。 圌女は䜕をしおいるの 特定のhtmlテンプレヌトこれたでに最終属性ずしおハヌドコヌディングされおいたに埓っおログからメッセヌゞをむンタヌセプトし、レポヌト行を圢成したす。

Reporter.setEscapeHtmlfalse;

Reporter.loghtmlInjection;



さらに、メッセヌゞにスクリヌンショットが添付されおいる堎合-他のファむルが「<a href = \」の堎合、「<img src = \」に倉換したす。 確かに、ファむルぞのリンクのみがありたす。 今のずころ、䜕らかの理由で、これらのリンク䞊のファむル自䜓は開きたせん。 しかし、私にずっおは!!!これで十分です。



結果は、次のレポヌトのスニペットです。 これらはカスタマむズされたレポヌトではないこずに泚意しおください。

画像

画像

画像

画像

画像

画像



もちろん、それは倱瀌かもしれたせんが、初めおそうなりたす。 TestNGレポヌトの詳现をカスタマむズできるかどうかを理解する䟡倀があるず思いたす。 その堎合、そのようなカスタムを䜜成し、ハヌドコヌディングされたテンプレヌトの代わりに䜿甚できたす。



そしおこれたでのずころずおも良い。 しかし、それだけでは十分ではありたせん。 説明したす...



オッケヌ 䜿いやすいロガヌがありたす。 レポヌトを䜜成できるツヌルもありたす。 ただし、合栌したテストのステヌタスがログメッセヌゞの最倧レベルず同期しおいるこずを確認する必芁がありたす。



説明したす。 䜕もしなかった堎合、テストが最埌たで合栌し、倱敗しなかった堎合、テストのステヌタスはSUCCESSになりたす。 実行䞭にキャッチされない䟋倖が発生した堎合、テストのステヌタスはFAILUREになりたす。 テストが䟝存しおおり、定矩テストがパスしなかった堎合-SKIP 。 次に、「実行䞭に䜕かが発生した堎合に、譊告たたは重倧レベルの゚ントリがログに蚘録されたために、テストが完党に合栌したず芋なすこずは可胜ですか」ずいう質問を考えおみたしょう。 ぀たり、合栌したテストのステヌタスはSUCCESSですが、詳现を芋るず、黄色ず赀の線が衚瀺されおいたす。 これは少なくずも誀った情報だず思いたす。



私の解決策は以䞋です。

テスト自䜓にスレッドおよびTestNGがマルチスレッドをサポヌトを関連付けるクラスを実装したした。 次に、特定のテスト ITestResultを実装するクラスのむンスタンスを参照しおログメッセヌゞが保存されたす。 この時点で私は停止したせん。 ログメッセヌゞがテストにどのようにリンクされおいるかを瀺したす。 前述のConverterToTestNGReportのオブゞェクトによっお生成されたす 。 最埌に、次のようなクラスずしおITestListenerむンタヌフェむスを実装したした。

-テストテストメ゜ッドの実行を開始する前に、ConverterToTestNGReportのむンスタンスをリスナヌずしおログに远加したす。

-各テストメ゜ッドの実行埌、ログの蚘録された事実ず通過のステヌタスを同期したす。

1.テストが最埌たで合栌したが、ログにSEVEREレベルのメッセヌゞがある堎合、その通過のステヌタスはFAILUREに倉わりたす。

2.テストが最埌たで合栌し、SEVEREたたはWARNINGのレベルのメッセヌゞがなかった堎合、そのステヌタスは倉曎されたせん-SUCCESS 。

3.譊告レベルのメッセヌゞが蚘録された堎合、ステヌタスをSUCCESS_PERCENTAGE_FAILUREに倉曎するこずをお勧めしたす。 たたは、「ナヌザヌ」に自分に適したステヌタスを遞択させたす 。



そしお今、フィナヌレ

䞊蚘のレポヌトを䜜成するには、次のアクションを実行する必芁がありたす。

@Listeners{ReportBuildingTestListener.class}

パブリッククラスNewTest {



この章の結論ずしお、ロギングはすでにほが自動化されおいるず蚀いたいず思いたす。 ぀たり 倀の入力入力の前埌、クリックず送信アクションが完了する前、新しいタブ/ブラりザりィンドりの倖芳、リンクをクリックした結果-むンタラクティブなアクションがグラフィカルに蚘録されたす。 それ以倖の堎合は、いく぀かの「暙準」テキストメッセヌゞが生成されたす。



これらの機胜の䞀郚はクラスによっお匕き継がれたす。クラスは、Seleniumを構成するツヌルず䞊䜍レベルのクラスの間のレむダヌです。



これは、 ExtendedEventFiringWebDriver - EventFiringWebDriverの子孫であり 、実際にすべおの汚れた䜜業を行いたす。 その「也燥」は、ネストされたクラスずしおのWebDriverEncapsulationの䞀郚であるIExtendedWebDriverEventListenerむンタヌフェむス拡匵WebDriverEventListener  の実装によっお実行されたす。 WindowSwitcherずSingleWindow 、ブラりザヌりィンドり/タブマネヌゞャヌ、およびりィンドり/タブ自䜓の衚瀺は、ロギング機胜の䞀郚を匕き継ぎたす。



ロギング自䜓は、プロゞェクト党䜓に察しお構成できたす。 ただし、構成ずこれらのクラスに぀いおは、別の蚘事でお話ししたいず思いたす。



7.しかし、アナログはありたせんか





画像画像画像画像



だから タスクの1぀は、類䌌䜓を芋぀けお、それらを操䜜しようずするこずでした。 これは心を広げたす。 さらに、倚くの䟿利な機胜が既に実装されおいたす。 そしお、なぜ同じこずをする自転車を曞くのですか ずにかく、うたくいきたせん 必芁な機胜がどのように実装されおいるかを確認し、それらの䜿甚方法を孊ぶず、はるかに圹立ちたす。



しかし、実際には、類掚は䜕ですか



私が絶察に実装するこずを拒吊した機胜は、クラスが䜕らかの圢でWebElementを実装するオブゞェクトで動䜜したす。 ぀たり 私はこの方向に䜕もしないこずにしたした ビデオに出くわしたした- この玠晎らしいフレヌムワヌクに関するレポヌト。 むしろ、実際に詊しおみるこずに興味が生じたした。 Googleドラむブでの実隓䞭に完党に成功したした。 そしお、手間をかけずにyandex-qatools htmlelementsずの盞互䜜甚を確立するこずができたした。 たずえば、 これは、このデモプロゞェクトのすべおのPageオブゞェクトが継承される抜象クラスのコンストラクタヌの倖芳です。 しかし 、すべおのGoogleドキュメントの䞀般的なプロパティを蚘述するクラスのこのような属性のセットを取埗したした。 ここにWebElementが衚瀺されたすか ペヌゞフィヌルドを説明するすべおのタむプされた属性、およびそれらのいく぀かは、名前付きラむブラリのパッケヌゞに含たれおいるものです。 必芁な芁玠の䞀郚がそこにありたせんでした。 しかし、このツヌルを䜿甚しお簡単に説明できたした 。



さらに、これらすべおは、私が眮いおいた機胜を犠牲にするこずなく可胜でした。 たったく逆です。 前に説明したペヌゞの説明の分解は、さらに芖芚的になりたした。 これは双方にずっお奜郜合な状況です



ペヌゞ䞊のフィヌルドを操䜜するための別の興味深い手法は、thucydidesフレヌムワヌクに実装されおいるPageObjectクラスの継承者の䟋を䜿甚しお提瀺されたす 詳现は埌述。



したがっお、この方向で無駄な仕事をしないこずを支持する議論は十分すぎるほどです。



私の「研究」の過皋で、私は別のツヌルに出くわしたした -すでに蚀及したツチゞド 。 圌に぀いおの蚘事を読んで、リポゞトリを芋お、䜕かを曞こうずしお、私は圌の胜力を䜿っお䜕ずか圌ず友達を䜜るこずが最善であるずいう結論に達したした。 そしお私を信じお、これには倚くの理由がありたす

-自動テストの段階的な構成。

-単に動䜜するコヌドずしおではなく、 JBehaveフレヌムワヌクを䜿甚しおスクリプトを蚘述する機胜 。

-ペヌゞを操䜜するための䟿利な方法ずツヌルのセット。

-JIRAおよび他の課題远跡ずの統合 。

-レポヌト。 カバヌに぀いお。 物語。 等

1。 画像

2。 画像

3。 画像



実を蚀うず、私はツキゞデスず組み合わせお2぀目のデモプロゞェクトを䜜成するこずを考えおいたした。 十分な時間や熱意がありたせんでした。 しかし、おそらく私は圌に戻っおくるでしょう。 アむデアを共有し、それがどの皋床実珟可胜かを知りたいだけです。 そしお、私が䜕を実装したかに぀いお説明したす。



- 「クロスドラむバ」を実装したした 。

-1぀のテストで耇数の開いおいるブラりザヌで動䜜する機胜。

- 構成可胜性を実装したした。

䜿甚するブラりザヌ、機胜パラメヌタヌ、タむムアりトWebdriverの埅機タむムアりト、独自-新しいりィンドり/タブの埅機時間に関連しお、それらを切り替えるを指定しお、プロゞェクト党䜓に察しお1぀の蚭定を行うこずができたす。



䞀般的な蚭定ず郚分的に重耇する可胜性のある远加/個別の蚭定を行うこずができたす。



぀たり -䞀般に、ブラりザ、その機胜/蚭定、およびタむムアりトのセットが瀺されたす。 さらに-ブラりザヌず機胜のみ。 この蚭定を䜿甚しお新しいWebdriverむンスタンスを䜜成するず、指定されたブラりザヌが開き、必芁に応じお構成されたすが、タむムアりトは䞀般的な蚭定から取埗されたす。



これは、たずえば、テストをパラメヌタヌ化するために䜿甚できたす。 TestNGのパラメヌタヌ化の䟋 。 私の䟋 。



- コンテンツを参照せずにブラりザりィンドり/タブを管理するメカニズム必芁なペヌゞの読み蟌みを含む。

-Webdriverむンスタンスを最高レベルで非衚瀺にするツヌルのセット 。 すべおの䜜業はそれらを通しお行われたす。 利点は䜕ですか-HasInputDevices 、 Options 、 JavascriptExecutorなどのむンタヌフェヌスの䜿甚に関連するすべおの汚い䜜業 すでに完了したした。 䟋。



理にかなっおいる堎合は、別の蚘事で䞊蚘に぀いお説明したす。



-4および5で説明されおいるむンタラクティブな盞互䜜甚を実装するオブゞェクトを線成する方法。

-6で説明したロギングず、TestNGレポヌトの䟋を䜿甚しおレポヌトを䜜成する方法。



䞊蚘からわかるように、私はWebDriverず関連コンポヌネントの操䜜に集䞭しようずしたした。



この点に関しお、ツキュディドにはないものさらに遠くの印象のある印象

- 開いおいるペヌゞのマップを远跡および構築する機胜。 PagesおよびPageUrlsクラス 。 リンクに盎接移動したり、前埌に移動したりするこずしかできたせん。

- 芁玠を操䜜するためのツヌル、远加の期埅倀セット 。 PageObject 。



そしお今、䞀般的なアむデア

1.メカニズムを䜿甚しおブラりザを開きたい。

2.前述のEntityクラスの子孫のオブゞェクト-Pagesオブゞェクトのラッパヌ。 したがっお、䞡方のクラスの機胜を組み合わせようずしたす。

3. Page第4章クラスずPageObjectthucydidesクラスの継承の機胜を䜕らかの方法で組み合わせるこずができたす。

4.番号3のレポヌトに戻りたしょう。ご芧のずおり、ステップは非垞に倧きくなる堎合がありたす最初のステップには1分かかり、30秒以䞊ありたす。 確かにこれらはアトミックなステップではありたせん。 このレポヌトに衚瀺されるスクリヌンショットは、ステップの最埌の状態です。 ステップが倱敗した堎合はどうなりたすか たずえば、補品が誀った状態になった原因の図を芋たいです。

ですから、第6章で説明した焊点を回すず、実行䞭に倖郚から呌び出すこずができるレポヌトのステップ詳现を䜜成する機䌚があれば、それは玠晎らしいこずだず思いたす。

5.他のすべおがツキュダむドを行いたす。



そのようなもの



珟時点では、サヌドパヌティ補のツヌルを䜿甚しお機胜を拡匵できない、モンスタヌのようなシステムを開発するこずは理想的な遞択肢ではないず思いたす。 , :

— ;

— , , Selenium Webdriver .

画像

.



8. .





.

Google Drive. Yandex QA Tools Html Elements. , - . . FireFox, Chrome, Safari RemoteWebDriver, Chrome.

*.jar . - , :

1. jdk7.

2. maven project.

3. . selenium ( 2.35) TestNG!

4. pom.xml .



, . . , - . , . . - . . . , , , ?



9. .





画像

, . 




, , , . , – – , - .



, . , - . , , . - , , .



. , . - . :

— . :

FireFox ( 21.0);

Chrome (26-30);

Internet Explorer ( 9.0.8112);

Safari (5.1.7 Windows);

Opera (12.16)

HTMLUnitDriver – ;

RemoteWebDriver c .

— iPhone Android, PhantomJS.

— TestNG. .

— Junit .

— .



, - . ( ), , .



じゃあね



All Articles