基于python + Appium的安卓自动化
最近要双11了,刷喵糖比较火,看到github上一个刷喵糖的项目testerzhang/taobaomiao.git,也成功跑起来了,顺便研究下了实现方法
关于Appium
Appium是一款开源的的自动化测试框架,支持通过WebDriver协议操作ios或者安卓上的Web App、Native App 和 Hybrid App。结合python脚本可以完成移动应用的自动化测试和操作。因为具有比较高的灵活性,除了自动化测试外,它也常被用来刷各互联网厂的活动任务。
实现自动化操作安卓app,我们需要:
- 配置andriod sdk
- 配置appium
- 编写python脚本
配置android sdk
首先看pc端配置
选择合适自己系统版本的Android-sdk下载并安装 。下载地址(也可以自己找其他的地址)
完成之后安装目录里sdk/platform-tools目录下应该有个adb文件
再来看安卓端配置,以小米手机为例
1. 设置-》我的设备-》全部参数-》连续点击5下MIUI版本进入开发者模式
2. 返回设置首页--》更多设置-》开发者选项
3. 开启“USB调试”,“USB安装”,“USB调试(安全设置)”
完成以上配置,用数据线连接手机和pc。通过adb devices -l命令查看设备
➜ adb devices -l
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
10fb1510 device usb:337634472X product:chiron model:MIX_2 device:chiron transport_id:1
能成功查看到设备说明配置成功。
配置appium
appium常用安装方式有两种,一是通过nodejs安装,二是通过gui安装。gui比较方便,所以只说下第二种安装方式。
从github选择适合系统版本的安装包: 下载链接
安装完成后配置好java home和 android home
配置完成后点击Start Server 按钮开启监听端口。
编写python脚本
确认前置环境准备完毕我们就可以编写代码了。之前写的一篇利用业务逻辑漏洞的自动化考勤帖子下有小伙伴问钉钉打卡怎么破。
那我们以实现自动化钉钉打卡为例。
打开钉钉app代码demo
import time
from appium import webdriver
from loguru import logger
logger.add("dingding.log")
app_config = {
"platformName": "Android",
"platformVersion": "9",
"deviceName": "MIX 2",
"appPackage": "com.alibaba.android.rimet",
"appActivity": "com.alibaba.android.rimet.biz.LaunchHomeActivity",
"noReset": True # 再次启动不需要重新登录
}
def main():
url = "http://localhost:4723/wd/hub"
driver = webdriver.Remote(url, app_config)
logger.debug("已打开钉钉, 延时5秒")
time.sleep(5)
# print(driver.page_source)
logger.debug("退出")
driver.quit()
if __name__ == '__main__':
main()
app_config中的安卓版本一般设置里面就可以看到,如需打开其他软件需要修改appPackage和Activity,确认配置可以参考
查看Android的appPackage和Activity的多种方法
上述代码已经实现了打开app,后面的工作就是定位页面元素,模拟点击滑动之类的操作。相关开发文档可以参考http://www.javashuo.com/article/p-yxkbxpts-c.html
实现打卡完整过程简单demo:
# 仅做简单参考,实际使用时可以添加server酱和adb 命令行模拟GPS位置信息等功能。感兴趣的小伙伴自己去丰富功能
import time
from appium import webdriver
from loguru import logger
logger.add("dingding.log")
app_config = {
"platformName": "Android",
"platformVersion": "9",
"deviceName": "MIX 2",
"appPackage": "com.alibaba.android.rimet",
"appActivity": "com.alibaba.android.rimet.biz.LaunchHomeActivity",
"noReset": True # 再次启动不需要重新登录
}
def main():
url = "http://localhost:4723/wd/hub"
driver = webdriver.Remote(url, app_config)
logger.debug("已打开钉钉, 延时5秒")
time.sleep(5)
# 点击右上角打卡
driver.find_element_by_xpath('//android.widget.TextView[contains(@text, "打卡")]').click()
logger.debug("点击打卡按钮, 延时5秒")
time.sleep(5)
# 选择打卡主体企业,没有多个企业的账户不需要这一步
# sign = '//android.widget.TextView[contains(@text, "阿里巴巴")]'
# sign_button = driver.find_element_by_xpath(sign)
# sign_button.click()
# logger.debug("选择到“阿里巴巴”, 延时10秒")
# time.sleep(10)
# 通过bounds直接定位手机正中间的打卡按钮
# 每个手机可能略有不同,可根据page_source去定位适配其他手机
# print(driver.page_source)
driver.tap([(423,1041), (657,1123)], 100)
logger.debug("打卡成功, 延时10秒退出")
time.sleep(10)
logger.debug("退出")
driver.quit()
if __name__ == '__main__':
main()
参考链接