20170809 start python_selenium

Post on 22-Jan-2018

1.221 views 0 download

Transcript of 20170809 start python_selenium

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 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

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

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