likes
comments
collection
share

使用python+appium控制雷电模拟器

作者站长头像
站长
· 阅读数 5

简介

Appium 是一款开源的移动应用自动化测试工具,它支持 iOS、Android 和 Windows 平台上的原生应用、混合应用和移动网页应用。Appium封装了 Selenium,能够通过一些命令达到控制的效果,比如:点击触控、拖拽等一系列操作

环境

  1. node.js (v16.20.2)
  2. java (17.0.10)
  3. Android SDK(25.2.5)
  4. Appium(1.7.1)
  5. Python
  6. Anaconda
  7. pycharm
  8. 雷电模拟器

node.js

推荐使用nvm控制node版本,这里使用的node版本为16.20.2

java jdk

下载地址:www.oracle.com/java/(官网) 这里安装17.0.7版本即可。

Appium

下载地址:github.com/appium/appi…

添加appium配置,设置ANDROID_HOME和JAVA_HOME(如下图)

使用python+appium控制雷电模拟器 使用python+appium控制雷电模拟器

Android SDK

Python(pycharm + Anaconda)

这里使用Pycharm编译器,Anconda创建环境。

  1. 打开Anconda Prompt输入conda create -n leidian python=3.7创建一个名称为leidian python版本为3.7的环境 2.conda activate leidian激活进入到leidian的环境中

使用python+appium控制雷电模拟器

3.conda install Appium-Python-Client安装这个依赖(如果提示conda资源库中没有Appium-Python-Client,就需要conda config --add channels conda-forge添加conda-forge渠道 )

使用python+appium控制雷电模拟器

  1. Pycharm 调用创建的Anconda环境

使用python+appium控制雷电模拟器

具体操作

  1. 打开雷电模拟器中需要控制的软件,控制模拟器中的软件需要使用ADB工具获取一些必要的参数。在命令行中输入adb devices获取模拟器信息deviceName。

使用python+appium控制雷电模拟器

  1. adb shell dumpsys activity activities >D:\activity.txt获取模拟器上开启的软件信息,然后根据activity.txt中TaskRecord中的intent字段获取appPackage和appActivity(前半部分为appPackage,后半部分为appActivity)

使用python+appium控制雷电模拟器

  1. 再结合模拟器设置中的参数可以得到以下参数,然后打开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+appium控制雷电模拟器

使用python+appium控制雷电模拟器

使用python+appium控制雷电模拟器

在这个控制页面可以进行操作录制、脚本导出、元素定位等一系列操作

使用python+appium控制雷电模拟器

使用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)
  1. conda install opencv-python引入opencv,创建识别库和缓存库。初始化数据,根据阙值判断匹配获取定位点执行点击操作。

使用python+appium控制雷电模拟器

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