You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:02:16