如何处理UnhandledAlertException并正确截取应用全页面截图
解决UnhandledAlertException及Robot截图范围问题
核心思路
遇到UnhandledAlertException时,优先处理Alert(可选关闭或保留),再尝试截图;如果必须保留Alert状态截图,就调整Robot的截取范围为当前浏览器窗口,而非系统全屏。通过WebDriver获取当前浏览器窗口的位置和尺寸,以此限定Robot的截图区域。
具体实现方案
1. 优化异常捕获逻辑,先处理Alert
修改getScreenshot方法,捕获到UnhandledAlertException时,先尝试切换到Alert,根据需求选择关闭或保留(如果要保留Alert状态截图,就不关闭),再执行截图:
protected void getScreenshot(String path ) { try { byte[] screenshot = screenshotService.takeScreenshot(); screenshotService.saveBytesArrayToFile(path, screenshot); } catch (UnhandledAlertException e) { log.debug("UnhandledAlertException occurred, handling alert first"); RemoteWebDriver driver = DriverManager.getRemoteWebDriver(); // 方案1:关闭Alert后用WebDriver截图(优点:精准,无需Robot) Alert alert = driver.switchTo().alert(); log.debug("Alert text: {}", alert.getText()); alert.accept(); // 也可使用alert.dismiss()关闭 // 关闭Alert后重新用WebDriver截图 byte[] screenshot = screenshotService.takeScreenshot(); screenshotService.saveBytesArrayToFile(path, screenshot); // 方案2:保留Alert,用Robot截取当前浏览器窗口(需要保留Alert状态时用) // RobotService robotService = new RobotService(); // BufferedImage screenshot = robotService.takeBrowserWindowScreenshot(driver); // screenshotService.saveBufferedImageToFile(path, screenshot); } catch (Exception e) { log.debug("Other exception during screenshot capture, using Robot full screen"); RobotService robotService = new RobotService(); BufferedImage screenshot = robotService.takeScreenShot(); screenshotService.saveBufferedImageToFile(path, screenshot); } catch (Throwable e) { log.error("Exception", e.getMessage(), e); } }
2. 给RobotService添加截取浏览器窗口的方法
新增方法,通过WebDriver获取窗口的位置和大小,生成对应截取区域:
public class RobotService { // 原有全屏截图方法保留 public BufferedImage takeScreenShot() { try { Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); return new Robot().createScreenCapture(screenRect); } catch (Exception e) { return null; } } // 新增:截取当前浏览器窗口 public BufferedImage takeBrowserWindowScreenshot(RemoteWebDriver driver) { try { // 获取浏览器窗口的位置和尺寸 Point windowLocation = driver.manage().window().getPosition(); Dimension windowSize = driver.manage().window().getSize(); // 创建对应区域的Rectangle Rectangle browserRect = new Rectangle( windowLocation.getX(), windowLocation.getY(), windowSize.getWidth(), windowSize.getHeight() ); return new Robot().createScreenCapture(browserRect); } catch (Exception e) { log.error("Failed to capture browser window screenshot", e); // 失败时 fallback 到全屏截图 return takeScreenShot(); } } }
3. 注意事项
- 如果浏览器窗口处于最大化状态,
getPosition()返回的x/y通常为0,此时截取范围和全屏一致;窗口化状态下则能精准截取浏览器区域。 - 多显示器环境下,需确认WebDriver获取的窗口坐标是否对应当前显示器,必要时可结合
GraphicsEnvironment获取显示器信息校准。 - 处理Alert时建议记录Alert文本,方便后续问题排查。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

