Selenium & BrowserStack が当初思っていたのよりいろいろクセがあったので、まとめます。
自分なりにまとめてみたものの、以下の2つのサイトの方がよりわかりやすいように思います。
https://quesqa.com/testtools_and_automated_test_2/
https://yyyank.blogspot.com/2015/01/selenium2webdrivertips8.html
■実行環境
Selenium 3系
BrowserStack
Python 3系
■試してみたブラウザ環境
Windows 10 & IE 11.0
Windows 10 & Firefox 50.0 beta, 49.0, 48.0
Windows 10 & Firefox 47.0
Windows 10 & Chrome 54.0
Windows 8.1 & IE 11.0
Windows 8.0 & IE 10.0
OS X Sierra & Safari 10.0
OS X El Capitan & Safari 9.1
■前提
Firefox Selenium IDE 2.9.1でテストケースを作成しています。
Python / Unittest / WebDriver にエクスポートしています。
Selenium builderの方が新しくて生成されるコマンドも正確ですが、個人的に使いづらくIDEを使用しています。
■所感
・IDEからのエクスポートでは、まず動かないため手直しが必要
・Chrome以外は、最新のバージョンのブラウザだとなんかうまくいかない場合がある、safariが一番クセがある?
・なんもなくてもよくわからないところで、たまにNGになる
・画面遷移したり、データの読み込みが走ったあとの処理を行うときに、time.sleep(秒)を入れた方が安定する。
→ブラウザ環境によっては、例えば、firefox47.0ではなくても通ったりするが、firefox48.0では入れないと通らなかったりする
■自分の課題のまとめ
・Sierra & Safari 10.0のテストが不可
・Safari系でalert使ったときのエラー回避
・Firefoxの最新版の安定化
・いろんなブラウザ設定に対してスクリプトを実行させるときの適切な書き方
今は、一つのテストケースに対して、一つのファイル(クラス)でそれぞれのブラウザ設定desired_capabilitiesをfor文で回して行っている
→途中でエラーになると他の設定は確かめない状態
■安定度
Chrome系 → Firefox 47.0以下 → ★ここまではほぼ対応いらず★ → IE10.0 → IE11.0 → Firefox 50.0 beta, 49.0, 48.0
以上はなんとか対応できている、以下はまだ対応できていない
Safari 9.1(alert以外は結構まともに動く) → Safari 10.0(なんかいろいろ動かない)
■■対策概要■■
・全体で必須
- javascriptでできたところの処理は書き換える
- ブラウザを新しく開いて、新しいブラウザを操作する場合の処理を入れてあげる必要がある
・IE系について - 画面から見えていないElementの操作などはできない (Chromeなどだったら可能)
→長い画面で一番下の方にあるボタンを押したいようなケースでよく発生した。
・Firefox系について - 48.0以上はよくエラーになる、sleepしてあげる必要がある
→例えば、47.0では、sleepしなくても処理がされたケースでも50.0 betaだと10秒sleepしてやっと処理がされたケースとかあった
※IDEだとwaitForElementPresentを使うことで、is_element_presentなどにより、エレメントが表示されるまで30秒分for文ループを行う方法もありましたが、
その方法では、timeoutしてしまうケースが多かったので使っていません。
・Safari系(というかOS X系) - Sierra & Safari 10.0がうまく動かない(未解決)
- Safari自体がモーダルダイアログ(Alertなど)が扱えない?らしい(未解決)
https://groups.google.com/forum/#!topic/seleniumjp/jLLEYoojrPk
・その他
assertEqualがなぜかイコールにならないとエラーになる場合がある
■■対策詳細■■
javascriptでできたところの処理は書き換える
※必要ないケースもあります。
※selenium builderからエクスポートした時に解消されるケースもあります。
修正前driver.find_element_by_id("dateなどelementのid").click() # ERROR: Caught exception [Error: unknown strategy [class] for locator [class=day]]
修正後
driver.find_element_by_id("dateなどelementのid").click() driver.find_element_by_xpath("(//*[@class='day'])").click()
ブラウザを新しく開いて、新しいブラウザを操作する場合の処理を入れてあげる必要がある
修正前driver.find_element_by_xpath(u"(//*[contains(text(), 'クリックしたいところのテキスト文')])").click() # ERROR: Caught exception [ERROR: Unsupported command [selectPopUp | | ]]
修正後
driver.find_element_by_xpath(u"(//*[contains(text(), 'クリックしたいところのテキスト文')])").click() driver.switch_to_window(driver.window_handles[1])
(window_handles[1]の引数は、新しいウィンドウが増えるたびに数字も増えていきます)
最初の操作windowが0番で、新しいwindowが作られるたびに1,2,3…と増加していきます画面から見えていないElementの操作などはできない のケース
修正内容# Windowの最大化&下方向にスクロール browser.maximize_window() browser.execute_script('window.scrollTo(0, 1500)')
・参考
https://qiita.com/TakesxiSximada/items/dedd81f1da4379f3006e以下のも試してみたい
https://hacknote.jp/archives/5730/js.executeScript("javascript:window.scrollBy(0,-80)");//scrollIntoView(true)だけだとスクロールしすぎるので、少し戻す
Firefox48.0以上はよくエラーになる、sleepしてあげる必要がある のケース
実行すると以下のようなエラーが出るので、出たらtime.sleep(2〜10)を行ってあげる
IE系でもたまに同じ件のエラーが発生する場合があります
※やりとりするデータ量や処理速度にも依るが、firefox 48.0以上の場合、画面遷移がある処理のあとには必須でした。
※とても多いので、もう最初から全ての処理の間にtime.sleep(10)を入れる方法の方が、全体の工数は短く済むかも知れません。
・パターン1
python側エラーElementNotVisibleException: Message: Cannot click on element (WARNING: The server did not provide any stacktrace information)
browserstack側エラー
⇒Cannot click on element
・パターン2
python側エラーNoSuchElementException: Message: Unable to find element with link text == \u30b0\u30eb\u30fc\u30d7\u7ba1\u7406 (WARNING: The server did not provide any stacktrace information)
browserstack側エラー
⇒Unable to find element with link text == グループ管理
⇒Unable to locate element: #name
5., 6. は調査中
■自分のためのテストケース作成の流れ
- 安定したブラウザ(firefox47.0 or chrome)で動く状態までつくる
- sleepを入れる。
- firefox50.0 betaで動作させて確認する
- IE11.0で動作させて確認する
コメント