一.简单介绍(自言自语)
原理:python通过appium服务器操作sdk,模拟人工点击app的操作。
优点:机器点击速度远远高于人类,抢菜有很大优势
待改进点:
ui自动化模拟的是人的操作,需要等待页面元素加载完后才可以操作,所以速度还不够快。
如果使用接口自动化,直接调用接口传参数给服务器,可以节省等待页面加载的时间,大大提高速度,缺点是难度大一些,需要抓包检查。
二.买菜app业务分析:
思维导图罗列出了可能需要操作的页面元素,以及对应的标签,方便页面定位时取用。
三.代码
写的很简单粗暴,有很多需要改进的地方,但是目前能用,就先凑合用。后面可以用wxpython增加简单的图形界面,增加可交互性。最好是采用接口的方式。
# 使用说明:要么保持账号登录,直接运行脚本;要么使用手机号注册叮咚买菜,登录模块会自动调用一键登录
# 所有的菜加入购物车后运行脚本即可,但是不能勾选‘全选’,不然会造成二次重复点击,造成选中失败报错闪退
import time
from appium.webdriver.webdriver import WebDriver
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
class test1():
def __init__(self):
# 使用初始化方法设置参数
self.caps = {}
self.caps["automationName"] = "UiAutomator2"
self.caps['platformName'] = 'Android'
self.caps['platformVersion'] = '11'
self.caps['deviceName'] = 'aitgxct4899xfqci'
self.caps['appPackage'] = 'com.yaya.zone'
self.caps['appActivity'] = '.activity.HomeActivity t322'
self.caps['noReset'] = 'True'
self.driver = WebDriver('http://127.0.0.1:4723/wd/hub', self.caps)
self. driver.implicitly_wait(10)
# 登录模块
def login(self):
# 点击我的
self.driver.find_element_by_id('com.yaya.zone:id/ani_mine').click()
# 点击立即登录
self.driver.find_element_by_id('com.yaya.zone:id/nickName').click()
# 点击同意
self.driver.find_element_by_id('com.yaya.zone:id/cb_onelogin_privacy').click()
# 勾选确认
self.driver.find_element_by_id('com.yaya.zone:id/cb_onelogin_privacy').click()
# 点击本机号码一键登录
self.driver.find_element_by_id('com.yaya.zone:id/btn_one_login').click()
def cart(self):
# 购物车模块
# 点击购物车
self.driver.find_element_by_id('com.yaya.zone:id/ani_car').click()
# 点击全选
self.driver.find_element_by_id('com.yaya.zone:id/cb_all').click()
# 拒绝商家赠送的小葱。有时候送,有时候不送,导致页面不稳定,注释掉了。
# driver.find_element_by_id('com.yaya.zone:id/tv_button1').click()
# 点击去结算
self.driver.find_element_by_id('com.yaya.zone:id/btn_submit').click()
# 支付模块
def pay(self):
# 点击选择时间。注释掉是因为app默认选择最快送达。如果要指定时间,可以解除注释
# self.driver.find_element_by_xpath('//android.widget.TextView[@text="请选择送达时间"]').click()
# # # 选择第2个送达时间(最早的时间排在第一)
# self.driver.find_element_by_xpath('[@resource-id=‘com.yaya.zone:id/rv_selected_hour’]/android.view.ViewGroup[2]').click()
# 提交订单
print('尝试提交订单,输入校验密码')
self.driver.find_element_by_id('com.yaya.zone:id/tv_submit').click()
self.driver.find_element_by_id('com.yaya.zone:id/passEditText').send_keys('替换自己的密码')
i=1
while True:
try:
self.driver.find_element_by_id('com.yaya.zone:id/tv_submit').click()
except Exception as e:
print('提交失败,即将重新提交')
finally:
print("第%s次重新提交订单" % i)
i+=1
def start_time(self,n):
pass
if __name__ == '__main__':
obj=test1()
obj.cart()
obj.pay()
四.遇到的问题
1.环境的搭建。app自动化麻烦一点的是环境的搭建,感觉相对接口和web麻烦。本次使用java1.9的版本不兼容sdk,更换java1.8后解决。安卓11现在支持无线调试,很好用,不用买扩展坞了。
2.andorid 8.0以后的版本更新,导致2个问题:
a:adb寻找当前app活动程序命令变了:
解决:安卓8.0前:
adb shell dumpsys activity activities | findstr mFocusedActivity
安卓8.0后,
adb shell dumpsys activity activities | findstr mResumedActivity
b.uiaotomator工具无法定位,报错:
解决:手工截取uix和png文件保存到手机,转移到电脑,用uiaotomator打开
1.截图uix存手机
adb shell uiautomator dump /sdcard/password.uix
2.uix从手机传到电脑
adb pull /sdcard/password.uix D:\UiTest
3.截图png传手机
adb shell screencap -p /sdcard/password.png
4.png从手机传到电脑
adb pull /sdcard/password.png D:\UiTest
5.打开方法如下:
3.如果提示没有权限。用chmod 777 文件名 更改文件权限即可