我不是在谈论诸如警报、确认或提示对话框之类的弹出窗口。在应用程序中,如果我单击按钮弹出窗口就会打开。我无法将 WebDriver 切换到弹出窗口。
我尝试使用 getWindowHandles() 但它只返回主窗口句柄。
我也试过 switchTo.window("windowname") 但它没有用。
我不是在谈论诸如警报、确认或提示对话框之类的弹出窗口。在应用程序中,如果我单击按钮弹出窗口就会打开。我无法将 WebDriver 切换到弹出窗口。
我尝试使用 getWindowHandles() 但它只返回主窗口句柄。
我也试过 switchTo.window("windowname") 但它没有用。
与 javascripts 警报不同,模块化窗口通常是同一个 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 不会初始化它们。
假设您谈论的是 javascript 警报。
final Alert a = driver.switchTo().alert();
a.accept();
或者
和
根据 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
事件之间的延迟是必要的,否则您将错过事件。