安卓 UI自动化测试

这是基于appium库 + python + windows 代码来实现的 UI自动化测试。(python代码 及 python IDE(pycharm) 默认是安装的,也会基本使用。)

一、搭建测试环境

  1. 安装adb 详细教程
  2. 安装node.js 点击下载  .msi 文件可以直接安装  
  3. 安装Android SDK 详细教程
  4. 安装appium库,它开源的、跨平台的测试框架  appium-python库   建议不要下载过高的版本 兼容性较差,可以使用2.11.1的版本,通用性较好
    1. 下载后解压;
    2. cmd  进入appium-python-client 的解压路径下,输入:python setup.py install  回车, 等待安装成功
    3. 可以在cmd 中用pip list 查看是否安装成功(pip命令是 安装python时选装工具)。 <也可以用pip安装 pip install appium-python-client>
  5. 安装selenium库 用pip 安装即可 (我使用的版本4.15.2)
  6. appium-desktop(appium服务) appium-desktop下载  在菜单View里可以这是中文语言
  7. 安装 python (3.7+) 及 pycharm
  8. 安装 模拟器 (真机忽略)

二、UI自动化

  1. 运行appium 点击start server,启动appium服务器

  

  2. 安装需要测试的软件

  3. 连接手机(或模拟器 adb 连接)

  安卓真机,需要在设置里面进入关于手机,里面连击版本号,会提示手机已进入开发者模式,在回到设 置中查找开发者选项,开启USB调试,再次通过数据线连接手机即可。(如果提示手机连接模式,应该 选择文件传输,不能选择仅充电)

  

    platformName :Android   【这里是Android环境】
    platformVersion:4.4.2       【在cmd窗口输入命令:adb shell getprop ro.build.version.release查看版本或者在夜神摸拟器系统信息菜单查看版本号】
    deviceName:驱动名称       【在cmd窗口输入命令:adb devices查看名称】
    appPackage:包名         【在cmd窗口输入命令:aapt dump badging D:\test\taobao.apk | findstr package(网上下载的taobao.apk文件)】
    appActivity:启动栈       【在cmd窗口输入命令:aapt dump badging D:\test\taobao.apk | findstr launchable(网上下载的taobao.apk文件)】

    也可以使用包名查看器.apk 查看

  4. 元素定位 1 :

  

     

  5. 元素定位 2 :uiautomator

  Android SDK自带的一个工具,在sdk的tools目录下(一定关闭appium-desktop的自带的定位工具后打 开,否则连接不上模拟器/真机 )找到sdk下的tools里面的uiautomatorviewer.bat

  

  可以把adb 语句 写在bat文件中一键执行:新建txt文本,复制下面命令,保存退出,修改txt文件后缀为 .bat ,回车确定 ,双击执行。

chcp 65001
rem 获取UI 
adb shell uiautomator dump /sdcard/sc.uix
rem 下载UI
adb pull /sdcard/sc.uix C:\Users\Administrator\Desktop
rem 获取图片
adb shell screencap -p /sdcard/sc.png
rem 下载图片
adb pull /sdcard/sc.png C:\Users\Administrator\Desktop
pause

  6. 代码执行   appium版本=2.11.1, python版本=3.10

# coding = utf-8
from appium import webdriver

dis = {
        "platformName":    "Android",
        "platformVersion": "8.1.0",
        "deviceName":      "d40cac3b",
        #  appPackage,appActivity  不要 就可以 连接当前的手机界面
        "appPackage":      "com.shiliu.freeplay.playlet",
        "appActivity":     "com.freeplay.playlet.module.splash.SplashActivity",
        'udid':'127.0.0.1:7555',        # 填写通过命令行 adb devices 查看到的udid
        'noRest':          True,        # 是否重置APP
        'unicodeKeyboard': True         # 是否支持中文输入
        'newCommandTimeout':30          # 30秒没发送新命令就断开连接
}

# 启动
driver = webdriver.Remote('http://localhost:4723/wd/hub', dis)

  7. 一些方法

appium的一些方法 主要的是一些元素定位和操作的方法
# coding = utf-8
from appium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Remote('http://localhost:4723/wd/hub', {})

#   通过id定位 取resource-id的属性值,替换到xxx
driver.find_element(By.ID," xxxx ")
#   通过class_name定位, 取class的属性值,替换到xxx
driver.find_element(By.CLASS_NAME," xxxx ")
#   通过xpath定位 取xpath的属性值,替换到xxx
driver.find_element(By.XPATH," xxxx ")
#   通过link_text定位 取text属性值,替换到xxx
driver.find_element(By.LINK_TEXT," xxxx ")
#   通过css_selector定位(webview)
driver.find_element(By.CSS_SELECTOR,"XXXX")
#   通过name定位(webview) web view容器中的html页面可以用name定位,native并没有name属性
driver.find_element(By.NAME," xxxx ")
""" 
多个元素定位
    方法:find_elements
    用法:与find_element方式一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果 例如:通过ID定位到多个元素,我想点击第一个元素
"""
driver.find_elements(By.ID,"xxxxx")[0].click()
# 或采用以下写法
list1 = driver.find_elements(By.ID,"xxxxx")
list1[0].click()
"""
元素操作
找到元素后可以对元素进行的操作
"""
#   点击操作,也可以用tab实现点击操作
driver.find_element(By.ID," xxxx ").click()
#   清空输入框内容
driver.find_element(By.ID," xxxx ").clear()
#   输入框内输入内容
driver.find_element(By.ID," xxxx ").send_keys("test content")
#   获得元素的text内容
result = driver.find_element(By.XPATH," xxxx").text
print(result)
#   通过传入xx属性,获取xx属性值
driver.find_element(By.ID,' xxxx ').get_attribute('text')

wu = driver.find_element(By.ID,' xxxx ')
dic = wu.size
# ---> return dict {"height":125, "width": 256}      组件的大小
dic = wu.location
# ---> return dict {"x":456, "y":1024}               组件的坐标

# 导入 TouchAction 就可以进行点击、划动等操作了
from appium.webdriver.common.touch_action import TouchAction
"""
press(x, y): 长按,传入坐标
release(): 在当前位置释放(松开)。
move_to(x, y): 移动到指定的屏幕坐标(x, y),传入坐标
tap(element=None, x=None, y=None, count=1): 点击指定的元素或屏幕坐标。可以通过元素locator或坐标参数来指定位置。可以设置点击的次数。
long_press(element=None, x=None, y=None, duration=None): 长按指定的元素或屏幕坐标。可以通过元素locator或坐标参数来指定位置。可以设置长按的持续时间。
wait(ms): 等待指定的时间(以毫秒为单位)。
perform(): 执行之前定义的所有TouchAction操作。
这些方法可以根据需要进行组合和调用,从而实现各种触摸操作的模拟。请注意,这些方法都是链式的,可以连续调用多个方法来构建多步操作
"""
# 根据size,location 计算 坐标,进行点击
TouchAction(driver).tap(x=int(wu.size['width']*0.5), y=int(wu.location['y'] + wu.size['height']*0.25)).perform()
# 划动操作
TouchAction(driver).press(x=758, y=341).move_to(x=229, y=335).release().perform()
# 多点触控
action0 = TouchAction().tap(x=758, y=341)
action1 = TouchAction().tap(x=229, y=335)
MultiTouch().add(action0).add(action1).perform()

  8. Toast 控件定位:它系统级别的控件,APP 发送内容和指定时间给系统,由系统弹框,这类的控件不在 APP 内,需要特殊的控件识别方法。

  用xpath定位   待更新

  

其它:部分摘录其它作者appium 安卓 和 IOS 环境搭建

报错 1:
ValueError: Timeout value connect was <object object at 0x0000019A00694540>, but it must be an int, float or None.

其实是selenium版本和urllib3版本不兼容问题。更换urllib3版本:
pip uninstall urllib3
pip install urllib3==1.26.2
也可以更换selenium版本,参考以下文章:
https://blog.csdn.net/qq_48302722/article/details/130861992

报错2:

......adb -P 5037 -s 27f7a675 shell pm clear com.android.calculator2 .... 

在开发者选项中开启“禁止权限监控”,“OEM解锁”、“USB调试”

posted @ 2023-12-04 21:06  奎哥_saint  阅读(102)  评论(0编辑  收藏  举报