FORHÅNDSSTEMMING Start ”tidlig” 1.7. Start utenriks 1.7. Start innenriks 10.8.
20170809 start python_selenium
-
Upload
hiroko-tamagawa -
Category
Engineering
-
view
1.221 -
download
0
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
ご清聴ありがとうございました!