airtest adb 远程连接_python、airtest自动化获取某鱼商品的淘口令

做某鱼的,离不开社交化分享,与他人进行互赞互想要,而淘口令有一定的有效期,出现拷贝口令,来到闲鱼到不了商品详情页,保险的方式每次分享,都从商品详情中拷贝口令,再分享到社交群众。要是每次都是人工操作从某鱼复制口令,再分享各社交群,那就费时费精力了。这里分享下python、airtest自动化获取某鱼商品的淘口令的思路。

以前一直在使用Appium进行ui自动化测试,对native app使用起来还是挺好用的,通过控件id来定位元素,而某鱼有些页面使用weex、flutter进行开发,没有给控件分配id。例如下图:

v2-5b153c615a2fa6b0b5799d7b0248d8ce_b.jpg

这样Appium就不好使,当然也可以根据控件树一层层去定位,代码写起来很繁琐,而Airtest可以完成这部分工作,只需要点击控件中位置,就会填充了控件定位的代码。

Airtest是一个跨平台的UI自动化测试框架,适用于游戏和App。Airtest提供了跨平台的API,包括安装应用、模拟输入、断言等。 基于图像识别技术定位UI元素,你无需嵌入任何代码即可进行自动化测试。提供了AirtestIDE 一个强大的GUI工具,可以帮助你录制和调试测试脚本。官网演示视频如下:

知乎视频​www.zhihu.com

Airtest环境搭建:

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

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实现群发到社交群中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值