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
相关产品推荐
相关产品推荐

