Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Selenium あるある
Search
seya
May 30, 2018
Programming
1.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Selenium あるある
seya
May 30, 2018
More Decks by seya
See All by seya
継続的な評価基準と評価の実行の仕方をアップデートするワークフロー
kazuyaseki
2
480
複数の LLM モデルを扱う上で直面した辛みまとめ
kazuyaseki
3
2.6k
エンジニアにオススメの Figma 活用
kazuyaseki
16
15k
なぜ私はコードをデザインに使いたいのか
kazuyaseki
9
3.8k
フロントエンド開発のための Figma
kazuyaseki
20
27k
PWAに取り組む前に知っておきたい SPAとSEO
kazuyaseki
10
5.5k
State of SEO for SPA 2018
kazuyaseki
8
5.4k
Vue コンポーネント実装パターン
kazuyaseki
16
4.1k
Other Decks in Programming
See All in Programming
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.9k
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
270
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
330
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
120
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.4k
プロポーザルを書いてもらう
pvcresin
0
560
Go 1.27 における memory allocation の高速化
andpad
0
250
源内ハンズオン概要編
hideg
0
190
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.7k
Foundation Models frameworkで画像分析
ryodeveloper
1
620
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
530
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
960
How to build a perfect <img>
jonoalderson
1
5.9k
Tell your own story through comics
letsgokoyo
1
1k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Odyssey Design
rkendrick25
PRO
2
770
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
800
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
420
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
620
How to Talk to Developers About Accessibility
jct
2
520
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の自動化はとても片手間でできるものでは ない
教訓 優秀なテストエンジニアを雇おう!
ご静聴ありがとうございました。