Selenium実践入門ー自動化による継続的なブラウザテスト
Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)
技術評論社
著者:伊藤望、戸田広、沖田邦夫、宮田淳平、長谷川淳、清水直樹
はじめに
本書について
目次
Part 1 Seleniumの基礎知識
第1章 テスト自動化とそのメリット
1.1 手作業によるソフトウェアテストの問題
どんどん大きくなる回帰テストのコスト
同じテストを環境ごとに何度も実施する必要がある
開発・テスト作業効率の低下
1.2 テストの自動化とは
1.3 さまざまな種類の自動テストツール
ユニットテストツール
画面テストツール
静的解析ツール
負荷テストツール
セキュリティテストツール
1.4 テストを自動化するメリット
回帰テストの実行コストを抑えられる
似たようなテストを何度も実施できる
開発フェーズの問題をすばやく検出できる
市場の変化にすばやく追随できる
システムの改善を諦めなくてよい
手動テストよりも正確でミスがない
一定の品質を確実に保証できる
快適に開発を行える
1.5 自動テストツールの使い分け
第2章 Seleniumの概要
2.1 Seleniumとは
Seleniumのしくみ
多様なブラウザ・プラットフォームで利用できる
Seleniumを支えるコミュニティ
2.2 Seleniumを構成するツール群
Selenium WebDriver
Selenium RC
Selenium IDE
Selenium Builder
COLUMN Selenium 3
2.3 ブラウザテストの標準仕様へ
Part 2 WebDriver
第3章 WebDriver入門
3.1 セットアップとスクリプトのサンプル
Java
セットアップ
Jarを直接利用する方法
Mavenを利用する方法
Gradleを利用する方法
スクリプトの書き方
テストフレームワーク
Ruby
セットアップ
スクリプトの書き方
テストフレームワーク
JavaScript
セットアップ
スクリプトの書き方
テストフレームワーク
C#
セットアップ
スクリプトの書き方
テストフレームワーク
Python
セットアップ
スクリプトの書き方
テストフレームワーク
3.2 さまざまなドライバのセットアップ
FirefoxDriver
ChromeDriver
InternetExplorerDriver
IEDriverサーバのセットアップ
Internet Explorerの設定
保護モードの設定
拡張保護モードの設定
レジストリの設定
SafariDriver
PhantomJSDriver
PhantomJSとは
PhantomJSのセットアップ
PhantomJSDriverのセットアップ
第4章 WebDriverコマンド徹底解説
4.1 ブラウザの生成と破棄
ブラウザの生成
ブラウザの破棄
テストフレームワークとの組み合わせ
初期化処理と終了処理
値のチェック
Capabilities
4.2 ドライバ固有の設定
FirefoxDriver
Firefoxプロファイルの指定
プロファイルとは
Preferenceの変更
アドオンの追加
プロファイルフォルダの指定
Firefox実行ファイルの指定
ChromeDriver
オプションの指定
Chromeのコマンドライン引数の指定
Chrome拡張の追加
Chrome実行ファイルの指定
Preferenceの変更
InternetExplorerDriver
Capabilities
SafariDriver
4.3 要素の取得
findElements
ロケータ
By.id
By.name
By.tagName
By.className
COLUMN ロケータの調べ方
By.linkText
By.partialLinkText
By.cssSelector
By.xpath
子孫要素の取得
4.4 要素の操作
URL遷移
クリック
キー入力
チェックボックスの選択
ラジオボタンの選択
プルダウンの選択
複数選択可能なselect要素
Selectクラスの各種メソッド
submit
4.5 要素情報の取得
表示・非表示
有効・無効
存在するかどうか
選択状態
属性
テキスト
タグ名
CSSプロパティ
サイズ
位置
4.6 ブラウザ情報の取得
タイトル
URL
HTMLソース
ウィンドウ位置
ウィンドウサイズ
Cookie
Cookieの取得
Cookieの追加
Cookieの削除
4.7 ブラウザの操作
画面キャプチャ
画面キャプチャの取得範囲
JavaScriptの実行
返り値の取得
引数の指定
非同期メソッドの呼び出し
ナビゲーション
戻る
進む
リロード
4.8 待ち処理
Implicit Wait
Explicit Wait
WebDriverWait
最大待機時間の指定
さまざまな待機方法の指定
任意の条件による指定
待機失敗時のエラーメッセージの指定
待機条件判定を行う間隔の指定
ページ読み込みの待ち時間
4.9 ポップアップ・ウィンドウ・フレーム
ポップアップ
Alertダイアログ
Confirmダイアログ
Promptダイアログ
SafariDriver,PhantomJSDriverの場合
ウィンドウ
SafariDriverの設定
名前のないウィンドウ
ウィンドウハンドルによる特定
ウィンドウタイトルによる特定
ウィンドウを閉じる
タブ
フレーム
iframe要素
frame要素
入れ子のフレーム
4.10 その他のコマンド
アクション
ダブルクリック
右クリック
マウスの移動
ドラッグアンドドロップ
キーを押しながらクリック
Actionsのメソッド一覧
イベントリスナ
指定可能なイベント
イベントリスナの解除
ログ取得
ログレベルの指定
第5章 WebDriverコマンドの実践的活用
5.1 さまざまな画面操作
ファイルアップロードダイアログ
ファイルダウンロード
FirefoxDriver
ChromeDriver
InternetExplorerDriver
SafariDriver
Basic認証ダイアログ
InternetExplorerDriver
SafariDriver
5.2 さまざまなエラーチェック
JavaScriptエラーのチェック
画像が表示されているかのチェック
HTTPステータスコードの取得
セットアップ
利用方法
5.3 HTML5の新機能
input要素
テキスト・数値のinput要素
日付・時刻のinput要素
typeがrangeのinput要素
typeがcolorのinput要素
Web Storage
Session Storage
Local Storage
ChromeDriverの場合
Canvas
第6章 スクリプトの効率的なメンテナンス
6.1 ページオブジェクトパターン
ページオブジェクトパターンを使ったスクリプト
可読性の向上
共通化の基準がわかりやすい
目的のメソッドを見つけやすい
ページオブジェクト作成の指針
画面操作を抽象化したメソッドを提供する
ページ遷移を伴うメソッドは,新しいページオブジェクトを返す
遷移先ページが異なるメソッドは別のメソッドにする
Assertionロジックをページオブジェクトに含めない
ページ遷移の際に,きちんと遷移できたことをチェックする
@FindByとPageFactory
メカニズム
@FindByの引数の指定方法
@CacheLookup
その他の機能
6.2 データ駆動テスト
2つのテストランナー
Parameterizedテストランナーを使った方法
Theoriesテストランナーを使った方法
Part 3 便利なライブラリ
第7章 Geb
7.1 Gebとは
7.2 Groovy
Javaと比べて簡潔な記述
動的型付け言語である
defキーワードによる宣言
名前付き引数
プロパティ
クロージャ
delegate
7.3 セットアップ
Groovyプラグインのインストール
Gradleプラグインのインストール
プロジェクトの作成
7.4 Gebのテストスクリプト
7.5 基本のブラウザ操作
指定URLへの遷移
内部WebDriverのライフサイクル
Cookieのクリア
WebDriverインスタンスの取得
Browser.driveを使ったテスト
7.6 GebConfig.groovy
driver
その他の設定項目
7.7 画面要素の指定方法
$メソッドの引数
$メソッドの返り値
部分一致
Navigatorオブジェクトの各種メソッド
WebElementインスタンスの取得
7.8 画面要素の操作と情報取得
クリック
キー入力
画面情報の取得
フォームコントロール
valueの取得
テキスト入力欄への値セット
プルダウンへの値セット
チェックボックスへの値セット
ラジオボタンへの値セット
ファイルアップロードへの値セット
valueメソッドのショートカット
7.9 さまざまなブラウザ操作
画面キャプチャ・HTMLレポート
JavaScriptロジックの呼び出し
ポップアップ
待ち処理
Implicit Wait
7.10 ページオブジェクトパターン
url
at
content
現在のページの管理
contentのオプション
toオプション
waitオプション
toWaitオプション
WebDriverのページオブジェクトとの違い
7.11 Spockと組み合わせる
セットアップ
Spockと組み合わせたテストスクリプト
ブロック
データ駆動テスト
第8章 FluentLenium
8.1 FluentLeniumとは
8.2 セットアップ
8.3 FluentLeniumのテストスクリプト
8.4 画面要素の指定方法
8.5 主なコマンド
URL遷移
クリック
テキスト入力
プルダウンの選択
画面キャプチャ
待ち処理
WebDriverコマンドの直接呼び出し
8.6 FluentTestのメソッドのオーバーライド
8.7 ページオブジェクトパターン
第9章 Capybara
9.1 Capybaraとは
9.2 ドライバ
9.3 セットアップ
9.4 Capybaraのテストスクリプト
9.5 主なコマンド
クリック
フォームコントロール
テキスト入力
プルダウンの選択
チェックボックスの選択・非選択
ラジオボタンの選択
要素の取得
値チェック
待ち処理
その他のコマンド
URL遷移
画面キャプチャ
WebDriverコマンドの直接呼び出し
9.6 Capybara単独で実行する場合
Part 4 Seleniumのさまざまな活用方法
第10章 Selenium IDE
10.1 Selenium IDEとは
10.2 インストール手順
10.3 基本的な使い方
起動・記録
記録の停止
再生
テストケースの保存
記録の再開
手作業でのコマンドの追加
テストケースの追加,テストスイートの作成
ロケータの自動判定機能の調整(Locator Builders)
Test Schedulerを使った定時実行
プログラミング言語へのエクスポート
エクスポートの使い方
エクスポートできないコマンドの例
10.4 ブラウザを操作するコマンド
フォームの操作
ウィンドウやフレームの操作
画面キャプチャの取得
10.5 値を検証・待機・保持するコマンド
assert
HTML要素
ポップアップ
ページ全体の値の検証
その他
verify
waitFor
store
期待値でのパターンマッチングの利用
10.6 Selenium IDEのプラグイン
Implicit Wait
SelBlocks
Highlight Elements
File Logging
ScreenShot on Fail
Test Results
Power Debugger
10.7 WebDriver-Backed
環境の準備
Selenium IDEの設定
WebDriver-Backedで再生
10.8 UIマッピング
第11章 スマートフォンのテストとAppium
11.1 スマートフォンのテストとは
スマートフォンのテストの種類
スマートフォン用Webサイトのテスト
スマートフォン用アプリのテスト
スマートフォンのテストに利用できるSelenium関連ツール
エミュレータを利用するか実機を利用するか
11.2 PCブラウザによるスマートフォン用Webサイトのテスト
PCブラウザでテストする場合の注意事項
Safariを利用したテスト
Safariのユーザエージェントの設定
タッチイベント
PC版Chromeを利用したテスト
Chromeのユーザエージェントの設定
タッチイベント
PhantomJSを利用したテスト
PhantomJSのユーザエージェントの設定
タッチイベント
11.3 Appium
SeleniumとAppium
Mobile JSON Wire Protocol
Appium独自コマンド
AppiumDriverの導入方法
AppiumのCapabilities
Appiumサーバの導入方法
Android開発環境の設定
Androidのエミュレータの設定
Androidの実機の設定
iOS開発環境の設定
iOSのシミュレータの設定
11.4 AppiumでのAndroid版Chromeの操作
ChromeDriverサーバの設定
Android版Chromeの操作
Appiumサーバの起動
AppiumDriverの実行
11.5 AppiumでのiOSのMobile Safariの操作
iOSシミュレータの設定
シミュレータ上のMobile Safariの操作
iOS実機のMobile Safariの操作
Safari Launcherのビルド
ios-webkit-debug-proxyのインストール
Mobile Safariの起動
第12章 CI環境での利用
12.1 前提
12.2 コマンドラインツールでのSeleniumの実行
標準的なコンソール実行
ビルドツールの利用
12.3 CIサーバ上でのSelenium実行環境の整備
Linux
ディストリビューションの選択
ヘッドレス環境向けの設定
PhantomJS
Xvfbとブラウザの併用
Windows
ローカルシステムアカウントと,対話的デスクトップ
12.4 Jenkins
Jenkinsの導入時のTIPS
LTS Releaseの選択
Webサービスの待ち受けポートの確認と変更
Linux(Debian・Ubuntuなど)
Linux(RHEL・CentOSなど)
Windows
追加プラグイン
Git Plugin
Build-timeout Plugin
定時実行ジョブの作成
新規ジョブの登録
ソースコード管理
ビルド・トリガの実行設定
タイムアウトの設定
ビルドの設定
ビルド後の処理
設定の保存
ジョブの手動実行
実行結果の確認
Jenkinsスレーブでのジョブの実行
スレーブの追加
スレーブでのJenkinsエージェントの実行
12.5 Selenium Gridを併用した,複数ノードでのテストの実行
最小構成のSelenium Grid環境の作成
ハブの起動
ノードの起動,ハブへの接続
ハブの状態の確認
RemoteWebDriverの利用
RemoteWebDriverの実行
複数のマシンにより構成されるSelenium Grid環境の作成
テストスクリプト・ハブ・ノードのマシンの分離
複数のノードと,ノードごとの使用条件の設定
実行結果の確認
Jenkinsとの連携
Selenium Pluginのビルドとインストール
ソースコードの入手
Mavenでビルド
Jenkinsにインストール
ハブの設定
ノードの設定
設定の名前
Jenkinsスレーブの割り当て
WebDriverノードの選択,ノード上で実行するブラウザの指定
JSON形式でのノードの設定
設定の保存
ノードの起動
ノードの状態の確認
Part 5 実践的な運用
第13章 運用
13.1 運用での典型的な問題
13.2 テストスクリプトの工夫
テストスクリプトのバージョン管理
依存関係のないテスト
共通する記述のまとめ
既成のライブラリやフレームワークの利用
SeleniumのAPIに対するフック処理の追加
期待値の定数化
テストスクリプトのリファクタリング
13.3 テストの実行の工夫
テストの実行前の準備
Seleniumを利用するテストのレベル
テストの並列実行
テスト実行時のリソース管理
テストを実行するためのリソース
テスト実行後のリソース解放
ブラウザ・ドライバのプロセスの残存
ブラウザのプロファイルデータの残存
画面キャプチャなど,テスト結果データの残存
テストの結果の確認
ログ
実行時間
画面キャプチャ
正否の自動判定の難しさ
目視チェックによる判定
画面要素の位置情報で代替した自動判定
13.4 テスト環境の工夫
自動テスト結果の通知
自動テスト環境の維持
確実に動作する自動テスト環境を作るための,構成ソフトウェアのバージョン管理
自動テスト環境でのSeleniumのバージョン更新
第14章 サイボウズの事例
14.1 開発プロセス
要件検討段階
仕様検討段階
実装段階
試験段階
リリースと改善活動
14.2 運用上の課題
Selenium Gridによる並列化
Dockerによるテスト環境の用意
テスト環境のクラウドへの移行
トラブル対応の属人性
14.3 まとめ
第15章 DeNAの事例
15.1 自動テストの対象となるサービスの概要
NBPFの全体像
サーバサイドコンポーネント
Mobage JS SDK
Mobage Shell App SDK
Seleniumによる品質保証のアプローチ
15.2 ブラウザ自動テスト
テストWebアプリケーション
何を自動テストで担保し,何を手動テストで担保するか
テストコンポーネント
テストスクリプト
テストサポートライブラリ
マルチデバイス対応
プラットフォームのクライアントとしての利用
複数のテストスクリプトからの利用
JenkinsによるCI
テストの安定性の問題に対するアプローチ
テストの実行時間の問題に対するアプローチ
テストの並列実行
テスト実行環境の独立
テストデータの独立
各テスト実行ノード専用のテストデータの事前準備
自動テストサポートWebアプリケーション
15.3 スマートフォンアプリ自動テスト
Mobage Shell App SDK
テストアプリ
テストアプリの特徴
Informationビュー
入力補助機能
テストアプリビルドスクリプト
Jenkinsのテストアプリビルド
テストコンポーネント
スマートフォンアプリ自動テストのしくみ
テストサポートライブラリ
テストスクリプト
テストの実行
テスト結果
JenkinsによるCI
実機テスト環境
Jenkinsジョブ
テストアプリビルドジョブ
自動テスト実行ジョブ
実機テストの課題について
Appendix 付録
付録A CSSセレクタ・XPath早見表
A.1 CSSセレクタ
A.2 XPath
付録B WebDriverコマンド早見表
B.1 Java
B.2 Ruby
B.3 JavaScript
B.4 C#
B.5 Python
索引
著者プロフィール