SeleniumでWebと戯れよう
みんなのPython勉強会 #27
株式会社SHIFT 玉川紘子
@nkns165
自己紹介
 玉川紘子(@nkns165)
 ソフトウェアテストエンジニア
 主に自動化・CIを担当しています
 コミュニティ活動もしています
テスト自動化研究会
自己紹介
 自動テスト関連の技術書の翻訳お手伝いとかもしています
付録執筆 監訳 付録執筆
Seleniumとは?
 http://www.seleniumhq.org/
 Webブラウザの操作を自動化できるOSS
 対応ブラウザ
 IE, Firefox, Chrome, Safari, Opera, Edge
 利用できるプログラミング言語
 Java, C#, JavaScript, PHP, Python, Rubyなど多数
Seleniumでできること・できないこと
 できること
 URL遷移
 入力操作(テキスト入力、ラジオボタン/チェックボックス/プルダウンの選
択、ボタンのクリック等)
 各種マウス操作 ※やや苦手(不安定になりがち)
 画面の内容確認(タイトル、画面内の文字列、要素の表示/非表示、要素
の活性/非活性、CSSの値)
 JavaScriptの実行
 できないこと
 ブラウザ外の操作(ファイル選択ダイアログの操作等)
 HTMLタグ以外の要素の解析
Seleniumの歴史
 Selenium 1 or Selenium RC(2004〜)
 JavaScriptベースの実装
 クロスブラウザのテストを実際に運用するにはやや厳しい
 Selenium 2 or Selenium WebDriver(2011〜)
 Googleで開発されていたWebDriverと融合し、APIを一新
 各ブラウザ専用のドライバを使い、APIのみ共通化することでクロスブラ
ウザのテストを現実的なものに
 この時点ではSelenium RCのAPIも残存
 Selenium 3(2016〜)
 Selenium RCのAPIを切り捨て、スリム化
 特に大きな機能追加はなし
簡単なSeleniumのコード
# 必要なライブラリのインポート
from selenium import webdriver
from selenium.webdriver.common.keys import
import unittest
# Chromeを起動し、Googleを開く
browser = webdriver.Chrome()
browser.get(‘https://google.co.jp’)
# 検索キーワードを入力
query_input = browser.find_element_by_id(‘lst-ib’)
query_input.send_keys(‘みんなのPython勉強会’)
query_input.send_keys(Keys.ENTER)
# 結果を出力
links = browser.find_elements_by_css_selector(‘div.rc>h3.r>a’)
for link in links:
print(link.text)
print(link.get_attribute('href'))
assert len(links) == 7
8
Seleniumを使ったスクレイピング
 pyqueryやBeautiful Soupを使ったスクレイピングとの違い
 メリット
 実際のユーザ操作と同じように画面を開いて、ログインして、…という処
理ができるので、Cookie等の仕組みを解析しなくても自由に画面遷移が
できる
 Ajax通信で後から表示される要素も取得することができる
 デメリット
 遅い(画面遷移だけでなく、タグの取得自体も遅い)
 静的なページやログイン不要なサイトであれば、通常のHTTPリクエストで
HTMLを取得するタイプのライブラリが圧倒的に有利
 Seleniumと上記のようなライブラリを併用する場合もある(画面を開いてから、
HTMLソースの文字列を取得して解析にかける)
9
Jupyter Notebookを使ってTry & Error
 Jupyter Notebookとは
 Pythonのコードを含んだWebページを生成できる機能
 ドキュメント生成としても優れているが、Webページ上でかんたんにステッ
プ実行ができるので、Try & Errorを繰り返しながらコーディングを進めて
いくのにも最適
 インストールも簡単(下記はMacの場合)
# Jupyter本体のインストール
$ pip install jupyter
# Seleniumと、その中でChromeを使うための設定
$ brew install chromedriver
$ pip install selenium
# 起動
$ jupyter notebook
10
実際に作ってみたNotebook
11
デモ
12
Notebookの内容をバッチ実行してみる
 作成・保存したNotebookはipynb形式で保存される
 runipyコマンドで実行可能
# runipyのインストール
$ pip install runipy
# バッチ実行
$ ruipy start_python.ipynb out.ipynb
# 結果をどこでも見られるようにHTMLに変換
$ jupyter nbconvert out.ipynb --to html
13
Seleniumで自動テスト
 こちらの用途のほうがメジャー(たぶん)
 Selenium自体にはテストの機能はないため、別途テスティング
フレームワークと組み合わせる必要がある
 unittest
 Doctest
 Nose など
 テスティングフレームワークとは
 コードの結果に対してOK/NGの判定、結果の集計、レポーティング等を
行ってくれるフレームワーク。ただブラウザを操作するだけではテストに
ならないので、テスティングフレームワークの利用は必須
# unittestを使う場合
import unittest
…
assert len(links) == 7
14
ふたたびデモ
15
自動テストのメリット
 人では絶対にこなせない量・高頻度のテストを工数をかけずに
実現
 サービスの機能追加に伴い回帰テストを自動化することで、開
発のリードタイムを落とさず品質をキープ
機能数の増加 顧客数の増加
自動化
新規機能
既存機能
テスト
ケース数
開発のイテレーション
ベースとなるパッケージ
顧客A
の設定
顧客B
の設定
顧客C
の設定
…
顧客A用の
改修を実施
顧客A用の
設定をテスト
自動化
新機能
開発
OK OK
16
自動テストをもっと活用するために
 「自動テストを手動で実行する」ほど悲しいことはない
 CI(継続的インテグレーション)環境を作って、自動テストが自
動で回るようにする
 定期的 or コードに変更があるたびにテストを実行
 結果を通知(メール, Slack,…)
 履歴が綺麗に残り、みんなで共有できる
Jenkins Travis CI Circle CI
17
Seleniumで苦労する点
 実行時間が長い
 いくら工数がかからないとは言え、あまりにも長いテストは生産性を下げる
 テストが不安定になる
 特にJavaScriptによる動的なアクションの多い画面では、うまく作らないとタイ
ミング依存のエラーが頻発する
 注意しないとすぐに保守コストが爆発
 UI変更、文言変更で即崩壊するテストは役に立たない
 うまく共通化して保守コストを下げよう
 人によっては、「何でもSeleniumでテストしたい」症候群を発病
 メール受信のテストは普通にメール受信するプログラムを書きましょう…
18
バランスに気をつけることが大事
 理想は「テストのピラミッド」
 最初は逆ピラミッド(アイスクリームコーン)になってしまうことも
ある
 ないよりはマシ。少しずつ形を変えていけばOK
単体テスト・
コンポーネントテスト
受入テスト
(APIレイヤー)
GUIテスト
手動テスト
どうしても欠かせない
重要ケースはEndToEndで。
ただし、不安定なので
数は絞る
高速実行可能・
安定している
単体テストを重視
19
最後に宣伝
 あの「アジャイルサムライ」の著者、Jonathan Rasmussonの自動化
本「The Way of the Web Tester」の日本語訳を担当しました
 9月ごろ発売予定
 「テストのピラミッド」の話もたくさん出てきます
※表紙は全然違う
ものになると思います
20
ご清聴ありがとうございました!

20170809 start python_selenium