ウィンドウを制す者はブラウザを制す
旧タイトル:ブラウザ関連のウィンドウ制御
このへんも少し掠ります。
https://winactor.com/questions/question/[横流し]失敗しがちな【プルダウン】操作のコ/
要素へのアクションの手前で、ブラウザ関連のウィンドウ制御に苦慮しているかた向けの情報です。
Python+Selenium界のノウハウの横流しです。
まだ成功してないかたはこちらからどうぞ。
https://winactor.com/questions/question/ブラウザ関連ライブラリのエラー用yesnoチャート/
フレーム内の要素ならこちらをどうぞ。
https://winactor.com/questions/question/chromeでiframeを選択したい/
https://winactor.com/questions/question/xpath-マルチリスト選択%E3%80%80エラー/
元ネタ
PythonでSelenium_ウィンドウの切替え失敗とその対処について - アウトプットして苦悩する
https://atc.hateblo.jp/entry/2018/08/07/%23_PythonでSelenium_ウィンドウの切替え失敗とその対処について
主さんが見出した法則
window_handlesの取得順は以下のとおりとなるらしい
index0 : 1(一番最初のウィンドウ)
index1 : 3(最新のウィンドウ)
index2 : 2(最新より1つ前のウィンドウ)★
一番最初のウィンドウは0に、それ以降は新しく開いたウィンドウから割り振られていく
主さんが見出した原因(の1つ)
window_handlesの取得順がたま〜にちぐはぐになってしまっていた★
主さんが見出した解決策の意訳
(idがb1の要素に対するアクションの下準備)
ウィンドウハンドルのインデックスが2より大きくなるまで待機
ウィンドウハンドルを取得
インデックス1に制御を移す例外処理
正常系
idがb1の要素に対してEnter
異常系
例外処理
正常系
インデックス2に制御を移す
idがb1の要素に対してEnter
異常系
インデックス0に制御を移す
idがb1の要素に対してEnter
WinActor版の置き換え案
(下準備の考慮も必要なのかも)
例外処理
正常系
クリック://*[@id="b1"]
異常系
例外処理
正常系
次のウィンドウへ移動:最後
クリック://*[@id="b1"]
異常系
次のウィンドウへ移動:最初
クリック://*[@id="b1"]
「次のウィンドウへ移動」のスクリプト観察
- スクリプトのswitchTypeの値が、元ネタのindexの数字の意味と重なるっぽい
- もし「最新より1つ前のウィンドウ」というオプションが存在するなら、selact caseのバリエーションに加えたらハッピーになれることがあるのかも
- たとえばこう加工したライブラリをWinActor版の置き換え案に組み込んで使いこなしたら、代替策での回避も不要になったりするのだろうか
1か所追記
switchTypeStr = !異常時の移動先|最初,最後,最後の前!
2行追加
case "最後の前"
switchType = 2
わたし自身がハードルにブチ当たることがあったら、深堀りを進めてみようと思います。
もし試されたら実感を教えてください。
関連スレッド
https://winactor.com/questions/question/元ウィンドウにウィンドウクローズが有効だった/
https://winactor.com/questions/question/ウィンドウ識別クリアの動作-クリックできない/
https://winactor.com/questions/question/ブラウザ操作の「次のウィンドウでへ移動」で移/
https://winactor.com/questions/question/意外と知らなかったwinactorのあれこれ⑧~chrome上のタブ/