リダイレクトやframeが絡む場合のSelenium

最近UIのテストで利用している Selenium。 リダイレクトやframeが絡むケースでプチはまりしたのでメモ。

以下のようなケース。

1. ページAへアクセス
2. ログイン用ページBへリダイレクト
3. ID, パスワードを送信
4. ログイン成功でページAへリダイレクト

ページBにはframeがあり、frame内にID等の入力ボックスが配置されています。 これに対してSelenium IDEで記録したコマンドは以下。

1. open (ページAのURL)
2. selectFrame (対象のframe)
3. type (id)
4. type (password)
5. clickAndWait (login_button)

実行してみると、'2. selectFrame'で 'element not found'が発生しました。 frameのloadがまだ終わっていないのに操作しようとしているのだろうと考え、waitForPageToLoadやwaitForFrameToLoadを挿入するも効果なし。 リダイレクトがあるとwaitForPageToLoadは使えないっぽい。

結局waitForElementPresentを使って、 目的のelementがページ内に表れるのを待つ方が良さそうです。

1. open (ページAのURL)
2. waitForElementPresent (対象のframe)
3. selectFrame (対象のframe)
4. waitForElementPresent (対象の入力ボックス)
5. type (id)
6. type (password)
7. clickAndWait (login_button)

2ではframe、4ではframe内の入力ボックスの出現をそれぞれ待っています。 これでログインを通過できるようになりました。

loadがちゃんと終わったかどうかを判別するには少しコツがいりそうです。