アラート、確認、プロンプト ダイアログなどのポップアップについては話していません。アプリケーションでボタンをクリックすると、ポップアップが開きます。WebDriver をポップアップ ウィンドウに切り替えることができません。
getWindowHandles() を使用しようとしましたが、メイン ウィンドウ ハンドルしか返されません。
switchTo.window("windowname") も試しましたが、うまくいきませんでした。
アラート、確認、プロンプト ダイアログなどのポップアップについては話していません。アプリケーションでボタンをクリックすると、ポップアップが開きます。WebDriver をポップアップ ウィンドウに切り替えることができません。
getWindowHandles() を使用しようとしましたが、メイン ウィンドウ ハンドルしか返されません。
switchTo.window("windowname") も試しましたが、うまくいきませんでした。
通常、モジュラーウィンドウは、JavaScriptアラートとは異なり、同じDOMの一部です。それらをページの他の部分と区別する唯一のことは、それらが異なるフレームにあるということです。
このモジュラーウィンドウがフレームまたはiframeタグ内にあるかどうかを確認してください。親のいずれかがフレームまたはiframeの場合、モーダルウィンドウでアクションを実行する前に、コンテキストをそのフレームに変更する必要があります。
したがって、フレームを見つけてdriver.switchTo().frame()
実行し、目的の要素に対してアクションを実行します。アクションが完了すると、おそらくメインページに戻ります。driver.switchTo().defaultContent()
メインページにフォーカスを戻すために使用します。
このSOの質問は役に立ちます。
これが機能しない場合は、ページまたはそのHTMLを確認すると便利です。
//handle of the master window before clicking the link
String master = driver.getWindowHandle();
driver.findElement(By.linkText("Click me")).click();
//logic for waiting for the popup, checking the size to become greater than 1 or breaking after sometime to avoid the infinite loop.
int timeCount = 1;
do
{
driver.getWindowHandles();
Thread.sleep(200);
timeCount++;
if ( timeCount > 50 )
{
break;
}
}
while ( driver.getWindowHandles().size == 1 );
//Assigning the handles to a set
Set<String> handles = driver.getWindowHandles();
//Switching to the popup window.
for ( String handle : handles )
{
if(!handle.equals(master))
{
driver.switchTo().window(handle);
}
}
ページオブジェクトを使用していますか?
これを使用している場合、最初にページを開いたときに要素が表示されていない場合、initElements は要素を初期化しないため、ポップアップが表示された後に要素を見つける必要があります。
webdriver によると、この問題は 2.16 で修正されていますが、それでも機能しません window.ShowmodalDialog のサポート
このようなケースを処理するには、 Java Robot クラスを使用できます。
例 :
Wait(5000); // Wait for model pop,
int keyInput[] =
{
KeyEvent.VK_S, KeyEvent.VK_E, KeyEvent.VK_L, KeyEvent.VK_E,
KeyEvent.VK_N, KeyEvent.VK_I, KeyEvent.VK_U, KeyEvent.VK_M,
};
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
robot.keyPress(KeyEvent.VK_TAB);
for (int i = 0; i < keyInput.length; i++)
{
robot.keyPress(keyInput[i]);
robot.delay(100);
}
robot.delay(1000);
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(1000);
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(1000);
robot.keyPress(KeyEvent.VK_TAB);
robot.delay(1000);
robot.keyPress(KeyEvent.VK_ENTER); // Save Btn
イベント間の遅延が必要です。そうしないと、イベントを見逃すことになります。
JavaScriptアラートについて話していると仮定します。
final Alert a = driver.switchTo().alert();
a.accept();
また
と