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

5

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

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

我也尝试过switchTo.window("windowname") ,但它没有起作用。


这是基于GWT还是Jquery的窗口? - Chandana
这是JavaScript代码。javascript:LSellAccomDropDown();Reset('STC', false); - Code Enthusiastic
@Chandana 如果该网页面向公众,我早就在问题中发布了链接。 - Code Enthusiastic
是的,它与您在评论中提到的那个类似。 - Code Enthusiastic
打印 driver.getWindowHandles() 会显示多个窗口句柄吗? - user650309
显示剩余5条评论
5个回答

5
通常,模块化窗口是DOM的一部分,不像JavaScript警报那样。唯一使它们与页面其余部分不同的是它们在不同的框架中。
尝试查看此模块化窗口是否位于框架或iframe标记内。如果任何父级是框架或iframe,则必须在执行Modal Window上的任何操作之前将上下文更改为该框架。
因此,找到框架并执行driver.switchTo().frame()上的操作,然后对要操作的元素执行操作。完成操作后,这很可能会将您带回主页。使用driver.switchTo().defaultContent()将焦点返回到主页。 SO问题将有所帮助。
如果这不起作用,查看页面或其HTML将很有帮助。

这个弹出窗口确实有iframe标签和html、head、body标签,还有一个title标签。这就让我觉得它是一个不同的窗口。 - Code Enthusiastic
请注意标签的层次结构顺序。html、head(head下方是title)、body(body下方是iframe),然后是在这个iframe标签下的html、head、body。 - Code Enthusiastic
可能存在嵌套框架(即一个框架标签内部包含另一个框架标签)。从顶层框架开始,一直向下直到模态窗口上方的框架。或者,如果您能指向网站/HTML,我也许可以为您完成这项工作。 - Prashant Shukla
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/22517/discussion-between-prashant-shukla-and-code-enthusiastic - Prashant Shukla
我看过整个主窗口的HTML源代码,只有一个名为“frame”的框架。我也看过模态窗口的HTML源代码,它只有一个名为“iframe”的框架。在主窗口的HTML源代码中找不到模态窗口的HTML源代码,这让我觉得这两个是完全不同的窗口。 - Code Enthusiastic
显示剩余3条评论

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

1
你正在使用页面对象吗?
如果是的话,你需要在弹出窗口出现后查找元素,因为如果在打开页面时它们不可见,initElements 将无法初始化它们。

0

根据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 

事件之间的延迟是必要的,否则您将错过这些事件。


我一直在使用Robot类作为解决问题的方法。看来我们必须等待修复。:( - Code Enthusiastic

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接