移动端测试——App基础操作(2)

时间:2022-03-22 18:51:36

Appium

1.1 App基础操作 API

完成app自动化需要一些基础条件的支持:APP初始化API

1.1.2 基础操作命令

1. 前置代码

# 导入driver对象
 from appium import webdriver

import time

# server 启动参数
desired_caps = {}
# 设备信息(系统、版本、设备号)
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '9'
desired_caps['deviceName'] = '192.168.72.103:5555'
# app信息(包名、启动名)
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'

# 声明driver对象
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

time.sleep(5)
# 关闭驱动对象
driver.quit()

2. 操作与命令

操作 命令
安装APK到手机
(调用driver)
driver.install_app(app_path)

参数:

app_path(脚本机器中APK文件路径)x:/xxx.apk

注意:

必须是绝对路径且是/

eg:

driver.install_app(‘D:/PycharmProjects/test/apk/Greenify.apk‘)
安装APK到手机
(调用adb)
import os

os.system("adb install 路径")

参数:

app_path(脚本机器中APK文件路径)

格式:x:/xxx.apkx/xxx.apk

eg:

os.system("adb install apk/Greenify.apk")
手机中移除APP driver.remove_app(app_id)

参数:

app_id(需要卸载的app包名)

提醒:

包名/启动名获取:

adb shell dumpsys window windows | grep mFocusedApp | cut -d " " -f 7
判断APP是否已安装 driver.is_app_installed(bundle_id)

参数:

bundle_id

可以传入app包名,返回结果为True(已安装) / False(未安装)

移动端测试——App基础操作(2)
发送文件到手机 import base64

base64编码-encode

data = str(base64.b64encode(data.encode(‘utf-8‘)),‘utf-8‘)

driver.push_file(path,data)

参数:

path:手机设备上的路径(例如:/sdcard/a.txt)

data:文件内数据,要求base64编码

Python3.x中字符都为unicode编码,而b64encode函数的参数为byte类型,需要先转码

生成的数据为byte类型,需要将byte转换回去

移动端测试——App基础操作(2)
从手机中拉取文件 import base64

返回数据为base64编码

data = driver.pull_file(path)

base64解码-decode

print(str(base64.b64decode(data),‘utf-8‘))

参数:

path: 手机设备上的路径

移动端测试——App基础操作(2)
获取当前屏幕内元素结构 driver.page_source

作用:

返回当前页面的文档结构,判断特定的元素是否存在

不包括需要滚动才看到的页面

参阅:

3. 应用

  • 判断APP是否安装,存在则卸载,不存在则安装
# 判断APP是否安装,存在则卸载,不存在则安装

if driver.is_app_installed("com.oasisfeng.greenify"):
     driver.remove_app("com.oasisfeng.greenify")
else:
     driver.install_app("D:/PycharmProjects/test/apk/Greenify.apk")
  • 判断当前设置页面是否有"网络和互联网"和 "电池"
# 获取当前页面内的元素结构
current_page_data  = driver.page_source

for i in ("网络和互联网", "电池"):
    if i in current_page_data:
        print("True")
    else:
        print("False")

4. 整理与总结

  • 初始化
    vim initDriver.py
from appium import webdriver
import os


def init_driver():
    desired_caps = {
        # 系统
        'platformName': 'Android',
        # 版本
        'platformVersion': '9',
        # 设备号
        'deviceName': 'os.system("adb devices")|sed -n "2p"|cut -d " " -f 1',
        # 包名
        'appPackage': 'com.android.settings',
        # 启动名
        'appActivity': '.Settings',
        # 安装的APP
        # 'app': 'apk/xx.apk',
    }
    # 声明手机驱动对象
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
    return driver
  • 主程序
    vim main.py
from init_driver.initDriver import init_driver
import os
import time
import base64


def push_myfile(tag, pc_path, phone_path, driver=None):
    # 电脑发送文件给手机
    # tag=1调用adb,tag=2调用appium
    if tag == 1:
        os.system("adb push %s %s" % (pc_path, phone_path))
    if tag == 2:
        with open(pc_path, 'r') as f:
            data = str(base64.b64encode(f.read().encode('utf-8')), 'utf-8')
            driver.push_file(phone_path, data)


# def install_myapp(tag, path):

if __name__ == '__main__':
    driver = init_driver()

    # adb方式校验
    push_myfile(tag=1, pc_path="hello.txt", phone_path="/sdcard/test.txt")

    # Appium方式校验
    push_myfile(tag=2, pc_path="hello.txt", phone_path="/sdcard/test.txt", driver=driver)
    driver.quit()

1.2 手机控件查看工具uiautomatorviewer

用来扫描和分析Android应用程序的UI控件的工具

1.2.1 uiautomatorviewer使用

1. 使用工具
  • 确保模拟机打开且没有连接上ADB
    adb kill-server
  • 运行批处理文件

移动端测试——App基础操作(2)

移动端测试——App基础操作(2)

  • 效果

移动端测试——App基础操作(2)

2. Q&A

(1) 使用SDK自带的uiautomatorviewer.bat调用uiautomatorviewer.jar打开Ui Aotumator Viewer程序容易产生以下问题:

移动端测试——App基础操作(2)

产生原因:
真机或模拟机的安卓系统版本与uiaotumatorviewer.jar的兼容性问题

解决方法(已成功):

参阅:

名称 Windows的说明
相关工具 https://www.lanzous.com/b944571/5kx9
uiautomatorviewer.jar 下载后,进入 xxx/android-sdk/tools/lib目录

先备份原来的jar包,再复制下载的jar包到该目录中

移动端测试——App基础操作(2)
LvmamaXmlKit.jar 将该文件发送到手机的/data/local/tmp/

adb push LvmamaXmlKit.jar /data/local/tmp/

验证:

adb shell

ls /data/local/tmp

移动端测试——App基础操作(2)
ADBKeyBoard.apk 将该文件发送到手机的/sdcard

adb push ADBKeyBoard.apk /sdcard

移动端测试——App基础操作(2)

重启手机,运行uiaotumatorviewer.bat即可

参阅:

  • 更换默认输入法

移动端测试——App基础操作(2)

参阅:

更新中......