Uiautomator2

Uiautomator2

之前用过appium,太麻繁了,最近发现个更好用的uiautomator2,配合weditor使用完美。

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo pip3 install -U uiautomator2

或者:
sudo pip3 install -U --pre uiautomator2 -i https://pypi.doubanio.com/simple

# 如果需要截屏,需要安装pillow
sudo pip3 install pillow

# 在手机上安装 atx-agent 应用
python3 -m uiautomator2 init

# 安装 weditor, 基于浏览器查看 App 的界面元素
sudo pip3 install -U weditor


Weditor

1
weditor

收银下单脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# coding: utf-8
# https://github.com/openatx/uiautomator2
import uiautomator2 as u2
from time import sleep

# 包名,线上包为:com.qianmi.cash, 测试包为:com.qianmi.cash.debug
packageName = 'com.qianmi.cash.debug'
packageLocation = '/Users/wangwei/work/qianmi/app/cash-pad-all-in-one/app/build/outputs/apk/debug/app-debug.apk'
# 下单数量;
Create_Order_Count = 5

# 方式一:局域网设备ip地址
# device = u2.connect(127.0.0.1)
# device = u2.connect('192.168.5.4')

# 方式二:USB + 设备序列号
# device = u2.connect("emulator-5554")
# device = u2.connect('123456789F') # USB链接设备。或者u2.connect_usb('123456f')
# device = u2.connect_usb()#当前只有一个设备时可以用这个

# 方式三:ADB+
# 首先,设备用USB线连接PC,输入命令:adb tcpip 端口号进行映射
# 拔掉USB线,通过ip地址+端口号进行连接
# device = u2.connect_adb_wifi(手机ip地址:端口号)


def connect():
device = u2.connect("emulator-5554")
device.debug = False
device.implicitly_wait(60)
return device


def setup(device):
device.app_install(packageLocation)
device.app_start(packageName)
sleep(5)
return


def teardown(device):
# 相当于'am force-stop'强制停止应用
device.app_stop(packageName)
# 相当于'pm clear' 清空App数据
device.app_clear(packageName)

# 停止所有
# d.app_stop_all()
# 停止所有应用程序,除了com.examples.demo
# d.app_stop_all(excludes=['com.examples.demo'])

# 跳过弹窗,禁止弹窗
# d.disable_popups()#自动跳过弹出窗口
# d.disable_popups(假)#禁用自动跳过弹出窗
return


def login(device):
# 0. 授权框
# device(resourceId=元素ID).click()
device(resourceId="com.qianmi.cash.debug:id/textview_save").click()
sleep(3)

# 1. 登录
device(resourceId=packageName +
":id/edittext_login_by_password_phone").click()
device.send_keys("18538761267")
loginPwd = device(resourceId=packageName + ":id/edittext_password")
loginPwd.send_keys("111111")
device(resourceId=packageName +
":id/textview_login_by_password_submit").click()
sleep(5) # 5s

# 2. 选店铺;
device(resourceId=packageName + ":id/layout_background").click()
device(resourceId=packageName + ":id/textview_confirm").click()

# 3. 同步数据
sleep(60)
device(resourceId=packageName + ":id/dialog_close_btn").click()

# 登录会员;
def setMember(device):
device(resourceId="com.qianmi.cash.debug:id/select_vip_tv").click()
device.xpath('//*[@resource-id="com.qianmi.cash.debug:id/cash_right_frame"]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]').click()
# device.send_keys("18538761267", clear=True)
device.click(1532, 657)
device.click(1119, 863)
device.click(1261, 671)
device.click(1259, 766)
#device(resourceId="com.qianmi.cash.debug:id/key_board").click()
device.click(1391, 873)
device.click(1261, 671)
device.click(1118, 669)
device.click(1382, 771)
device.click(1118, 863)
device.click(1254, 868)
device.click(1391, 778)
device.click(1119, 669)
device.click(1532, 858)
sleep(5)
device(resourceId="com.qianmi.cash.debug:id/tv_member_info_close").click()

# 4. 选择商品下单


def createOrder(device):
# device.xpath(
# '//*[@resource-id="' + packageName +
# ':id/recycler_category"]/android.widget.LinearLayout[2]').click()
device(resourceId="com.qianmi.cash.debug:id/textview_category", text="所有").click()
sleep(1)
device.xpath('//*[@resource-id="' + packageName +
':id/recycler_category"]/android.widget.LinearLayout[3]').click()
sleep(1)
device.xpath('//*[@resource-id="' + packageName +
':id/recycler_goods"]/android.widget.RelativeLayout[2]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]').click()
device.xpath('//*[@resource-id="' + packageName +
':id/recycler_goods"]/android.widget.RelativeLayout[4]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]').click()
sleep(2)

# 5. 支付
device(resourceId=packageName + ":id/tv_cash_to_cash").click()
device.xpath('//*[@resource-id="' + packageName +
':id/settlement_mode_of_payment_rv"]/android.widget.LinearLayout[2]').click()

device(resourceId=packageName + ":id/cash_key_board").click()
device.click(1497, 652) # 这个键盘是canvas画了来的不好定位;

# 获取订单号;
tid = device(resourceId="com.qianmi.cash.debug:id/tv_order_tid").get_text()

sleep(5)
return tid


# 重复创建订单;
def repeatCreateOrder():
device = connect() # 连接设备;
count = 0
while (count < Create_Order_Count):
setMember(device) # 登录会员
tid = createOrder(device)
count += 1
print(" =============== 创建订单 %s,第%d次 =============== " % (tid, count))

# 安装应用并创建订单完整流程


def main():
device = connect() # 连接设备;
setup(device)
login(device)
count = 0
while (count < Create_Order_Count):
setMember(device) # 登录会员
tid = createOrder(device)
count += 1
print(" =============== 创建订单 %s,第%d次 =============== " % (tid, count))
teardown(device)


if __name__ == "__main__":
main()
#repeatCreateOrder()

参考:

  1. https://www.jianshu.com/p/94d05873065a
  2. http://xieboke.net/article/279/