Selenium WebDriver如何获取窗口名称并切换目标窗口
Selenium WebDriver 按窗口名称切换操作指南
driver.switchTo().window(String nameOrHandle) 是WebDriver提供的窗口切换入口,官方定义如下:
将驱动后续执行命令的焦点切换到具有指定名称/句柄的窗口。
传入参数支持两类值:窗口名称,或是WebDriver.getWindowHandle()返回的窗口句柄;如果无法找到对应窗口,会抛出NoSuchWindowException异常。
如何获取当前窗口的名称
WebDriver没有直接提供获取窗口名称的原生API,窗口名称本质是浏览器窗口对象的window.name属性,直接通过执行JS脚本即可读取:
// 初始化JS执行器 JavascriptExecutor js = (JavascriptExecutor) driver; // 读取当前窗口的name属性值 String currentWindowName = (String) js.executeScript("return window.name;");
如果当前窗口从未被显式设置过name属性,上述代码会返回空字符串。窗口名称可以被前端页面通过JS修改,不是固定不变的值。
如何基于窗口名称切换到新打开的窗口
根据你是否提前知道目标窗口的名称,分两种处理方式:
方式1:提前已知目标窗口名称
如果新窗口是你自己通过代码触发打开的(比如点击带固定target属性的链接、调用window.open(url, winName)主动打开窗口),你提前知道窗口的name值,直接把名称传入切换方法即可,不需要遍历所有窗口:
// 示例:已知新窗口名称为"paymentWin",直接切换 driver.switchTo().window("paymentWin");
方式2:未知窗口名称,需按名称匹配定位
如果新窗口是第三方逻辑触发打开、你不确定它的预设名称,需要遍历所有窗口句柄,逐个读取窗口名称做匹配:
// 定义你要找的目标窗口名称 String targetName = "userCenterWin"; // 获取当前浏览器所有打开窗口的句柄集合 Set<String> allWindowHandles = driver.getWindowHandles(); boolean findFlag = false; for (String handle : allWindowHandles) { // 切换到当前遍历到的窗口 driver.switchTo().window(handle); // 读取该窗口的名称 String currentWinName = (String) ((JavascriptExecutor) driver) .executeScript("return window.name;"); if (targetName.equals(currentWinName)) { findFlag = true; break; } } if (!findFlag) { throw new NoSuchWindowException("不存在名称为" + targetName + "的窗口"); } // 执行完上述逻辑后,driver焦点已经停在匹配到的目标窗口
注意事项
- 不要混淆三个易混概念:窗口名称是
window.name属性值、窗口句柄是WebDriver生成的会话级唯一窗口标识、页面标题是<title>标签的内容,三者没有关联,获取方式完全不同。 - 如果新窗口没有设置过name属性,是没办法通过名称匹配定位的,这种场景建议直接按句柄索引、页面URL或页面title做切换匹配。
内容的提问来源于stack exchange,提问作者user2085714
相关产品推荐
相关产品推荐

