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

Appium Android截图报错:Illegal base64 character a 解决方案咨询

Android USB连接下Appium截图报错的替代方案

我通过USB连接Android手机做自动化测试,希望在测试失败时自动截图,但执行File source = driver.getScreenshotAs(OutputType.FILE);时抛出java.lang.IllegalArgumentException: Illegal base64 character a错误。

原代码

public String getScreenshotPath(String testCaseName, AppiumDriver driver) throws IOException {
    File source = driver.getScreenshotAs(OutputType.FILE);
    String destinationFile = System.getProperty("user.dir")+"//reports"+testCaseName+".png";
    FileUtils.copyFile(source, new File(destinationFile));
    return destinationFile;
}

报错堆栈

java.lang.IllegalArgumentException: Illegal base64 character a
at java.base/java.util.Base64$Decoder.decode0(Base64.java:746)
at java.base/java.util.Base64$Decoder.decode(Base64.java:538)
at java.base/java.util.Base64$Decoder.decode(Base64.java:561)
at org.openqa.selenium.OutputType$2.convertFromBase64Png(OutputType.java:58)
at org.openqa.selenium.OutputType$2.convertFromBase64Png(OutputType.java:55)
at org.openqa.selenium.OutputType$3.convertFromBase64Png(OutputType.java:78)
at org.openqa.selenium.OutputType$3.convertFromBase64Png(OutputType.java:75)
at org.openqa.selenium.remote.RemoteWebDriver.getScreenshotAs(RemoteWebDriver.java:335)
at utils.AppiumUtils.getScreenshotPath(AppiumUtils.java:73)
at Appium.AppiumMaven.Listeners.onTestFailure(Listeners.java:47)
at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:99)
at org.testng.internal.invokers.TestInvoker.runTestResultListener(TestInvoker.java:277)
at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:978)
at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:194)
at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148)
at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.testng.TestRunner.privateRun(TestRunner.java:806)
at org.testng.TestRunner.run(TestRunner.java:601)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:433)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:427)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:387)
at org.testng.SuiteRunner.run(SuiteRunner.java:330)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1176)
at org.testng.TestNG.runSuites(TestNG.java:1099)
at org.testng.TestNG.run(TestNG.java:1067)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

替代解决方案

方案1:改用Base64编码手动解码保存

该错误是因为Appium返回的截图数据不符合标准Base64格式,导致Selenium内置解码逻辑报错。可以直接获取Base64字符串,再手动解码为文件:

public String getScreenshotPath(String testCaseName, AppiumDriver driver) throws IOException {
    String base64Screenshot = driver.getScreenshotAs(OutputType.BASE64);
    byte[] imageBytes = Base64.getDecoder().decode(base64Screenshot);
    
    String destinationFile = System.getProperty("user.dir") + "//reports//" + testCaseName + ".png";
    try (FileOutputStream fos = new FileOutputStream(destinationFile)) {
        fos.write(imageBytes);
    }
    return destinationFile;
}

如果仍解码失败,尝试用Base64.getMimeDecoder()替代Base64.getDecoder(),部分场景下MIME格式的Base64兼容性更好。

方案2:通过ADB命令直接截图

绕开Appium的截图接口,直接调用ADB命令在手机端生成截图后拉取到本地:

public String getScreenshotPath(String testCaseName, AppiumDriver driver) throws IOException, InterruptedException {
    String deviceTempPath = "/sdcard/screenshot_temp.png";
    String localDestPath = System.getProperty("user.dir") + "//reports//" + testCaseName + ".png";
    
    // 执行手机端截图命令
    Process process = Runtime.getRuntime().exec("adb shell screencap -p " + deviceTempPath);
    process.waitFor();
    
    // 拉取截图到本地
    process = Runtime.getRuntime().exec("adb pull " + deviceTempPath + " " + localDestPath);
    process.waitFor();
    
    // 删除手机端临时文件
    Runtime.getRuntime().exec("adb shell rm " + deviceTempPath);
    
    return localDestPath;
}

注意:确保电脑已配置ADB环境变量,且手机已通过USB授权连接。

方案3:排查版本兼容性

部分场景下,错误是Appium Server、UiAutomator2 Driver与Selenium版本不匹配导致的:

  • 升级Appium Server到最新稳定版(如2.x系列)
  • 升级UiAutomator2 Driver:执行appium driver update uiautomator2
  • 确保Selenium Java客户端版本与Appium Server版本兼容(建议Selenium 4.x搭配Appium 2.x)

内容的提问来源于stack exchange,提问作者javabeginer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:05:25