テストツールを使ってみよう!
弊社内で、Seleniumを利用しテストを自動化する場合、環境は以下のようになります。
作成環境
- MacOSX, Windows
- Firefox(add-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)
そして、テスト自動化の全体的な手順は、以下のようになります。
- 自動化するテスト(シナリオ)を決定する。
- Selenium IDEを利用し、テストする為の操作を記録する。
- 作成されたテストスクリプトを、WebDriver(Java)に変換(エクスポート)する。
- スクリプトをEclipseに取り込み、実行する。
- 動かない箇所の修正(デバック)や、期待値等の検証ポイントを設定する。
- 実行環境を構築する。
- テストを実行する。
テストといいつつも、テストスクリプトの「開発」です。手順の中でも4の実行では大概まともに動きません。こんなときは、Google先生!と一生懸命同じような事例を探すのですが、解決方法がなかなか見つからない/探せないことがしばしばありました。(単に英語が苦手なだけかもしれません)
この動かないときのエラーは、ほぼ2択になるのではないでしょうか。
- NoSuchElementException
- ElementNotVisibleException
「NoSuchElementException」の場合、言葉通りですが、Element(要素)が見つけられない状況にあります。考えられる原因と解決方法は
- レスポンスが遅くて、まだ表示されていない。
- 待ち時間を長めにしてみる。
- 想定している画面に遷移していない。
- 直前の動作をよく見て、間違った動作をしてないか確認し修正する。
- スクリプトがおかしい。(記録されていない?)
- 別Windowが開いたり、iFrameの中に操作対象がある場合によく発生する。下記のスクリプト例1を参照。
- Elementの探し方が良くない。
- findElementの指定方法を変更してみる。多くの場合、By.XPathの指定方法へ変更することによって解決できます。(FirePathの活用)
「ElementNotVisibleException」の場合、これも言葉通りですが、Element(要素)を見つけたものの、見えない/押せない状況にあります。考えられる原因と解決方法は
- レスポンスが遅くて、まだ対象が非表示(不活性)状態で押そうとしている。
- 待ち時間を長めにしてみる。
- 同一定義のElementが複数存在し、たまたま、見えない位置にあるElementを押そうとしている。
- 一意となる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(“https://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(“https://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”)