WinActorで困った話　その４　～ポップアップが操作できない～

#今回の内容
こんにちは。
またWinActorでシナリオ作っている時にトラブルが発生しました。（いつもトラブル発生してる気がする）
今回はChromeでポップアップ画面を表示した際に、ポップアップが操作出来ないというトラブルが発生しました。
それを何とか解決出来たのでメモとして残します。

#起きた問題と検証
まずは今回発生した問題とその検証結果から出した推測をまとめました。
##問題：ポップアップが動かない！
Chromeでアクションするシナリオを作成していき、画面上でボタンをクリック⇒ポップアップ画面を表示、ここまではいつも通り。
で、ChromeのシナリオなのでポップアップからXPathを取得し、ボタンをクリックするライブラリを設定しテスト実行！
・・・したんですが、ポップアップでボタンをクリックすることなくエラーが発生。
ポップアップを表示したまま、そこでシナリオが停止しました。
何となく理由は推測出来るけども、検証を実施！

##検証結果
とりあえず検証して推測出来たことは、

- 新たに開いたポップアップは非アクティブ
- 非アクティブな画面に対しXPathは指定不可（ブラウザ名を指定しても）
- 元画面もポップアップも同じブラウザ名を使用している

ということが分かりました。

##表示したポップアップへ移動する
検証の結果、ポップアップを操作するためには画面のアクティブ状態を元画面からポップアップに移す必要があるようです。
色々試した結果、このようにシナリオを組むことで画面のアクティブ状態を切り替えることが出来ました。

**シナリオ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311963/65308e49-b30c-ccf0-dcb2-85ec35b639ec.png)

**[次のウインドウへ移動]の設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311963/3518df54-fdf9-80dc-fbf0-69c91be668ce.png)

大事なのは「**次のウインドウへ移動**」のライブラリです。
これを指定することで、**現在表示している同じブラウザ名を持つ別ウインドウへアクティブ状態を移動**することが出来ます。（今回だとポップアップが対象）
「次のウインドウへ移動」の設定内容は、ブラウザ名以外は適当でＯＫです。
これで、ポップアップのXPathを指定して操作可能になりました。

#またまた問題：今度は元画面が動かない！
上の方法でポップアップを操作することには成功しました･･･が！
今度はポップアップの閉じるボタンを押して、ポップアップをクローズすると元画面の操作が出来ないという問題が発生。
同じように「次のウインドウへ移動」ライブラリを使えばＯＫだろうと思って実装してみたところ、今度は上手くいかずにエラーが発生。なんでぇ～？

##対応その１
次のウインドウといっても、既にポップアップがクローズして次のウインドウが無いので処理失敗したと予想。
なので、「**任意のウインドウへ移動**」ライブラリを使用して元画面へ戻ることにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311963/a8f52a27-7ec9-0017-1952-00682f8acae3.png)
ここで大事になるのが「**ウインドウハンドル取得**」ライブラリ。
これを「任意のウインドウへ移動」ライブラリに設定するので、必ず取得しておく。

修正して再度シナリオを実行してみると・・・エラー！なんでぇ～？！

##検証
どうにも上手くいかないので、再度検証開始。
色々と検証をしてみるとこんな感じに

- シナリオを実行すると、成功したり失敗したりと安定しない
- ポップアップクローズ後、ウインドウハンドル取得を行うと何も取得できない
- 試しに「任意のウインドウへ移動」が成功するまで無限ループするシナリオを作ってみたけど、一度ループすると移動が１００％失敗する
- 「次のウインドウへ移動」の移動結果を見ると確定でFalseが返ってくる

検証した結果を見てみると、どうやらポップアップが消えたということをWinActorが認識出来ていない模様。
ならば、先の問題の検証結果との組み合わせでいけるのではないか…？（ちょいと強引な解釈ですが）

##対応その２
前回と今回の検証結果を上手く組み合わせて、シナリオを作成してみると遂に成功！
その結果がこちら！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311963/59333e49-2802-2f06-c22f-d00c27d4b026.png)
はい「任意のウインドウへ移動」の前に「**次のウインドウへ移動**」を挿入しました。それだけ。本当にこれだけ。
何故かわからないけど、これで上手くいきました。もちろんエラーも発生しない！
ちなみに「次のウインドウへ移動」の移動結果は**確定でFalse**です。
この確定で失敗しているライブラリを入れている理由は、下の考察に書いてあります。

#考察
上手くいったのはいいけど、何かスッキリしないので考察してみる。
※あってるかわからないので鵜呑みにしないこと！

- ポップアップクローズなど、WinActor以外の機能でウインドウクローズを行った場合、WinActorは**ブラウザ名で指定したブラウザのウインドウ情報を保持出来ていない**（出来る場合があるのは多分処理速度が影響してる。重い場合などは画面が長く残るのでそのため）
- 「任意のウインドウへ移動」が失敗するのは、ウインドウ情報が保持出来ていないから
- 「次のウインドウへ移動」を指定することで、指定したブラウザ名のブラウザウインドウを**強制的にアクティブに出来る**（１つでも同じブラウザ名のものがあれば、それがアクティブに）
- 上の方法で強制的にアクティブ化することで、WinActorはウインドウ情報を再度保持することが出来ている

とまぁ、こんな感じじゃないかなと考察してみました。
正直な話、確証が全く無いので正しい理由が知りたいところですね。

#おわりに
今回は画面認証をどうしても使いたくなくて、無理やりポップアップをXPathで操作出来るよう試行錯誤してみました。画面認証を使いたくなかった理由は、対応ページのポップアップが動的ページのためにレイアウトが安定しなかったからです。
もし同じようにポップアップ制御に困っている人がいれば試してみると上手く行くかもしれません。
ちなみに今回は画面が元画面とポップアップの２つだけだったから問題なかったですが、３つ以上になった場合の検証は行っていません。３つ以上の場合は、また別の処理が必要になるかもしれません。

ポップアップが絡むシナリオは、対象ページによっても動作が変わってくるみたいです。
この方法が必ず上手く行く保障は無いので、そこだけ注意してください。
もっといい方法あるよ！って人はコメントとかで教えてくれると嬉しいです！

しっかし、WinActorは有料ソフトのせいか資料やページが少なくて困ります。（フォーラムの情報だけでは不完全ですし）
もし、このページの情報が役立てば幸いです。
また、こういうことって出来ないのかな？っていうのがあれば、検証してみますのでコメントにでも書いてください。時間があればやってみます！