[webdriver]IE上でのウィンドウハンドル遷移についてついて

1,326 views
Skip to first unread message

森慶祐

unread,
Mar 5, 2017, 7:50:19 AM3/5/17
to 日本Seleniumユーザーコミュニティ
はじめまして、森と申します。

現在、eclipse上で以下の手順を考えているのですが、
なかなか実現できず、相談させていただきました。
何卒よろしくお願いいたします。

<手順>
1.親ウィンドウにてリンク(子ウィンドウ①)をクリック
2.子ウィンドウ①が開く
3.子ウィンドウ①を閉じる
4.親ウィンドウでリンク(子ウィンドウ②)を開く
5.子ウィンドウ②が開く

<事象>
1~2については再現出来ているのですが、
3以降の操作が行われず、以下のエラーが表示されます。
org.openqa.selenium.NoSuchWindowException: No window found (WARNING: The server did not provide any stacktrace information)

=環境=
OS
・Windows7(32bit)

ブラウザ
・IE10

Java
・java1.8.0

・eclipse4.5.2
・selenium-java-3.1.0
・IEDriverServer(32bit)3.1.0

=コード=
driver.get( "親ウィンドウ_URL");
driver.findElement(By.linkText("子ウィンドウ①_リンクテキスト")).click();
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
driver.switchTo().window("子ウィンドウ①_ウィンドウ名");
driver.close();
driver.switchTo().window("親ウィンドウ_ウィンドウ名");
driver.findElement(By.linkText("子ウィンドウ②_リンクテキスト")).click();

以上です。
よろしくお願いいたします。

伊藤望

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

はじめまして。伊藤です。

見た感じ動きそうですね。
エラーのスタックトレースが出ていると思うのですが、
具体的にコードのどの行でエラーになるのでしょうか。

森慶祐

unread,
Mar 5, 2017, 10:39:19 PM3/5/17
to 日本Seleniumユーザーコミュニティ
伊藤さん

早速ご返信いただきましてありがとうございます。
森です。

まず、先にお送りしていた内容に誤りがありましたので、
先に訂正させていただきます。

※当方プラグラムの知識が0の状態で、seleniumに触っております。
その為、見当違いの回答をしてしまうかもしれませんがご容赦ください。
宜しくお願い致します。


先にお送りいたしました以下のコードを流しますと、
エラーは出ず、走りっぱなしになります。

driver.get( "親ウィンドウ_URL");
driver.findElement(By.
linkText("子ウィンドウ①_リンクテキスト")).click();
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
driver.switchTo().window("子ウィンドウ①_ウィンドウ名");
driver.close();
driver.switchTo().window("親ウィンドウ_ウィンドウ名");
driver.findElement(By.linkText("子ウィンドウ②_リンクテキスト")).click();

その為、上記のコードに一行加えてみました。

driver.get( "親ウィンドウ_URL");
driver.findElement(By.
linkText("子ウィンドウ①_リンクテキスト")).click();
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
driver.switchTo().window("子ウィンドウ①_ウィンドウ名");

【driver.findElement(By.linkText("子ウィンドウ①にあるリンク")】←追加分


driver.close();
driver.switchTo().window("親ウィンドウ_ウィンドウ名");
driver.findElement(By.linkText("子ウィンドウ②_リンクテキスト")).click();

そうしてみましたところ、以下のエラーがはかれます。


org.openqa.selenium.NoSuchWindowException: No window found (WARNING: The server did not provide any stacktrace information)


Capabilities [{browserAttachTimeout=0, ie.enableFullPageScreenshot=true, enablePersistentHover=true, ie.forceCreateProcessApi=false, ie.forceShellWindowsApi=false, pageLoadStrategy=normal, ignoreZoomSetting=false, ie.fileUploadDialogTimeout=3000, version=11, platform=WINDOWS, nativeEvents=true, ie.ensureCleanSession=false, elementScrollBehavior=0, ie.browserCommandLineSwitches=, requireWindowFocus=false, browserName=internet explorer, initialBrowserUrl=http://localhost:21506/, javascriptEnabled=true, ignoreProtectedModeSettings=false, enableElementCacheCleanup=true, unexpectedAlertBehaviour=dismiss}]
Session ID: 07d253a9-4881-4ebf-bb0f-c2113e1dc8fe
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:216)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:168)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:635)
    at org.openqa.selenium.remote.RemoteWebDriver$RemoteTargetLocator.window(RemoteWebDriver.java:948)
    at com.mori.sample.new_window.setUp(new_window.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

以上です。
答えになっておりますでしょうか??

宜しくお願い致します。

2017年3月6日月曜日 0時22分07秒 UTC+9 伊藤望:

伊藤望

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


> エラーは出ず、走りっぱなしになります。
私もIEで同じ現象に遭遇したことがあるのですが、IE11の実行に必要な設定をしていないとそうなりました。
(参考: http://bitwave.showcase-tv.com/selenium%E3%81%A7internet-explorer11%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E6%96%B9%E6%B3%95/
この中でもレジストリの設定が原因だった気がします)

エラーログを見るとversion=11と書いてあるので、もしかしてIE10でなくIE11では?と思います。

> そうしてみましたところ、以下のエラーがはかれます。

at com.mori.sample.new_window.setUp(new_window.java:23)
がエラー行のようです。つまりnew_window.javaの23行目の
driver.switchTo().windowでエラーなのですが、23行目はどの行でしょう?

No window foundというエラーメッセージは、たぶんウィンドウが1つもないと言っており、
driver.close();で子ウィンドウを閉じたつもりが、なぜか親ウィンドウの方が閉じてしまった、
という状況に見えます。
予想と違うウィンドウが閉じていたりしないでしょうか?
(Thread.sleepコマンドを入れる、eclipseのブレークポイント機能を使う、
などしてテスト実行を途中停止して確認できると思います)

mori

unread,
Mar 9, 2017, 10:55:38 PM3/9/17
to 日本Seleniumユーザーコミュニティ
伊藤さん

ご回答いただいていながら、
返信が遅くなってしまいまして申し訳ございません。

>私もIEで同じ現象に遭遇したことがあるのですが、
>IE11の実行に必要な設定をしていないとそうなりました。
>(参考: http://bitwave.showcase-tv.com/selenium%E3%81%A7internet-explorer11%E3%82%92%E5%8B%95%E3%81%8B%E3%81>%99
%E6%96%B9%E6%B3%95/
>この中でもレジストリの設定が原因だった気がします)
>エラーログを見るとversion=11と書いてあるので、
>もしかしてIE10でなくIE11では?と思います。

自宅→11
作業場所→10

で同様のテストケースを作成して検証していたので、
ごちゃとごちゃになっておりました。。。申し訳ありません。
レジストリの設定(iexplore.exeのDWORD(32ビット)値)については、
自宅・作業場所ともに行っていたのですが、
相変わらず、走りっぱなしになることがたびたび起きています。


ご相談させていただいていた件ですが、
以下のコントロール遷移のコードを以下に書き直してみたところ、
成功いたしました。

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

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

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


原因は、親ウィンドウのコントロールを明示的に取得していなかったから??と考えております。
(エラーを解読できず、手当たり次第方法を試しておりました。
質問しておきながら自己解決してしまっていて大変申し訳ありません。。。。。)

また、厚かましいのは承知の上ですが、
追加でお聞きしたいことがございます。

内容が異なる為、別スレッドを立てたいと思いますので、
そちらでもお付き合いいただけますと幸いです。

何卒宜しくお願い致します。
2017年3月7日火曜日 0時42分29秒 UTC+9 伊藤望:
Reply all
Reply to author
Forward
0 new messages