5

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

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

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

4

5 回答 5

5

与 javascripts 警报不同,模块化窗口通常是同一个 DOM 的一部分。唯一使它们与页面其余部分不同的是它们位于不同的框架中。

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

所以找到框架做一个driver.switchTo().frame()然后对你想要的元素执行动作。操作完成后,很可能会将您带回主页。用于driver.switchTo().defaultContent()将焦点带回主页。

这个SO 问题会很有帮助。

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

于 2013-01-10T11:26:59.440 回答
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);
    }
}
于 2013-02-17T15:14:59.187 回答
1

你在使用页面对象吗?

如果你正在使用它,你需要在弹出窗口出现后找到元素,因为如果在你第一次打开页面时它们不可见,initElements 不会初始化它们。

于 2013-01-07T11:16:00.690 回答
0

假设您谈论的是 javascript 警报。

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

或者

直接执行JavaScript来处理alert

也许等待警报出现

于 2013-01-10T04:35:12.060 回答
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 

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

于 2013-01-11T06:35:30.083 回答