如何从主窗口切换到弹出窗口?

时间:2012-12-31 07:15:17

标签: java selenium webdriver modal-dialog

我不是在谈论像警报,确认或提示对话框这样的弹出窗口。在应用程序中,如果我点击一个按钮,弹出窗口就会被打开。我无法将WebDriver切换到弹出窗口。

  

我尝试使用getWindowHandles()但它只返回主窗口句柄。

     

我也尝试过switchTo.window(“windowname”),但它没有用。

5 个答案:

答案 0 :(得分:5)

通常,模块化Windows是同一个DOM的一部分,与javascripts警报不同。只有将它们与页面其他部分区分开来的是它们处于不同的框架

尝试查看此模块化窗口是否位于框架或iframe标记内。如果父级中的任何一个是frame或iframe,则必须先将该上下文更改为该帧,然后才能对模态窗口执行任何操作。

因此,找到框架执行driver.switchTo().frame(),然后对您想要的元素执行操作。一旦完成操作,这很可能会将您带回主页面。使用driver.switchTo().defaultContent()将焦点恢复到主页面。

This 这个问题会有所帮助。

如果这不起作用,那么查看页面或其HTML会很有帮助。

答案 1 :(得分:1)

您使用的是网页对象吗?

如果您使用此功能,则需要在弹出窗口后找到元素,因为如果首次打开页面时它们不可见,initElements将不会初始化它们。

答案 2 :(得分:1)

//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);
    }
}

答案 3 :(得分:0)

假设您正在谈论javascript警报。

final Alert a = driver.switchTo().alert(); 
a.accept(); 

Execute JavaScript directly to handle the altert

Maybe wait for the alert to show up

答案 4 :(得分:0)

根据webdriver这个问题已在2.16中修复,但仍然无效 Support for 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 

事件之间的延迟是必要的,否则你会错过事件。