应用内购买测试 - Appium + XCuitest + Java
应用内购买测试 - Appium + XCuitest + Java
嘿,我之前在iOS内购测试时也碰到过类似的系统弹窗识别坑,结合你用的Appium 2.13.1 + Xcuitest@8.4.3 + iOS18.3环境,给你几个实用的思路试试:
先把元素等待逻辑拉满:iOS18的系统内购弹窗加载速度可能比预期慢,尤其是沙箱环境下。别刚触发弹窗就急着调用
getPageSource(),给个3-5秒的显式等待,确保弹窗完全渲染出来再去定位元素。比如Java里可以这么写:WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5)); try { WebElement subscribeBtn = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("你的订阅按钮 accessibility ID"))); subscribeBtn.click(); } catch (TimeoutException e) { // 这里可以加日志排查,或者做 fallback 处理 }试试切换上下文:iOS的系统弹窗(比如内购、权限提示)有时候不在默认的
NATIVE_APP上下文里。你可以先打印所有可用上下文,看看有没有XCUI相关的特殊上下文,切换过去再定位元素,处理完记得切回来:Set<String> contexts = driver.getContextHandles(); String originalContext = driver.getContext(); for (String context : contexts) { System.out.println("当前可用上下文:" + context); if (context.contains("XCUI")) { driver.context(context); // 在这里尝试定位并点击订阅按钮 break; } } // 处理完弹窗切回原上下文 driver.context(originalContext);直接调用XCUITest原生能力:既然用的是Xcuitest驱动,不如直接调用底层的XCUITest API来操作弹窗,这种方式往往能绕过Appium上下文的限制。比如用
executeScript执行XCUITest脚本定位订阅按钮:// 假设订阅按钮的label是"Subscribe",用predicate定位 String xcScript = "var predicate = NSPredicate.predicateWithFormat('label == \"Subscribe\"'); return XCUIApplication().buttons.elementMatchingPredicate(predicate).tap();"; driver.executeScript("mobile: executeScript", Collections.singletonMap("script", xcScript));小彩蛋:自动处理弹窗的配置:如果只是想快速跳过弹窗,你可以在Desired Capabilities里设置
autoAcceptAlerts为true,不过这个会自动接受所有系统弹窗,可能不符合你需要明确点击订阅按钮的测试场景,谨慎使用:capabilities.setCapability("autoAcceptAlerts", true);
另外,关于后续的沙箱账号密码弹窗,同样可以用上面的等待+定位逻辑来处理,比如找到密码输入框和确认按钮,输入沙箱账号密码即可。
备注:内容来源于stack exchange,提问作者MilaLynx
相关产品推荐
相关产品推荐

