无法在 IE 上的 Java 中使用 Selenium WebDriver 获取新的 window 句柄
Unable to get new window handle with Selenium WebDriver in Java on IE
当我单击页面上的按钮(在 IE 浏览器中)时,会打开一个新的弹出页面。我尝试获取此弹出窗口的 window 句柄的尝试失败了。这是我的第一次尝试:
String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
Set<String>s = driver.getWindowHandles();
Iterator<String> ite = s.iterator();
while ( ite.hasNext() ) {
String popUpHandle = ite.next();
if(!baseWin.equals(popUpHandle)) {
driver.switchTo().window(popUpHandle);
System.out.println(driver.switchTo().window(popUpHandle).getTitle());
此尝试仅打印基础 window 的句柄,并且如果第二个打印语句位于 if() 语句之外,但在 while() 语句内且在 if() 语句之后,它只是输出基础 window 的标题。所以这组句柄似乎只包含基础 window 句柄。
这是我的第二次尝试:
String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
ArrayList<String> popUpWin = new ArrayList<String>(driver.getWindowHandles());
popUpWin.remove(baseWin);
driver.switchTo().window(popUpWin.get(0));
System.out.println(driver.switchTo().window(popUpWin.get(0)));
此尝试 returns 一个错误,表明数组 popUpWin 为空,即大小 == 0。因此,当我调用时,弹出窗口 window 的句柄未被检索driver.getWindowHandles() 并且只包含基础 window 的句柄。这是IE问题吗?有解决方法吗?还是我忽略了代码中的某些内容? (请注意,我在此处包含的代码中忽略了暂停,因此我认为这不是问题所在。)
请注意弹出窗口不是新的 window 它是一个 Iframe 将其视为 IFrame driver.getWindowHandles();
用于处理浏览器中的多个选项卡它不是用于处理 Iframe
你应该使用 driver.switchTo().frame()
切换到那个弹出窗口
您需要做两件事:
更改 IE 浏览器中的安全设置:
打开IE浏览器,点击"Internet Options" => "Security" => 勾选"Enable Protected Mode" for "Internet", "Local intranet", "Trusted sites" and "Restricted sites".
这使 IE 驱动程序能够控制新的 window 句柄,这样当您调用
driver.getWindowHandles();
或 driver.getWindowHandles().size();
您将获得所有句柄,包括原来的 window 和新的 windows。更准确地说,您只需将所有 4 个域的安全设置设置为相同,这意味着您可以取消选中所有 4 个域的 "Enable Protected Mode",但显然不鼓励这样做。
调用driver.switchTo().window(windowName);
后,需要添加((JavascriptExecutor) driver).executeScript("window.focus();");
,IE驱动才能对window执行任何操作。
这是因为 IE 驱动程序需要它正在处理的 window 处于前台,此行帮助驱动程序获得 window 的焦点,以便它可以执行任何操作window 你想要的。
以下为完整示例:
String baseWin = driver.getWindowHandle();
//Some methods to open new window, e.g.
driver.findElementBy("home-button").click();
//loop through all open windows to find out the new window
for(String winHandle : driver.getWindowHandles()){
if(!winHandle.equals(baseWin)){
driver.switchTo().window(winHandle);
//your actions with the new window, e.g.
String newURL = driver.getCurrentUrl();
}
}
//switch back to the main window after your actions with the new window
driver.close();
driver.switchTo().window(baseWin);
//let the driver focus on the base window again to continue your testing
((JavascriptExecutor) driver).executeScript("window.focus();");
当我单击页面上的按钮(在 IE 浏览器中)时,会打开一个新的弹出页面。我尝试获取此弹出窗口的 window 句柄的尝试失败了。这是我的第一次尝试:
String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
Set<String>s = driver.getWindowHandles();
Iterator<String> ite = s.iterator();
while ( ite.hasNext() ) {
String popUpHandle = ite.next();
if(!baseWin.equals(popUpHandle)) {
driver.switchTo().window(popUpHandle);
System.out.println(driver.switchTo().window(popUpHandle).getTitle());
此尝试仅打印基础 window 的句柄,并且如果第二个打印语句位于 if() 语句之外,但在 while() 语句内且在 if() 语句之后,它只是输出基础 window 的标题。所以这组句柄似乎只包含基础 window 句柄。
这是我的第二次尝试:
String baseWin = driver.getWindowHandle();
System.out.println(baseWin);
ArrayList<String> popUpWin = new ArrayList<String>(driver.getWindowHandles());
popUpWin.remove(baseWin);
driver.switchTo().window(popUpWin.get(0));
System.out.println(driver.switchTo().window(popUpWin.get(0)));
此尝试 returns 一个错误,表明数组 popUpWin 为空,即大小 == 0。因此,当我调用时,弹出窗口 window 的句柄未被检索driver.getWindowHandles() 并且只包含基础 window 的句柄。这是IE问题吗?有解决方法吗?还是我忽略了代码中的某些内容? (请注意,我在此处包含的代码中忽略了暂停,因此我认为这不是问题所在。)
请注意弹出窗口不是新的 window 它是一个 Iframe 将其视为 IFrame driver.getWindowHandles();
用于处理浏览器中的多个选项卡它不是用于处理 Iframe
你应该使用 driver.switchTo().frame()
切换到那个弹出窗口
您需要做两件事:
更改 IE 浏览器中的安全设置:
打开IE浏览器,点击"Internet Options" => "Security" => 勾选"Enable Protected Mode" for "Internet", "Local intranet", "Trusted sites" and "Restricted sites".
这使 IE 驱动程序能够控制新的 window 句柄,这样当您调用
driver.getWindowHandles();
或driver.getWindowHandles().size();
您将获得所有句柄,包括原来的 window 和新的 windows。更准确地说,您只需将所有 4 个域的安全设置设置为相同,这意味着您可以取消选中所有 4 个域的 "Enable Protected Mode",但显然不鼓励这样做。调用
driver.switchTo().window(windowName);
后,需要添加((JavascriptExecutor) driver).executeScript("window.focus();");
,IE驱动才能对window执行任何操作。这是因为 IE 驱动程序需要它正在处理的 window 处于前台,此行帮助驱动程序获得 window 的焦点,以便它可以执行任何操作window 你想要的。
以下为完整示例:
String baseWin = driver.getWindowHandle();
//Some methods to open new window, e.g.
driver.findElementBy("home-button").click();
//loop through all open windows to find out the new window
for(String winHandle : driver.getWindowHandles()){
if(!winHandle.equals(baseWin)){
driver.switchTo().window(winHandle);
//your actions with the new window, e.g.
String newURL = driver.getCurrentUrl();
}
}
//switch back to the main window after your actions with the new window
driver.close();
driver.switchTo().window(baseWin);
//let the driver focus on the base window again to continue your testing
((JavascriptExecutor) driver).executeScript("window.focus();");