使用python+appium控制雷电模拟器
简介
Appium 是一款开源的移动应用自动化测试工具,它支持 iOS、Android 和 Windows 平台上的原生应用、混合应用和移动网页应用。Appium封装了 Selenium,能够通过一些命令达到控制的效果,比如:点击触控、拖拽等一系列操作
环境
- node.js (v16.20.2)
- java (17.0.10)
- Android SDK(25.2.5)
- Appium(1.7.1)
- Python
- Anaconda
- pycharm
- 雷电模拟器
node.js
推荐使用nvm控制node版本,这里使用的node版本为16.20.2
java jdk
下载地址:www.oracle.com/java/(官网) 这里安装17.0.7版本即可。
Appium
添加appium配置,设置ANDROID_HOME和JAVA_HOME(如下图)


Android SDK
Python(pycharm + Anaconda)
这里使用Pycharm编译器,Anconda创建环境。
- 打开Anconda Prompt输入
conda create -n leidian python=3.7
创建一个名称为leidian python版本为3.7的环境 2.conda activate leidian
激活进入到leidian的环境中
3.conda install Appium-Python-Client
安装这个依赖(如果提示conda资源库中没有Appium-Python-Client,就需要conda config --add channels conda-forge
添加conda-forge渠道
)
- Pycharm 调用创建的Anconda环境
具体操作
- 打开雷电模拟器中需要控制的软件,控制模拟器中的软件需要使用ADB工具获取一些必要的参数。在命令行中输入
adb devices
获取模拟器信息deviceName。
adb shell dumpsys activity activities >D:\activity.txt
获取模拟器上开启的软件信息,然后根据activity.txt中TaskRecord中的intent字段获取appPackage和appActivity(前半部分为appPackage,后半部分为appActivity)
- 再结合模拟器设置中的参数可以得到以下参数,然后打开appium填充前面得到的参数与模拟器建立连接。
{
'platformName': 'Android', # 操作系统
'deviceName': 'emulator-5554',
'platformVersion': '9', # 设备版本号
'appPackage': 'com.netease.onmyoji.bili', # app 包名
'appActivity': 'com.netease.ntunisdk.external.protocol.ProtocolLauncher',# app 启动时主 Activity
'noReset': True, # 是否保留 session 信息,可以避免重新登录
'skipServerInstallation': True # 避免重复安装
}
在这个控制页面可以进行操作录制、脚本导出、元素定位等一系列操作
使用python控制模拟器
from appium import webdriver
desired_caps = {
'platformName': 'Android', # 操作系统
'deviceName': 'emulator-5554',
'platformVersion': '9', # 设备版本号
'appPackage': 'com.netease.onmyoji.bili', # app 包名
'appActivity': 'com.netease.ntunisdk.external.protocol.ProtocolLauncher', # app 启动时主 Activity
'noReset': True, # 是否保留 session 信息,可以避免重新登录
'skipServerInstallation': True, # 避免重复安装
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
conda install opencv-python
引入opencv,创建识别库和缓存库。初始化数据,根据阙值判断匹配获取定位点执行点击操作。
def __init__(self):
self.action = TouchAction(driver)
self.SignInBoolean = False
# 根据阈值判断是否匹配成功
self.threshold = 0.8
# 获取当前脚本文件的绝对路径
self.script_dir = os.path.dirname(os.path.abspath(__file__))
# 定义相对路径和文件名
self.screenshot_path = 'screenshot/example.png'
# 目标文件路径
self.TargetPhotoGallery_path = 'TargetPhotoGallery/'
# 完整路径
self.full_path = os.path.join(self.script_dir, self.screenshot_path)
#图像识别
def imageRecognition(self, template):
n = 0
circulation = True
while circulation:
self.driver.get_screenshot_as_file(self.full_path)
# 加载源图像和模板图像
img = cv2.imread(self.screenshot_path)
# 执行图像识别
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= self.threshold)
matches = list(zip(loc[1], loc[0]))
n += 1
if len(loc[0]) > 0 and len(loc[1]) > 0:
# 在元组中随机选择一个坐标
randomcontact = random.choice(matches)
self.action.tap(x=str(randomcontact[0]), y=str(randomcontact[1])).perform()
circulation = False
else:
time.sleep(0.5)
if (n == 4):
circulation = False
转载自:https://juejin.cn/post/7351577965556154419