自从知道 Appium+UiAutomator2 可以捕获 Android 端 Toast 的内容后,就一直想自己验证一下,今天终于在本站帖子: Toast 消息验证真的可以吗?[已测试验证,可以找到了] 第 22 楼 @sanlengjingvv 的回复的启发下,完成了通过 shell 脚本验证 Toast 内容的操作。

如果想看到怎么在单元测试代码里验证 Toast 消息的,请参考前文提到的帖子 Toast 消息验证真的可以吗?[已测试验证,可以找到了]

好了,下面先贴上脚本的内容:


#!/bin/sh

echo "start..."

sessionId=`curl http://127.0.0.1:4723/wd/hub/sessions| cut -d : -f 4| cut -d , -f 1| sed 's/"//g'`
# “curl http://127.0.0.1:4723/wd/hub/sessions” 目标是获取当前所有的sessions
# “| cut -d : -f 4| cut -d , -f 1| sed 's/"//g'” 这部分是对curl请求的结果进行处理,截取到需要的sessionId

echo "sessionId: "${sessionId} #输出获取到的sessionId

#status=`curl http://127.0.0.1:4723/wd/hub/session/${sessionId}`
#echo "status: "${status}
#获取当前sessionId的详细信息,如设备名称,应用包名等一系列信息,此脚本里不会用到这些信息,故予以注释
#如果有需要,将上面两行代码前的注释符号去除,执行脚本时即会输出相关的信息

elementId=`curl -H "Content-type: application/json" -X POST -d '{"using":"id", "value":"com.example.test:id/btn_login"}' http://127.0.0.1:4723/wd/hub/session/${sessionId}/elements| cut -d : -f 4| cut -d , -f 1| sed 's/}]//g'| sed 's/"//g'`
# “curl -H "Content-type: application/json" -X POST -d '{"using":"id", "value":"com.example.test:id/btn_login"}' http://127.0.0.1:4723/wd/hub/session/${sessionId}/elements” 目标是定位要点击产生Toast的控件,请注意根据自己的定位方式修改命令中的{"using":"id", "value":"com.example.test:id/btn_login"}内的内容,using对应的值为定位方式,如id, xpath等,value对应的值为具体的值,此处需要注意的是,如果使用id定位,则id需要包含包名,如com.example.test:id/btn_login
# “| cut -d : -f 4| cut -d , -f 1| sed 's/}]//g'| sed 's/"//g'”这部分是对curl请求的结果进行处理,截取到需要的elementId

echo "elementId: "${elementId}

clickRsp=`curl -H "Content-type: application/json" -X POST -d '{}' http://127.0.0.1:4723/wd/hub/session/${sessionId}/element/${elementId}/click`
# 执行点击操作

echo "clickRsp: "${clickRsp}

echo "start to validate toast..."

toastElementId=`curl -H "Content-type: application/json" -X POST -d '{"using":"xpath", "value":".//*[contains(@text, \"empty\")]"}' http://127.0.0.1:4723/wd/hub/session/${sessionId}/elements| cut -d : -f 4| cut -d , -f 1| sed 's/}]//g'| sed 's/"//g'`
# “curl -H "Content-type: application/json" -X POST -d '{"using":"xpath", "value":".//*[contains(@text, \"empty\")]"}' http://127.0.0.1:4723/wd/hub/session/${sessionId}/elements” 目标是包含指定文案的控件,即Toast
# 请根据要校验的Toast的内容设置命令里(@text, \"empty\") ,即“empty” 需要替换为 目标Toast里的内容

echo "toastElementId: "${toastElementId} # 输出的toastElementId不为空时,表示定位Toast控件成功

toastText=`curl http://127.0.0.1:4723/wd/hub/session/${sessionId}/element/${toastElementId}/attribute/text`
echo "toastText: "${toastText}
# 获取定位到的Toast的内容并输出

脚本执行结果如下图所示:

可以看到,脚本执行最终的输出的 value 的内容与手机页面上弹窗的内容完全一样,说明上述脚本确实可以捕获到 Toast 的内容。

一些补充:
上述脚本每条都可以单独拉到终端执行,需要注意将命令里的参数替换成有效的值;

上述脚本也可以放到一个名为 curlAppium.sh(名字可以任意) 的文件里,保存完成后请在终端里执行以下命令赋予脚本文件可执行权限:

chmod +x curlAppium.sh

然后,在终端里 cd 进入脚本所在文件夹,然后就可以执行脚本了:

./curlAppium.sh

如果脚本不在当前路径下,请直接将脚本拖到终端里,终端会自动将脚本的完整路径填出来,然后直接回车即可执行。

脚本执行得到预期结果的前提

  1. 必须有 Appium 服务在运行;
  2. 必须启动一个 "automationName"为"UiAutomator2"的 session。

附上我的 session 的配置:


↙↙↙阅读原文可查看相关链接,并与作者交流