[webdriver] 【新しいウィンドウを開いた際のコントロール遷移(親ウィンドウ→子ウィンドウ)について】

3,346 views
Skip to first unread message

mori

unread,
Mar 9, 2017, 11:45:04 PM3/9/17
to 日本Seleniumユーザーコミュニティ
森と申します。

現在、selenium webdriverを用いて、ブラウザ画面の確認を行うテストケースを作成しております。
そこで現在調査をしている項目がありまして、質問させていただきました。

【新しいウィンドウを開いた際のコントロール遷移(親ウィンドウ→子ウィンドウ)について】

=状況=
コントロールの遷移について、以下のコードを現在用いているのですが、
成功する場合と失敗する場合があります。waitの追加設定等で改善する場合もあれば、
改善した直後に、同様のソースコードでも失敗する、といった具合です。
(エラーコードは~NoSuchWindowException: No window found~)


=コード=

//親ウィンドウのコントロールを取得
String winHandleBefore = driver.getWindowHandle();

<親ウィンドウ上で、子ウィンドを開く
<待ち処理(implicitlyWait)

//子ウィンドウのコントロールを取得して、親コントロール→子コントロールへ移す
for(String winHandle : driver.getWindowHandles()){
            driver.switchTo().window(winHandle);
        }



[環境]
OS:
windows7

開発環境:
eclipse4.5.2

Java:
1.8.0_121

Seleniumツール
Selenium Standalone Server:3.1.0
IEDriverServer:3.1.0
Selenium Client & WebDriver Language Bindings:3.1.0

ブラウザ:
internet explorer8 及び 9


=質問=

①上記のコードで失敗してしまう原因は何でしょうか(不足している設定はありますでしょうか)。
②コントロール遷移のコードとしてよりbetterなものなどありますでしょうか。


以上
宜しくお願い致します。

伊藤望

unread,
Mar 15, 2017, 10:38:01 PM3/15/17
to 日本Seleniumユーザーコミュニティ
伊藤です。

for(String winHandle : driver.getWindowHandles()){
            driver.switchTo().window(winHandle);
}

は、現在のすべてのウィンドウをリストアップし、それに対し1つずつ移動していくという処理になるので、
どの順番で最終的にどのウィンドウに移動するのかはよくわからないですし、
すべてのウィンドウをリストアップした時点で子ウィンドウがまだ存在しないことはありえそうです。

ウィンドウ遷移のコードとしては、
driver.switchTo().window("ウィンドウ名")
でやるのが一番オーソドックスなやり方だと思います。

ウィンドウ名がないなら、
driver.getWindowHandles(): すべてのウィンドウをリストアップ
driver.getWindowHandle(): ウィンドウを一意に特定するハンドルという文字列(?)を取得
driver.getTitle(): ウィンドウのタイトルを取得
などを組み合わせてプログラムを組むことになると思います。
サンプルコードは、探せばどこかにあるかもしれません。
ちなみに「タイトルのウィンドウに遷移」と「新しく開いたウィンドウに遷移」のサンプルコードなら
Selenium実践入門に書きました(ステマ)。

あとは、Selenium IDEで記録してJavaプログラムにExportすれば、
何か参考になるコードが生成されるかもしれません。

ウィンドウの出てくるタイミングが問題になりそうで、何か待ち処理をいれたい、という場合、
残念ながらちょうどよいメソッドはJavaのWebDriverになさそうなので、
やはりなんらかプログラムを組まないとダメに思います。
サンプルコードは、やはり探せばどこかにあるかもしれません。

mori

unread,
Mar 21, 2017, 12:20:29 AM3/21/17
to 日本Seleniumユーザーコミュニティ
伊藤さん

森です。ご回答ありがとうございます。

driver.switchTo().window("ウィンドウ名")

でいけました。(お恥ずかしい話、ウィンドウのHTMLタイトルとウィンドウ名を勘違いしておりました、、、)

解決いたしました。ありがとうございました。


2017年3月16日木曜日 11時38分01秒 UTC+9 伊藤望:

伊藤望

unread,
Mar 21, 2017, 10:16:56 AM3/21/17
to 日本Seleniumユーザーコミュニティ
森さん

うまくいってよかったです!
Reply all
Reply to author
Forward
0 new messages