PythonとSelenideでWeb UIテストの自動化を加速

RTL-Service社のタスクの1つは、高精度のローカルポジショニングシステムを開発し、暗号化されたチャネルで音声通信を提供することで、Webクライアントを開発することです。







Webクライアントの絶え間ない開発(最適化、追加機能の出現)に関連して、自動テストのテスターと開発者が費やす時間を最小限に抑えるタスクは特に重要です。 以下は、テスト部門のスタッフがSelenideとPythonを使用してUIテストの開発を加速した経験です。



セレン化物には明らかな利点があるようです。 まず、SelenideはSelenium Webdriverの最上位ソフトウェア層であり、標準のSelenium操作の実行にかかる時間を短縮し、その結果、自動テストの作成とサポートを高速化します。 第二に、私たちの場合、SeleniumテストはJavaで記述されていたため、同じ言語のソフトウェアプラットフォームを選択することになりました。



特に、Selenideの「すぐに使える」には、失敗したテストの自動スクリーンショット、単一行へのアップロードまたはファイルのダウンロード、テスト環境の迅速な展開(「http://rtlservice.com/」)などの便利な機能が多数あります。その他多数。 テストがエラーで終了すると、コンソールに次のように表示されます。

Element should not be exist {By.name: infoEdit} Element: '<div class="icon btn size-2" name="infoEdit" title=""></div>' Screenshot: file://build/reports/tests/1458565041545.0.png
      
      





そしていつものように完全なスタックトレース。

この場合、1458565041545.0.pngは、問題の正確な場所を確認できるブラウザーウィンドウのスクリーンショットです。



システムのメインブラウザーはChromeであるため、Debian 7でメインスクリプトがテストされます。最初の段階では、Webドライバーの初期化に問題がある可能性があります。 従業員がさまざまなシステムでテストを実施した結果、この問題はプラットフォーム自体よりもオペレーティングシステムに関係していると結論付けられました。 これを排除するために、chromedriverを使用してRemoteWebDriverのインスタンスが初期化コードで作成され、静的なsetWebDriverメソッドを介してSelenideに渡されました。 このメソッドを実装するには、およそ次の一連のアクションを実行しました。

1. chromedriverをインストールします。

2. chromedriverの実行はsudoではありません。 デフォルトでは、127.0.0.1:9515から始まります。

3.注釈を使用してドライバーを作成する前に

 @Before public void openBrowser () throws Exception { driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), DesiredCapabilities.chrome()); WebDriverRunner.setWebDriver(driver); driver.manage().window().maximize(); //     }
      
      





さらに、Selenideを使用するもう1つの重要な利点は、DOMで要素自体を管理するための高度な方法が存在することです。 たとえば、Seleniumで要素のisSelected()をチェックするclick()メソッドにすべてが由来する場合、Selenideにはチェックボックス/ラジオボタンまたはリストを選択する機能があります。

たとえば、プロジェクトではOpenLayersを使用しているため、Selenideでレイヤー(オン/オフ)をより便利に処理するために、すべてのチェックボックスから選択を削除するかなり簡潔なデザインを作成できます。

 for (SelenideElement checkBox : $$(By.tagName("input")).filterBy(Condition.hasAttribute("type", "checkbox"))) { checkBox.setSelected(false); }
      
      





画像

同様に重要な点は、「スマートな期待」を使用することです。 「スマートな期待」は、WebDriverWaitを積み上げたり、Thread.sleepを介して要素の出現時間を選択したりすることなく、コードを読みやすくします。

Selenideの場合、次のように書くだけです。



 $(By.id("select-map-div")).waitUntil(Condition.visible, 5000);
      
      







ここで、5000は要素が表示されるまでSelenideが待機するミリ秒単位の時間です。

注:要素が4秒までの間隔で表示されることが確実な場合は、shouldメソッドのみを使用するだけで十分です。 この場合、Selenideはエラーが表示されるまで4秒間待機します。 もちろん、この時間は構成で変更できます。



したがって、このようなニュアンスでは、Selenideを使用すると、テストの作成とテストのサポートの両方で多くの時間を節約できます。少なくとも、より明確な構造を使用する場合は、アサーと比較する必要があります。

Selenideの機能の詳細については、このツールの開発者による記事( https://habrahabr.ru/post/274071/ )をご覧ください



テスト開発を高速化するための2番目の重要な詳細はPythonの使用です。これはテストに柔軟性を追加し、テスターの生活を楽にする追加ユーティリティを迅速に開発するために使用されます。

Pythonは、その解釈可能性によりテストの柔軟性を高め、定期的に変更されるAPIを操作できるようにします。 つまり、JavaからPythonスクリプトを呼び出すだけで、イベント、場所、マップなどのテストコードに変更を加えることなく、常に関連データを取得できます。



さらに、このデータベースの構造をバージョンごとに更新するプロセスで、データベースから選択して必要なデータを取得することが可能になります。 私たちの場合、これはデバイス番号を取得し、テスト自体からデバイス番号をさらに呼び出すために使用されます。



この項目は、テストプロセスで仮想デバイスと実デバイスの両方を使用し、データベースからの選択を必要なデバイスのMACアドレスの配列に置き換えてテストを実行する機能も意味します(デバイスファームウェアの問題も特定できる場合があります)。



Pythonでは、手動テスト用のさまざまな内部プログラム用のスクリプトも記述されており、よりインタラクティブなシェルを提供します。 間違いなく、bashをこれに使用できますが、主観的には、Pythonのエントリのしきい値が低く、問題がある場合はPythonを修正する方が簡単です。



したがって、一方でSelenideを使用すると、自動テストの開発速度が30%向上し、サポートが大幅に容易になりました。また、一方でPythonを使用すると、動的に変化するシステムでテストの柔軟性を実現できました。



著者:ニコライ・フェドロフ、ニコライ・スミルノフ



All Articles