如何用Selenium Java切换至同句柄的新弹出窗口焦点?
Selenium切换同句柄同标题新窗口的解决方法
问题描述
我尝试将Driver焦点切换至点击链接后弹出的新窗口,但遇到特殊情况:父窗口与弹出窗口拥有相同句柄,且二者标题均为<Company Name - Abbreviation 1>。我用了两段Selenium Java代码尝试切换,均未成功,求其他切换焦点至新窗口的方法,以便交互该窗口。
我尝试的代码:
String originalWindow = driver.getWindowHandle(); assert driver.getWindowHandles().size() == 1; driver.findElement(By.xpath("xpath goes here")).click(); // Training // Loop through until we find a new window handle for (String windowHandle : driver.getWindowHandles()) { if (!originalWindow.contentEquals(windowHandle)) { driver.switchTo().window(windowHandle); driver.manage().window().maximize(); } }
String originalWindow = driver.getWindowHandle(); assert driver.getWindowHandles().size() == 1; driver.findElement(By.xpath("xpath goes here")).click(); // Training Thread.sleep(1000); // Loop through until we find a new window handle for (String windowHandle : driver.getWindowHandles()) { if (!originalWindow.contentEquals(windowHandle)) { driver.switchTo().window(windowHandle); driver.manage().window().maximize(); } }
可行解决方法
方法一:通过元素状态变化判断切换
点击新窗口链接后,原页面的特征元素会失效(变为 stale),可以利用这一点确认切换完成:
// 点击前定位原页面的唯一特征元素 WebElement originalPageMarker = driver.findElement(By.xpath("原页面唯一元素的xpath")); // 触发新窗口 driver.findElement(By.xpath("xpath goes here")).click(); // 等待原页面元素失效,确认已切换到新窗口上下文 new WebDriverWait(driver, Duration.ofSeconds(10)) .until(ExpectedConditions.stalenessOf(originalPageMarker)); // 此时直接操作新窗口元素即可 driver.manage().window().maximize();
方法二:模拟键盘快捷键切换窗口
利用浏览器自带的窗口切换快捷键(Windows/Linux用Ctrl+Tab,Mac用Command+Tab)强制切换:
// 触发新窗口 driver.findElement(By.xpath("xpath goes here")).click(); // 等待窗口加载(替换成更可靠的等待逻辑更好,比如等待元素出现) Thread.sleep(1000); // 模拟Ctrl+Tab切换到下一个窗口(Windows/Linux) Actions actions = new Actions(driver); actions.keyDown(Keys.CONTROL).sendKeys(Keys.TAB).keyUp(Keys.CONTROL).perform(); // Mac系统替换为以下代码 // actions.keyDown(Keys.COMMAND).sendKeys(Keys.TAB).keyUp(Keys.COMMAND).perform(); driver.manage().window().maximize();
方法三:通过URL变化确认切换
如果新窗口的URL和原窗口不同,等待URL变化即可:
String originalUrl = driver.getCurrentUrl(); driver.findElement(By.xpath("xpath goes here")).click(); // 等待URL发生变化 new WebDriverWait(driver, Duration.ofSeconds(10)) .until(ExpectedConditions.not(ExpectedConditions.urlToBe(originalUrl))); // 切换完成,操作新窗口 driver.manage().window().maximize();
内容的提问来源于stack exchange,提问作者Lukja.E
相关产品推荐
相关产品推荐

