Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Selenium あるある
seya
May 30, 2018
Programming
0
1.2k
Selenium あるある
seya
May 30, 2018
Tweet
Share
More Decks by seya
See All by seya
kazuyaseki
9
2.8k
kazuyaseki
8
3.5k
kazuyaseki
16
2.8k
Other Decks in Programming
See All in Programming
kosugitti
1
350
akito0107
0
210
naokioouchi
1
310
korosuke613
2
270
makicamel
0
210
dqneo
3
340
texmeijin
0
150
grapecity_dev
0
180
meemeelab
0
310
martysuzuki
1
570
maito1201
0
190
bkuhlmann
2
310
Featured
See All Featured
samlambert
237
10k
roundedbygravity
242
21k
tmm1
61
9.4k
sstephenson
145
12k
chriscoyier
145
20k
samanthasiow
56
6.4k
michaelherold
225
8.5k
mthomps
38
2.3k
erikaheidi
14
4.3k
gr2m
83
11k
shpigford
165
19k
holman
447
130k
Transcript
Selenium 失敗あるある @D‑Cube 【自動化】ワーストプラクティス ~まずはやってみる~
自己紹介
E2E自動化、やってますか?
私はやったことがあります
1ヶ月半かけてSeleniumの勉強 + 設計と実装 を経て
ついに完成!!!
しかし…
ものの数ヶ月で使われなくなり、私が初めて 作った自動テストスイートはゴミと化しまし た。
本日は当時を振り返って失敗の原因と そこから得られる教訓を語ります。
原因1. 信頼性のないテスト
Seleniumのテストは "タイミング次第" で落 ちる。
前提としてSeleniumでテストを書く際には様々な状況でDOMを選択す る必要があります。 この時問題になるのが、まだ存在していないDOMを選択しようとしてテ ストが失敗することで、これがまた結構な頻度で起こる。
これを防ぐためには、起きる可能性がある部分(大抵はページ遷移後の タイミング)にそのDOMがマウントするまで待つような処理を挟む browser.waitUntil( () => browser.isExisting(".search-field"); );
しかし疲れてきた私は…
browser.pause(300);
それでも…
None
↓ 私
結論 信頼性のないテストはゴミ
教訓 ページロードや非同期処理を待つことが手軽にできる Cypressなどのツールを検討してみよう。
原因2. マルチブラウザ対応を頑張ってしまう
対応しようとしたブラウザ
EdgeのDriverで click が動作しない Excpetion "org.openqa.selenium.WebDriverException: Element is obscured "
clickイベントを注入するJSでwrapすること によって無事解決 browser.click = selector => browser.selectorExecute(selector, element => element[0].click());
FirefoxでActionクラスが存在しない 要するにDrag & Dropとかができない。
Drag & Dropイベントを注入するJSで(ry browser.execute(function (selectorDrag, selectorDrop) { // function for
triggering mouse events var fireMouseEvent = function (type, elem, centerX, centerY var evt = document.createEvent('MouseEvents'); evt.initMouseEvent(type, true, true, window, 1, 1, 1, centerX elem.dispatchEvent(evt); }; var elemDrag = document.querySelector(selectorDrag); var elemDrop = document.querySelector(selectorDrop); if (!elemDrag || !elemDrop) return false; var pos = elemDrag.getBoundingClientRect(); var center1X = Math.floor((pos.left + pos.right) / 2); ・ ・ ・
信じられるのはChromeだけ…
教訓 マルチブラウザテストで見たい観点は何かを考えよう。 違うブラウザでJSの挙動が違うということは最近ではあまりなくなっ た。自動テストは一ブラウザだけで、ブラウザ間の差異を見るのはシナ リオテストを手動で見る、みたいなキリであれば現実的かもしれない。
原因3. メンテナンスコストをなめてた
メンテナンスはとても大変 テストケースのアップデート テストコードのアップデート selectorが変わった時壊れまくる… 変更の影響範囲をちゃんと連携しないクソ開発者(私)
業務にちゃんと組み込ませることを最初から意識する。 経験ある人がいないのであれば、スモールスタートで始めるのでも価値 があると思う。 (よくいじられるところ1ページ選んで、そこだけ導入するとか) 慣れてきてハマりそうだと確信したら対象範囲を増やすとか。
あと E2Eの自動化はとても片手間でできるものでは ない
教訓 優秀なテストエンジニアを雇おう!
ご静聴ありがとうございました。