Appium Android自动化测试:TabBar选中属性始终为false的替代验证方案
碰到过不少类似的情况,尤其是自定义实现的TabBar(比如WhatsApp这类),原生的Selected属性经常会失效,完全返回false。给你分享几个我实战中常用的验证思路,亲测靠谱:
对比UI属性差异
绝大多数TabBar都会通过视觉差异区分选中状态,比如字体颜色、图标样式(填充/轮廓)、字体粗细等。你可以用Appium Inspector分别查看选中/未选中标签的属性,找到差异点后用getAttribute()断言:// 例子:获取Chats标签的文本颜色 String chatTabColor = driver.findElement(By.id("com.whatsapp:id/chats_tab")).getAttribute("textColor"); // 断言颜色为选中状态的绿色(具体值以实际查看到的为准) Assert.assertEquals(chatTabColor, "#FF25D366");常见的可对比属性还有
fontWeight、contentDescription(有些图标选中时会加"selected"后缀)、resourceId(部分应用会给选中标签加专属ID)。验证对应页面的可见性
选中Tab的核心是切换到对应页面,所以可以通过判断目标页面的核心元素是否可见来间接验证。比如选中WhatsApp的Chats后,聊天列表的容器应该是可见的,而Status页面的容器会被隐藏:// 验证Chats页面可见 boolean isChatPageVisible = driver.findElement(By.id("com.whatsapp:id/chat_list_container")).isDisplayed(); Assert.assertTrue(isChatPageVisible); // 同时验证Status页面不可见 boolean isStatusPageVisible = driver.findElement(By.id("com.whatsapp:id/status_list_container")).isDisplayed(); Assert.assertFalse(isStatusPageVisible);检查选中状态的标记元素
很多TabBar会给选中的标签添加专属标记,比如底部的高亮下划线、背景色块。你可以查找这些标记元素是否存在/可见:// 查找Chats标签下的选中下划线 boolean hasSelectedIndicator = driver.findElement(By.xpath("//*[@resource-id='com.whatsapp:id/chats_tab']//*[@class='android.view.View' and @content-desc='selected_indicator']")).isDisplayed(); Assert.assertTrue(hasSelectedIndicator);图像识别(兜底方案)
如果以上方法都失效,还可以用Appium的图像识别功能,预先截取选中状态的Tab图标,然后匹配当前界面:boolean isChatTabSelected = driver.findElementByImage("/path/to/selected_chats_tab.png").isDisplayed(); Assert.assertTrue(isChatTabSelected);不过这个方法稳定性较差,受屏幕分辨率、亮度影响大,建议仅作为最后手段。
小提示
先用Appium Inspector仔细对比选中/未选中Tab的所有属性和结构差异,找到最稳定的判断依据——不同应用的TabBar实现差异很大,适合WhatsApp的方法不一定适合其他应用,但核心思路都是找到唯一区分选中状态的特征。
内容的提问来源于stack exchange,提问作者kshama JK

