Appium Android:如何启动新Activity、切换Activity及TestNG获取测试结果
没问题,这两个问题我都帮你梳理清楚,结合你的代码片段给你具体方案:
一、Appium中完全可以在应用内切换Activity
Appium专门提供了API来实现应用内或跨应用的Activity切换,对于同一应用内的场景,操作起来很简单:
- 首先你可以通过
driver.currentActivity()查看当前所在的Activity,确认切换前的状态; - 使用
driver.startActivity(appPackage, appActivity)方法直接切换到目标Activity。
结合你给出的包名和Activity名,代码示例如下:
// 假设你已经初始化好AndroidDriver实例driver // 查看当前Activity String currentActivity = driver.currentActivity(); System.out.println("Login 3333::>" + currentActivity); // 切换到目标DashBoard Activity String settingsAppPackageName = "com.xxx.xxx.xxxx.dashBoard"; String settingsAppActivityName = "com.xxxx.xxxx.xxx.xxx.DashBoard"; driver.startActivity(settingsAppPackageName, settingsAppActivityName); // 验证切换是否成功 System.out.println("切换后的Activity::>" + driver.currentActivity());
如果是同一应用内的Activity,也可以通过driver.getCapabilities().getCapability("appPackage")动态获取包名,避免硬编码,让代码更灵活。
二、TestNG中获取上一个测试用例的执行结果
TestNG提供了多种方式实现这个需求,这里给你两种最实用的方案:
方案1:通过ITestContext共享测试状态
你可以在每个测试方法中将自己的执行结果存入ITestContext的属性中,下一个测试方法直接从上下文取出上一个的结果。结合你的loginTC2方法,修改后示例:
@Test(priority = 1) public void loginTC2(ITestContext context) { boolean testPassed = false; try { System.out.println("Login 3333::>" + driver.currentActivity()); // 这里编写你的登录测试逻辑 // 假设测试执行通过 testPassed = true; Assert.assertTrue(testPassed, "登录测试失败"); } catch (Exception e) { testPassed = false; Assert.fail("登录测试抛出异常: " + e.getMessage()); } finally { // 将当前测试结果存入TestNG上下文 context.setAttribute("previousTestResult", testPassed); } } @Test(priority = 2) public void nextTest(ITestContext context) { // 从上下文获取上一个测试的结果 Boolean previousResult = (Boolean) context.getAttribute("previousTestResult"); if (previousResult != null) { if (previousResult) { System.out.println("上一个测试用例(loginTC2)执行成功,继续当前测试"); // 编写当前测试逻辑 } else { System.out.println("上一个测试用例(loginTC2)执行失败,可选择跳过或执行降级逻辑"); // 比如跳过当前测试 throw new SkipException("因上一个测试失败,跳过当前测试"); } } }
方案2:使用TestNG监听器全局监听
如果需要全局跟踪所有测试的执行结果,可以实现IInvokedMethodListener接口,在监听器中记录每个测试的状态,后续测试可以从监听器获取结果:
// 自定义测试结果监听器 public class TestResultTracker implements IInvokedMethodListener { private final Map<String, Boolean> testResultMap = new HashMap<>(); @Override public void afterInvocation(IInvokedMethod method, ITestResult testResult) { // 记录每个测试方法的执行结果,key为方法名 testResultMap.put(method.getTestMethod().getMethodName(), testResult.isSuccess()); } // 获取上一个测试的结果 public Boolean getPreviousTestResult(String currentMethodName, List<String> testOrder) { int currentIdx = testOrder.indexOf(currentMethodName); if (currentIdx > 0) { String prevMethodName = testOrder.get(currentIdx - 1); return testResultMap.get(prevMethodName); } return null; } }
然后在你的测试类上添加监听器注解:
@Listeners(TestResultTracker.class) public class YourTestClass { // 测试方法... @Test(priority = 2) public void nextTest(ITestContext context) { // 获取监听器实例 TestResultTracker tracker = context.getSuite().getListeners().stream() .filter(listener -> listener instanceof TestResultTracker) .map(TestResultTracker.class::cast) .findFirst() .orElse(null); if (tracker != null) { // 获取测试方法执行顺序 List<String> testOrder = context.getAllTestMethods() .stream() .map(ITestNGMethod::getMethodName) .collect(Collectors.toList()); Boolean prevResult = tracker.getPreviousTestResult("nextTest", testOrder); // 处理上一个测试结果 } } }
内容的提问来源于stack exchange,提问作者NikhilReddy




