一、介绍
在写了这么多手机端自动化测试程序后,基于使用的uiautoamtor2,最近,我突然想用Python尝试自动打开企微在上下班时间打卡操作,今天我就来分享一下我的经验和总结。
二、技术原理
要想通过Python控制手机APP,目前主要技术如下。
2.1、Android体系
在Android中,官方有一个叫adb的东西,俗称Android 调试桥 (adb)
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。
https://developer.android.com/tools/adb?hl=zh-cn
目前很多Python库的实现都是基于底层adb来实现的,常用的有appium,uiautoamtor2库
appium和uiautoamtor2的区别
Appium和UIAutomator2都是用于自动化测试移动应用程序的工具,但它们在一些方面有所不同:
-
底层技术:
- Appium:是一种跨平台的移动应用程序自动化工具,它使用WebDriver协议来与移动设备通信,从而实现对iOS和Android应用程序的自动化测试。它可以使用多种编程语言(如Java、Python、JavaScript等)进行编写测试脚本。
- UIAutomator2:是Google提供的用于Android平台的自动化测试框架。它是Android Testing Support Library的一部分,能够直接与Android系统交互,因此可以提供更多的系统级别的操作和功能。
-
支持平台:
- Appium:支持iOS和Android平台,可以在不同的设备和操作系统版本上运行。
- UIAutomator2:仅支持Android平台,不能用于iOS应用程序的自动化测试。
-
定位策略:
- Appium:可以使用多种定位策略,包括XPath、ID、名称、类名等。
- UIAutomator2:使用基于Android UI层次结构的定位策略,可以直接定位应用程序中的UI元素。
-
性能和稳定性:
- Appium:由于是跨平台的,因此可能在某些情况下性能略低于UIAutomator2。此外,由于Appium需要使用WebDriver协议与移动设备通信,可能会导致一些性能和稳定性问题。
- UIAutomator2:作为Android官方提供的测试框架,通常可以提供更好的性能和稳定性,特别是在与Android系统进行交互时。
这里,我们采用uiautoamtor2来实现。具体原理就是Python代码中使用uiautoamtor2库通过adb连接到Android手机,然后uiautoamtor2实现打卡企业微信,点击应用,点击打卡。最后点击屏幕实现打卡操作。
三、环境准备
在进行自动打卡操作之前,需要确保环境准备完备,包括安装必要的软件和配置相关的环境变量,以确保程序能够正常运行。
3.1、在电脑上安装ADB工具,并配置环境变量
通过在https://developer.android.com/tools/adb?hl=zh-cn
页面中,根据页面中文提示,进行安装ADB,然后记得一定配置ADB的环境变量。
我的环境变量配置
# Android SDK
export ANDROID_HOME=/Users/find/android/android-sdk-macosx
当安装并配置完成后,在控制台输入adb,如果出现如下信息表示adb环境配置完成
➜ ~ adb
Android Debug Bridge version 1.0.41
Version 29.0.6-6198805
Installed as /Users/find/android/android-sdk-macosx/platform-tools/adb
3.2、手机设置
为了使自动打卡程序能够顺利执行,需要在手机上进行一些设置,如开启开发者模式、USB调试等,以便将手机连接到计算机并进行操作。将手机通过USB数据线连接到电脑
3.2.1、开启Android手机的开发者模式
设置-关于手机-系统版本(点击系统版本5次)
3.2.2、开启USB调试模式
设置-系统和更新-开发人员选项
3.2.3、保持唤醒状态
大部分手机都有锁屏密码,导致自动化程序运行时需要解锁屏幕失败。
共3种方案:
- 开发者模式里设置保持唤醒状态,则屏幕一直常亮,不会锁屏,等不调试程序的时候再关闭即可。
- 取消屏幕锁屏密码
- 将锁屏密码直接写入代码里
为了演示方便,我直接选择1,让屏幕不休眠。
3.2.4、选择USB配置
USB连接电脑时,不要选择仅充电,要选择文件传输模式
在控制台输入adb devices
,来获取已经连接到的手机设备id
➜ ~ adb devices
List of devices attached
SNU0220A15007866 device
记住这个SNU0220A15007866
,它相当于你手机的唯一识别码,接下来会用到。
四、代码编写
编写自动打卡程序的关键是编写代码,通过Python编程语言结合uiautomator2库来实现自动化操作,包括登录企业微信、定位打卡按钮、模拟点击等功能的实现。
新建Python,并安装uiautoamtor2库,pip install uiautomator2
(venv) ➜ qw_punch_card pip install uiautomator2
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting uiautomator2
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/5f/b9/7607bd0512d266336929b80006ef2eeef870d978a16427d052215ec5c809/uiautomator2-2.16.25-py3-none-any.whl (3.1 MB)
Collecting six
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting Pillow
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/4f/d3/5b5682b498805c06b900cdd778b649a4132162b17da674a1fef56da56a77/pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl (3.5 MB)
Collecting requests>=2
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl (62 kB)
Collecting lxml>=4.3
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/97/a8/92d88fe22b8caccdb0c1ff099e5ef90052b058b42671e69986e2262faa1f/lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl (4.8 MB)
|██████████████████▌ | 2.8 MB 1.2 MB/s eta 0:00:02
新建punch_card.py文件
获取企微PackageName和ActivityName
package_name = "com.tencent.wework"
activity_name = "com.tencent.wework.launch.LaunchSplashActivity"
连接到设备
d = u2.connect("SNU0220A15007866")
打开应用
# 企业微信应用包信息
package_name = "com.tencent.wework"
activity_name = "com.tencent.wework.launch.LaunchSplashActivity"
# 打开应用
print(d.info)
d.app_stop(package_name)
d.app_start(package_name, activity_name, wait=True)
打开工作台
print("启动企业微信成功")
d(text=u"工作台").click()
上班打卡
这里假设上班打卡时间是8-9点
if 8 < datetime.now().hour < 9:
if d(text=u"你已在打卡范围内").info['text'] == "你已在打卡范围内":
print("现在是上午")
d(text=u"上班打卡").click()
time.sleep(3)
print(f"{TimeUtil.curr_date()} : 上班打卡成功")
下班打卡
这里假设下班打卡时间是18-19点
if 18 < datetime.now().hour < 19:
if d(text=u"你已在打卡范围内").info['text'] == "你已在打卡范围内":
print("现在是下午")
d(text=u"下班打卡").click()
time.sleep(3)
print(f"{TimeUtil.curr_date()} : 下班打卡成功")
打卡完成后,退出企业微信,返回桌面
# 返回桌面
time.sleep(1)
os.popen("adb shell input keyevent 3")
time.sleep(1)
os.popen("adb shell am force-stop com.tencent.wework")
time.sleep(1)
总结
通过以上代码,就实现了自动上下班打卡操作,本文主要介绍了adb和uiautoamtor2的使用。
不过以上程序只是抛砖引玉,还有很多可以优化的地方。例如:
怎么实现定时调度打卡?
怎么实现打卡时间随机范围,例如一直在8:30至9:00之间,避免一个固定的时间点打卡被人发现?
怎么处理节假日不打卡的情况?
打卡成功或失败,怎么通知到自己?
各位看官,如对你有帮助欢迎点赞,收藏。如需继续更新该打卡程序的请关注公众号,联系作者更新哟~
如需要源码请关注公众号【Python魔法师】,后台回复“
企微打卡
”即可获取源码程序和文档。