20151201...

53
私が Selenium を使って スクリーンショット を撮るまでに出会っ の全て 新日鉄住金ソリューションズ 石川 真也 Selenium1年) Copyright © 2015 NS Solutions Corporation, All rights reserved. 1

Transcript of 20151201...

Page 1: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

新日鉄住金ソリューションズ

石川 真也

(Selenium歴1年)Copyright © 2015 NS Solutions Corporation, All rights reserved. 1

Page 2: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

End to End(E2E)テスト

Copyright © 2015 NS Solutions Corporation, All rights reserved. 2

Page 3: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

E2Eテスト

• アプリケーションの「最初から最後まで」の動作をたしかめるテスト

• ブラウザなどを使う

Copyright © 2015 NS Solutions Corporation, All rights reserved. 3

Page 4: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Copyright © 2015 NS Solutions Corporation, All rights reserved. 4

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

複数のブラウザで同じテストを実行

↓負担大

Internet Explorer 7

Internet Explorer 8

Internet Explorer 9

Internet Explorer 10

Internet Explorer 11

Microsoft Edge

Firefox

Google Chrome

Safari

Safari(iOS)

Google Chrome(Android)

課題:対象ブラウザが増えた

Page 5: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Copyright © 2015 NS Solutions Corporation, All rights reserved. 5

Edge IE11 IE9 Chrome FF Safari iOS Android Android Android

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

2015/09/03(rev.1)

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

2015/09/17(rev.2)

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

2015/10/01(rev.3)

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

2015/10/03(rev.4)

課題:テスト頻度が増した

開発スピードに追いつかない

Page 6: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

テスト自動化

Copyright © 2015 NS Solutions Corporation, All rights reserved. 6

Page 7: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Copyright © 2015 NS Solutions Corporation, All rights reserved. 7

Selenium

Page 8: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Selenium-特徴

OSS(Apache2.0)

様々なブラウザに対応

豊富な言語バインディング Java, C#, Python, Ruby, JavaScript etc.

豊富な支援ツール Selenium grid:並列実行

Selenium IDE:画面操作の記録

Appium:iOS, Androidのテスト

Microsoft Edgeにも!

Copyright © 2015 NS Solutions Corporation, All rights reserved. 8

→間口の広さ

Page 9: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Selenium-コード例public class Example {

public static void main(String[] args) {

WebDriver driver = new HtmlUnitDriver();

driver.get("http://www.google.com");

WebElement element = driver.findElement(By.name("q"));

element.sendKeys("Cheese!");

element.submit();

System.out.println("Page title is: " + driver.getTitle());

driver.quit();

}

}

フォーム操作

ページリクエスト

値の取得

Copyright © 2015 NS Solutions Corporation, All rights reserved. 9

Page 10: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Selenium-こんなこともできる

Copyright © 2015 NS Solutions Corporation, All rights reserved. 10

• 任意のJavaScriptコードを実行できる

• 表示中のページのスクリーンショットを取得できる

Page 11: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

スクリーンショット取得機能

• レイアウト確認

• エビデンス取得

• 差分検知• for リグレッションテスト

Copyright © 2015 NS Solutions Corporation, All rights reserved. 11

File screenshotFile = ((Screenshot)driver).getScreenshotAs(file);

Page 12: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Copyright © 2015 NS Solutions Corporation, All rights reserved. 12

2015/09/03(rev.1)

2015/09/17(rev.2)

IE11

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

・アプリにアクセス・ログイン・カートに商品を追加・配送先を選択・支払い方法を選択・注文の確認・購入完了

スクリーンショットで差分検知

Page 13: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Seleniumを使って

スクリーンショットを撮ろう!

目標

Seleniumを使って

スクリーンショットを撮ろう!

Copyright © 2015 NS Solutions Corporation, All rights reserved.Copyright © 2015 NS Solutions Corporation, All rights reserved. 13

Page 14: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

目標

Seleniumを使って

スクリーンショットを撮ろう!

Copyright © 2015 NS Solutions Corporation, All rights reserved. 14

Page 15: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

以下、

Copyright © 2015 NS Solutions Corporation, All rights reserved. 15

Page 16: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Seleniumでスクリーンショットを撮ろうとした時の

闇(はまりどころ)を紹介

Copyright © 2015 NS Solutions Corporation, All rights reserved. 16

Page 17: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

の闇ブラウザ依存

Copyright © 2015 NS Solutions Corporation, All rights reserved. 17

Page 18: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

File screenshotFile = ((Screenshot)driver).getScreenshotAs(file);

Copyright © 2015 NS Solutions Corporation, All rights reserved. 18

メソッドはある。しかし…

Page 19: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

可視範囲のみ

いろんなバー映り込む

Copyright © 2015 NS Solutions Corporation, All rights reserved. 19

Internet Explorer Google Chrome Safari(iOS)

Page 20: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

TakesScreenshot interfaceFor WebDriver extending TakesScreenshot, this makes a best effort depending on the browser to return the following in order of preference:

• Entire page

• Current window

• Visible portion of the current frame

• The screenshot of the entire display containing the browser

http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/TakesScreenshot.htmlCopyright © 2015 NS Solutions Corporation, All rights reserved. 20

Page 21: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

TakesScreenshot interface(意訳)実装するときは下記の順でどれか返してくれればいいよ。ブラウザによってベストエフォートで実装してね。

• ページ全体

• 現在のウインドウ

• 現在のフレームの可視範囲

• ブラウザも含むディスプレイ全体

http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/TakesScreenshot.htmlCopyright © 2015 NS Solutions Corporation, All rights reserved. 21

Page 22: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

闇が深い

Copyright © 2015 NS Solutions Corporation, All rights reserved. 22

Page 23: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

対策

地道にブラウザ依存の処理を

吸収する

Copyright © 2015 NS Solutions Corporation, All rights reserved. 23

Page 24: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

対策

Copyright © 2015 NS Solutions Corporation, All rights reserved. 24

Page 25: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Copyright © 2015 NS Solutions Corporation, All rights reserved. 25

スクロールに追従する要素アクセスするたびに内容が変わるウィジェット

Page 26: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

対策

Copyright © 2015 NS Solutions Corporation, All rights reserved. 26

アクセスするたびに内容が変わるウィジェット→スクリーンショットは撮るが差分検知のときは無視する

スクロールに追従する要素→スクリーンショットを撮るときに隠す(hidden)

Page 27: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

サブピクセルの闇

Copyright © 2015 NS Solutions Corporation, All rights reserved. 27

Page 28: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

部分スクリーンショット取得時

身に覚えのないdiff

Copyright © 2015 NS Solutions Corporation, All rights reserved. 28

Page 29: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

よく調べると

Copyright © 2015 NS Solutions Corporation, All rights reserved. 29

要素A

要素A

top: 200pxleft: 100px

top: 300.5pxleft: 100px

要素Aの位置が変わっただけで

中身がほんの少し変わるもよう

Page 30: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

原因→サブピクセルレンダリング

• ブラウザ上の要素の座標は実数

• ブラウザが小数点以下の値を正確に扱おうと試みた結果、微妙な差が出る

Copyright © 2015 NS Solutions Corporation, All rights reserved. 30

Page 31: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

ブラウザ毎の座標の扱いとレンダリングブラウザ名 状態

Internet Explorer 7 小数点以下の座標を持たない

Internet Explorer 8内部的に小数点以下の座標を持つが、取得できる値は整数のみ。横方向はレンダリングに影響するが縦方向は影響しない。

Internet Explorer 9内部的に小数点以下の座標を持つが、取得できる値は整数のみ。縦横両方向のレンダリングに影響する。

Internet Explorer 10 , 11Mozilla FirefoxGoogle Chrome

内部的に小数点以下の座標を持ち、取得される値も小数点を含む。縦横両方向のレンダリングに影響する。

Copyright © 2015 NS Solutions Corporation, All rights reserved. 31

Page 32: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

闇が深い

Copyright © 2015 NS Solutions Corporation, All rights reserved. 32

Page 33: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

対策

Copyright © 2015 NS Solutions Corporation, All rights reserved. 33

要素A

要素A

top: 200pxleft: 100px

top: 300.5pxleft: 100px

要素の座標が同じなら、

描画結果は同じになるはず…

Page 34: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

対策

Copyright © 2015 NS Solutions Corporation, All rights reserved. 34

要素A 要素Atop: 0pxleft: 0px

top: 0pxleft: 0px

要素Aのスクリーンショットを

撮る間だけ、固定座標に移動

Page 35: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

なぜかブラウザで開いている画面と取得したスクリーンショットが違うの闇

Copyright © 2015 NS Solutions Corporation, All rights reserved. 35

Page 36: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

IE8でスクリーンショット取得時

Copyright © 2015 NS Solutions Corporation, All rights reserved. 36

Lorem ipsum dolor sit amet, consecteturadipisicing elit, sed do eiusmod temporincididunt

○○のページ

Lorem ipsum dolor sit amet, consecteturadipisicing elit, seddo eiusmod temporincididunt

○○のページ

スクリーンショットにすると

ほんの少しだけ幅が狭い…??

行が折り返してしまう

Page 37: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

ウィンドウサイズを勝手に変えているのは誰?

Copyright © 2015 NS Solutions Corporation, All rights reserved. 37

Seleniumクライアント

WebDriver ブラウザ

スクリーンショット撮って!

どうぞ(画像)

Json wire protocolブラウザ拡張機能OSのネイティブ機能

Page 38: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

対策…

Copyright © 2015 NS Solutions Corporation, All rights reserved. 38

Seleniumクライアント

ドライバ ブラウザ

改修(C++)

Page 39: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

もうたくさんだ…

Copyright © 2015 NS Solutions Corporation, All rights reserved. 39

Page 40: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

私はただ

(きれいな)スクリーンショット

を撮りたいだけなのに!!!

Copyright © 2015 NS Solutions Corporation, All rights reserved. 40

Page 41: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

なぜC++を書いているんだ

Copyright © 2015 NS Solutions Corporation, All rights reserved. 41

Page 42: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

これからSeleniumを使う人たちに同じ闇を味わってほしくない

Copyright © 2015 NS Solutions Corporation, All rights reserved. 42

Page 43: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

そこで

Copyright © 2015 NS Solutions Corporation, All rights reserved. 43

Page 44: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Copyright © 2015 NS Solutions Corporation, All rights reserved. 44

Apache2.0License

Version 1.0.2開発中!

Page 45: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Copyright © 2015 NS Solutions Corporation, All rights reserved. 45

IE

Safari

Chrome

テストスクリプト

Pitalium

対象ブラウザ・IE・Chrome・Safari

Page 46: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

V1.0.2更新内容(抜粋)

• 横スクロール対応

• Pitalium Explorerを使ったアドホック比較• 任意のスクリーンショットの比較が可能に

Copyright © 2015 NS Solutions Corporation, All rights reserved. 46

Pitalium

Page 47: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

テスト結果ビューア:Pitalium Explorer

Copyright © 2015 NS Solutions Corporation, All rights reserved. 47

・テスト結果 / スクリーンショット差分の確認

Page 48: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Demo: 新旧テスト結果の比較

Copyright © 2015 NS Solutions Corporation, All rights reserved. 48

2015/09/03(rev.1)

2015/09/17(rev.2)

InternetExplorer 11

Chrome Firefox

Page 49: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Demo: 異なるブラウザ間の結果比較

Copyright © 2015 NS Solutions Corporation, All rights reserved. 49

2015/09/03(rev.1)

2015/09/17(rev.2)

InternetExplorer 11

Chrome Firefox

Page 50: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

Copyright © 2015 NS Solutions Corporation, All rights reserved. 50Copyright © 2015 NS Solutions Corporation, All rights reserved. 50

開発中にスクリーンショットを確認する

CI環境と組み合わせてリグレッションテストに使う

仕様変更時に新旧の画面を比較する

OK! OK!

driver.findElement(By.name("shop_id")).clear();

NG!

利用シナリオ例

ちゃんと変わっている!

Jenkins project: http://jenkins-ci.org/

Page 51: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

テスト自動化の闇テスト自動化の闇と向き合う

Copyright © 2015 NS Solutions Corporation, All rights reserved. 51

Page 52: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

まとめ

Copyright © 2015 NS Solutions Corporation, All rights reserved. 52

• マルチデバイス対応の闇は深い• スクリーンショット周り特に深い

• そんな闇を祓うツールPitaliumをよろしくお願いします

Page 53: 20151201 私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て

明けない闇はない。

Copyright © 2015 NS Solutions Corporation, All rights reserved. 53

・ NS Solutions、NS(ロゴ)、NSSOLは、新日鉄住金ソリューションズ株式会社の登録商標です。

・ hifive、hifive(ロゴ)は、新日鉄住金ソリューションズ株式会社の登録商標です。

・ Pitaliumは、新日鉄住金ソリューションズ株式会社の商標です。

・ Javaは、米国ORACLE Corp.の登録商標です。

・ その他本文記載の会社名及び製品名は、それぞれ各社の商標又は登録商標です。