20170809 start python_selenium

20
SeleniumでWebと戯れよう みんなのPython勉強会 #27 株式会社SHIFT 玉川紘子 @nkns165

Transcript of 20170809 start python_selenium

Page 1: 20170809 start python_selenium

SeleniumでWebと戯れよう

みんなのPython勉強会 #27

株式会社SHIFT 玉川紘子

@nkns165

Page 2: 20170809 start python_selenium

自己紹介

玉川紘子(@nkns165)

ソフトウェアテストエンジニア

主に自動化・CIを担当しています

コミュニティ活動もしています

テスト自動化研究会

Page 3: 20170809 start python_selenium

自己紹介

自動テスト関連の技術書の翻訳お手伝いとかもしています

付録執筆 監訳 付録執筆

Page 4: 20170809 start python_selenium

Seleniumとは?

http://www.seleniumhq.org/

Webブラウザの操作を自動化できるOSS

対応ブラウザ

IE, Firefox, Chrome, Safari, Opera, Edge

利用できるプログラミング言語

Java, C#, JavaScript, PHP, Python, Rubyなど多数

Page 5: 20170809 start python_selenium

Seleniumでできること・できないこと

できること

URL遷移

入力操作(テキスト入力、ラジオボタン/チェックボックス/プルダウンの選択、ボタンのクリック等)

各種マウス操作 ※やや苦手(不安定になりがち)

画面の内容確認(タイトル、画面内の文字列、要素の表示/非表示、要素の活性/非活性、CSSの値)

JavaScriptの実行

できないこと

ブラウザ外の操作(ファイル選択ダイアログの操作等)

HTMLタグ以外の要素の解析

Page 6: 20170809 start python_selenium

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を切り捨て、スリム化

特に大きな機能追加はなし

Page 7: 20170809 start python_selenium

簡単なSeleniumのコード# 必要なライブラリのインポートfrom selenium import webdriverfrom 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

Page 8: 20170809 start python_selenium

8

Seleniumを使ったスクレイピング

pyqueryやBeautiful Soupを使ったスクレイピングとの違い

メリット

実際のユーザ操作と同じように画面を開いて、ログインして、…という処理ができるので、Cookie等の仕組みを解析しなくても自由に画面遷移ができる

Ajax通信で後から表示される要素も取得することができる

デメリット

遅い(画面遷移だけでなく、タグの取得自体も遅い)

静的なページやログイン不要なサイトであれば、通常のHTTPリクエストでHTMLを取得するタイプのライブラリが圧倒的に有利

Seleniumと上記のようなライブラリを併用する場合もある(画面を開いてから、HTMLソースの文字列を取得して解析にかける)

Page 9: 20170809 start python_selenium

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

Page 10: 20170809 start python_selenium

10

実際に作ってみたNotebook

Page 11: 20170809 start python_selenium

11

デモ

Page 12: 20170809 start python_selenium

12

Notebookの内容をバッチ実行してみる

作成・保存したNotebookはipynb形式で保存される

runipyコマンドで実行可能

# runipyのインストール$ pip install runipy

# バッチ実行$ ruipy start_python.ipynb out.ipynb

# 結果をどこでも見られるようにHTMLに変換$ jupyter nbconvert out.ipynb --to html

Page 13: 20170809 start python_selenium

13

Seleniumで自動テスト

こちらの用途のほうがメジャー(たぶん)

Selenium自体にはテストの機能はないため、別途テスティングフレームワークと組み合わせる必要がある

unittest

Doctest

Nose など

テスティングフレームワークとは コードの結果に対してOK/NGの判定、結果の集計、レポーティング等を行ってくれるフレームワーク。ただブラウザを操作するだけではテストにならないので、テスティングフレームワークの利用は必須

# unittestを使う場合import unittest…assert len(links) == 7

Page 14: 20170809 start python_selenium

14

ふたたびデモ

Page 15: 20170809 start python_selenium

15

自動テストのメリット

人では絶対にこなせない量・高頻度のテストを工数をかけずに実現

サービスの機能追加に伴い回帰テストを自動化することで、開発のリードタイムを落とさず品質をキープ

機能数の増加 顧客数の増加

自動化

新規機能

既存機能

テストケース数

開発のイテレーション

ベースとなるパッケージ

顧客Aの設定

顧客Bの設定

顧客Cの設定

顧客A用の改修を実施

顧客A用の設定をテスト

自動化

新機能開発

OK OK

Page 16: 20170809 start python_selenium

16

自動テストをもっと活用するために

「自動テストを手動で実行する」ほど悲しいことはない

CI(継続的インテグレーション)環境を作って、自動テストが自動で回るようにする

定期的 or コードに変更があるたびにテストを実行

結果を通知(メール, Slack,…)

履歴が綺麗に残り、みんなで共有できる

Jenkins Travis CI Circle CI

Page 17: 20170809 start python_selenium

17

Seleniumで苦労する点

実行時間が長い

いくら工数がかからないとは言え、あまりにも長いテストは生産性を下げる

テストが不安定になる

特にJavaScriptによる動的なアクションの多い画面では、うまく作らないとタイミング依存のエラーが頻発する

注意しないとすぐに保守コストが爆発

UI変更、文言変更で即崩壊するテストは役に立たない

うまく共通化して保守コストを下げよう

人によっては、「何でもSeleniumでテストしたい」症候群を発病

メール受信のテストは普通にメール受信するプログラムを書きましょう…

Page 18: 20170809 start python_selenium

18

バランスに気をつけることが大事

理想は「テストのピラミッド」

最初は逆ピラミッド(アイスクリームコーン)になってしまうこともある

ないよりはマシ。少しずつ形を変えていけばOK

単体テスト・コンポーネントテスト

受入テスト(APIレイヤー)

GUIテスト

手動テスト

どうしても欠かせない重要ケースはEndToEndで。ただし、不安定なので

数は絞る

高速実行可能・安定している

単体テストを重視

Page 19: 20170809 start python_selenium

19

最後に宣伝

あの「アジャイルサムライ」の著者、Jonathan Rasmussonの自動化本「The Way of the Web Tester」の日本語訳を担当しました

9月ごろ発売予定

「テストのピラミッド」の話もたくさん出てきます

※表紙は全然違う

ものになると思います

Page 20: 20170809 start python_selenium

20

ご清聴ありがとうございました!