做某鱼的,离不开社交化分享,与他人进行互赞互想要,而淘口令有一定的有效期,出现拷贝口令,来到闲鱼到不了商品详情页,保险的方式每次分享,都从商品详情中拷贝口令,再分享到社交群众。要是每次都是人工操作从某鱼复制口令,再分享各社交群,那就费时费精力了。这里分享下python、airtest自动化获取某鱼商品的淘口令的思路。
以前一直在使用Appium进行ui自动化测试,对native app使用起来还是挺好用的,通过控件id来定位元素,而某鱼有些页面使用weex、flutter进行开发,没有给控件分配id。例如下图:
![v2-5b153c615a2fa6b0b5799d7b0248d8ce_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=aaec355b-1730-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-5b153c615a2fa6b0b5799d7b0248d8ce_b.jpg)
这样Appium就不好使,当然也可以根据控件树一层层去定位,代码写起来很繁琐,而Airtest可以完成这部分工作,只需要点击控件中位置,就会填充了控件定位的代码。
Airtest是一个跨平台的UI自动化测试框架,适用于游戏和App。Airtest提供了跨平台的API,包括安装应用、模拟输入、断言等。 基于图像识别技术定位UI元素,你无需嵌入任何代码即可进行自动化测试。提供了AirtestIDE 一个强大的GUI工具,可以帮助你录制和调试测试脚本。官网演示视频如下:
知乎视频www.zhihu.comAirtest环境搭建:
1.前提python环境,没有则需要安装python,建议安装3.7以下
2.下载AirtestIDE 根据官网文档或上述视频操作,就可以玩起来了。
若脱离AirtestIDE,通过命令行执行***.air,方便自动化,需要添加相应模块
3.安装Airtest模块:
pip install airtest
若在安装opencv-contrib-python库时,提示找不到我们指定的3.2.0.7版本时,可以考虑更新你的pip到最新之后再进行重试,最要不要使用pyhont3.7版本,建议使用稳定的python3.6.5版本
4.安装poco框架:
pip install pocoui
命令行执行xxx.air
airtest run untitled.air --device Android:///手机设备号 --log log/
或者
python -m airtest run ***.air --device Android:///手机设备号 --log log/
参数说明:
airtest run 后面接的的脚本文件的路径。
--device,是我们的手机设备。
--log,log输出目录
--device说明:传入的是一个设备字符串,以安卓设备为例,字串完整定义如下:
Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>其中,adbhost是
adb server所在主机的ip(本地host为127.0.0.1),adb port默认是5037,serialno
是android手机的序列号。更多adb的方面的内容请参考文档developer.google。
获取anroid设备号,如下图操作获取:
![v2-396e307f101c3656484f6931eb7afd5c_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=aaec355b-1730-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-396e307f101c3656484f6931eb7afd5c_b.jpg)
Airtest Api使用(只解说用到的)
1.connect_device 设备连接
#连接设备,如命令行--devices 传入参数一样
#例如:Android://127.0.0.1:5037/F8UDU16409004135
android_device = connect_device('Android://')
2.启动App,比如测试某鱼App,先要启动App(注意:要先连接设备,否则会启动报错)
#参数:app的包名
start_app('com.taobao.idlefish')
3.实例化元素定位核心组件AndroidUiautomationPoco
#后续的元素定位都是基于这个组件
poco = AndroidUiautomationPoco()
4.元素定位操作相关
#id定位元素 切换到me tab
poco("com.taobao.idlefish:id/tab")[3].click()
#text定位 点击淘口令
poco(text="淘口令").click()
#child()获取该节点下的特定类型的子节点列表
#children获取节点下的所有子节点列表
#获取某鱼我的发布商品列表界面-商品卡片中的功能菜单节点(更多icon在该集合中)
itemMenusNodes = lv.child("android.widget.FrameLayout")[i].
child("android.widget.FrameLayout").children()[0].children()[1].children()
if len(itemMenusNodes) < 4:
continue
itemMenusNodes[3].click() #点击商品更多,弹出商品操作相关的Dialog
5.屏幕滚动swipe
#向上滚动700像素,我的发布商品列表界面-在屏幕内显示更多的商品卡片
swipe((5,800),(5,100))
6.获取文本get_text
#点击淘口令,
poco(text="淘口令").click()
#从弹窗中获取口令
content = poco("com.taobao.idlefish:id/tvWarnDetail")
shareMsgs.append(content.get_text())
获取口令实现步骤
1.准备工作
#adb 获取设备的输入法
def getCurIme(deviceId = None):
if deviceId == None:
cmd = "adb shell settings get secure default_input_method"
else:
cmd = "adb -s %s shell settings get secure default_input_method" % (deviceId)
result = os.popen(cmd).read()
result = result.strip("n")
findIme = re.search('ime', result, re.IGNORECASE)
if not findIme:
print('getCurIme failed, %s!'%(result))
return None
print('curIme: %s'%(result))
return result
#adb 设置设备的输入法
def switchIme(ime,deviceId = None):
if deviceId == None:
cmd = "adb shell ime set %s" % (ime)
else:
cmd = "adb -s %s shell ime set %s" % (deviceId,ime)
result = os.popen(cmd).read()
print('ime: %s' %(ime))
if not len(result):
print('getCurIme succeffully!')
print(result)
#airtest模块启动后,会把设备的输入法设置为Yosemite输入法
curItem = getCurIme()
shareMsgs = []
android_device = connect_device('Android://')
stop_app('com.taobao.idlefish')
start_app('com.taobao.idlefish')
sleep(8)
poco = AndroidUiautomationPoco()
2.切换到我的tab界面
#切换到me tab
poco("com.taobao.idlefish:id/tab")[3].click()
3.点击我的发布
#点击我的发布
poco("android:id/content").offspring("com.taobao.idlefish:id/id_pager").child("android.widget.FrameLayout").child("android.widget.FrameLayout").child("android.view.View").child("android.view.View").child("android.view.View").offspring("android.widget.ScrollView").child("android.view.View")[1].child("android.view.View")[0].click()
4.获取我的发布商品列表界面的列表控件
sleep(5)
swipe((5,800),(5,100))
lv = poco("com.taobao.idlefish:id/weex_render_view").child("android.widget.FrameLayout").child("android.widget.FrameLayout")[2].offspring("android.support.v7.widget.RecyclerView")
size = len(lv.children())
5.点击商品卡片中更多icon
#点击商品更多
itemMenusNodes = lv.child("android.widget.FrameLayout")[i].child("android.widget.FrameLayout").children()[0].children()[1].children()
if len(itemMenusNodes) < 4:
continue
itemMenusNodes[3].click()
6.点击更多操作弹窗的分享
nodes = poco("android.widget.FrameLayout")
print('nodes len = %d '%(len(nodes)))
shareNode = None
for node in nodes:
temp = node.children()
if len(temp) == 8:
shareNode = temp[4]
break
if shareNode == None:
continue
shareNode.click()
7.点击分享弹窗的淘口令,再从口令弹窗中获取口令
poco(text="淘口令").click()
content = poco("com.taobao.idlefish:id/tvWarnDetail")
shareMsgs.append(content.get_text())
keyevent('KEYCODE_BACK')
8.口令保存到文件中
#去重
shareMsgs = set(shareMsgs)
with open('shareMessages.txt','w', encoding='utf-8') as f:
for msg in shareMsgs:
f.write(msg + "n")
9.清理资源,关闭app
#关闭app
stop_app('com.taobao.idlefish')
#恢复设备原来的输入法
if curIme != None:
switchIme(curIme)
获取到淘口令后,也可以通过python实现群发到社交群中。