Selenium あるある

Dc5be06c50fdfe681913540a3effdcc8?s=47 seya
May 30, 2018

Selenium あるある

Dc5be06c50fdfe681913540a3effdcc8?s=128

seya

May 30, 2018
Tweet

Transcript

  1. Selenium 失敗あるある @D‑Cube 【自動化】ワーストプラクティス ~まずはやってみる~

  2. 自己紹介

  3. E2E自動化、やってますか?

  4. 私はやったことがあります

  5. 1ヶ月半かけてSeleniumの勉強 + 設計と実装 を経て

  6. ついに完成!!!

  7. しかし…

  8. ものの数ヶ月で使われなくなり、私が初めて 作った自動テストスイートはゴミと化しまし た。

  9. 本日は当時を振り返って失敗の原因と そこから得られる教訓を語ります。

  10. 原因1. 信頼性のないテスト

  11. Seleniumのテストは "タイミング次第" で落 ちる。

  12. 前提としてSeleniumでテストを書く際には様々な状況でDOMを選択す る必要があります。 この時問題になるのが、まだ存在していないDOMを選択しようとしてテ ストが失敗することで、これがまた結構な頻度で起こる。

  13. これを防ぐためには、起きる可能性がある部分(大抵はページ遷移後の タイミング)にそのDOMがマウントするまで待つような処理を挟む browser.waitUntil( () => browser.isExisting(".search-field"); );

  14. しかし疲れてきた私は…

  15. browser.pause(300);

  16. それでも…

  17. None
  18. ↓ 私

  19. 結論 信頼性のないテストはゴミ

  20. 教訓 ページロードや非同期処理を待つことが手軽にできる Cypressなどのツールを検討してみよう。

  21. 原因2. マルチブラウザ対応を頑張ってしまう

  22. 対応しようとしたブラウザ

  23. EdgeのDriverで click が動作しない Excpetion "org.openqa.selenium.WebDriverException: Element is obscured "

  24. clickイベントを注入するJSでwrapすること によって無事解決 browser.click = selector => browser.selectorExecute(selector, element => element[0].click());

  25. FirefoxでActionクラスが存在しない 要するにDrag & Dropとかができない。

  26. 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); ・ ・ ・
  27. 信じられるのはChromeだけ…

  28. 教訓 マルチブラウザテストで見たい観点は何かを考えよう。 違うブラウザでJSの挙動が違うということは最近ではあまりなくなっ た。自動テストは一ブラウザだけで、ブラウザ間の差異を見るのはシナ リオテストを手動で見る、みたいなキリであれば現実的かもしれない。

  29. 原因3. メンテナンスコストをなめてた

  30. メンテナンスはとても大変 テストケースのアップデート テストコードのアップデート selectorが変わった時壊れまくる… 変更の影響範囲をちゃんと連携しないクソ開発者(私)

  31. 業務にちゃんと組み込ませることを最初から意識する。 経験ある人がいないのであれば、スモールスタートで始めるのでも価値 があると思う。 (よくいじられるところ1ページ選んで、そこだけ導入するとか) 慣れてきてハマりそうだと確信したら対象範囲を増やすとか。

  32. あと E2Eの自動化はとても片手間でできるものでは ない

  33. 教訓 優秀なテストエンジニアを雇おう!

  34. ご静聴ありがとうございました。