テストツールとテスト自動化(2)

QUES TECH

テストツールを使ってみよう!

Selenium big-logo

弊社内で、Seleniumを利用しテストを自動化する場合、環境は以下のようになります。

作成環境

  • MacOSX, Windows 
  • Firefoxadd-on : Selenium IDE , Firebug , FirePath , User Agent Switcher)
  • Java
  • Eclipse, Selenium

実行環境

サーバー側

  • Linux
  • Java
  • Selenium-server-standalone Grid(hub)
  • Jenkins

クライアント側

  • Windows7/8, MacOS, iOS, Android
  • Firefox, Chrome, InternetExplorer, Safari
  • Java
  • Selenium-server-standalone Grid(node)

そして、テスト自動化の全体的な手順は、以下のようになります。

  1. 自動化するテスト(シナリオ)を決定する。
  2. Selenium IDEを利用し、テストする為の操作を記録する。
  3. 作成されたテストスクリプトを、WebDriver(Java)に変換(エクスポート)する。
  4. スクリプトをEclipseに取り込み、実行する。
  5. 動かない箇所の修正(デバック)や、期待値等の検証ポイントを設定する。
  6. 実行環境を構築する。
  7. テストを実行する。

テストといいつつも、テストスクリプトの「開発」です。手順の中でも4の実行では大概まともに動きません。こんなときは、Google先生!と一生懸命同じような事例を探すのですが、解決方法がなかなか見つからない/探せないことがしばしばありました。(単に英語が苦手なだけかもしれません)

この動かないときのエラーは、ほぼ2択になるのではないでしょうか。

  • NoSuchElementException
  • ElementNotVisibleException

「NoSuchElementException」の場合、言葉通りですが、Element(要素)が見つけられない状況にあります。考えられる原因と解決方法は

  1. レスポンスが遅くて、まだ表示されていない。
    1. 待ち時間を長めにしてみる。
  2. 想定している画面に遷移していない。
    1. 直前の動作をよく見て、間違った動作をしてないか確認し修正する。
  3. スクリプトがおかしい。(記録されていない?)
    1. 別Windowが開いたり、iFrameの中に操作対象がある場合によく発生する。下記のスクリプト例1を参照。
  4. Elementの探し方が良くない。
    1. findElementの指定方法を変更してみる。多くの場合、By.XPathの指定方法へ変更することによって解決できます。(FirePathの活用)

「ElementNotVisibleException」の場合、これも言葉通りですが、Element(要素)を見つけたものの、見えない/押せない状況にあります。考えられる原因と解決方法は

  1. レスポンスが遅くて、まだ対象が非表示(不活性)状態で押そうとしている。
    1. 待ち時間を長めにしてみる。
  2. 同一定義のElementが複数存在し、たまたま、見えない位置にあるElementを押そうとしている。
    1. 一意となるElementの指定方法=By.~を設定する。(FirePathの活用)しかし、一意にならない場合、List形式にElementを複数取得し、操作可能か判定してから、操作する。

上記以外のエラーが様々ありますが、原因追究と確認の際に必須なのが、Firefoxのadd-onである「Firebug」と「FirePath」です。特にFirePathのXPath,CSSは、SeleniumのBy.XPath(“xxx”)やBy.CSS(“yyy”)にて指定する文字列が正しいかどうか確認する時に重宝します。また、スマートフォンのスクリプトを作成する際には、「UserAgent Switcher」にて、UserAgentを切り替えてXPath等を確認できます。

目的の操作を行い、一連の自動テストとして動作させるには、時として手動テストよりコストがかかってしまう事があります。また簡単に動かないと、なんとかして動かそうとして、本来のテスト目的から外れる場合もあります。複数回テストする事が予め予定されており、かつ重要度の高いテスト項目(手順)から、徐々に自動化を進めてみてはいかがでしょうか?

 

 


※スクリプト例1

IDEから変換したスクリプトソースに以下のようなエラーがある

driver.findElement(By.linkText(“http://xxxx.co.jp/xxxxx”)).click();
// ERROR: Caught exception [ERROR: Unsupported command [selectWindow | name=XXX | ]]
driver.findElement(By.linkText(“yyyyy”)).click();

これは、クリックした時に別Windowが表示される場合や、1画面内でも、Frameが利用されている場合によく発生します。IDEのコマンドで、SelectWindowがある(たまに記録されない)場合は、Javaに変換できず、そのまま実行すれば、次行でエラーになってしまいます。

解決方法としては、Frameや別Windowに操作対象を切り替える必要があります。

driver.findElement(By.linkText(“http://xxxx.co.jp/xxxxx”)).click();
// ERROR: Caught exception [ERROR: Unsupported command [selectWindow | name=XXX | ]]
WebDriver frame = driver.switchTo().frame(0)
frame.findElement(By.linkText(“yyyyy”)).click();

※Window切り替えの場合、driver.switchTo().window(”WindowName”)