51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 824|回复: 0
打印 上一主题 下一主题

手机端自动化测试(Android)

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:04
  • 签到天数: 945 天

    连续签到: 4 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-12-22 13:06:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    摘要:
    随着移动端APP的普及,越来越多用户习惯在手机移动端操作。与Web自动化测试的重要一样,当系统某个功能需要反反复复验证时,移动端APP的自动化测试也需要被关注。
    Appium是用Node.js写的服务器,一个开源工具,可用于iOS手机、Android手机和Windows桌面平台上的原生、移动或混合应用的自动化测试。APP测试环境部署及运行测试时出现各种奇奇怪怪问题,笔者也增加常见问题及对应的解决方案。感谢编辑的信任,能再有机会在感恩节和大家一起来聊聊Appium。
    一Appium入门与基础知识
    Appium是用Node.js写的服务器,一个开源工具,可用于iOS手机、Android手机和Windows桌面平台上的原生、移动或混合应用的自动化测试。在搭建Appium环境之前,大家先来思考这么几个问题:
    Ø  既然Appium是node.js开发的,它的依赖包会不会就是node.js安装包?
    Ø  针对安卓APP进行自动化测试,需不需要Android的sdk?
    Ø  Android APP是基于Java开发的,需不需要配置Java的sdk?
    Ø  既然要写自动化测试用例,需不需要选择安装开发语言,比如Python?
    Ø  Python和Appium到底怎么进行交互,需不需要一个第三方扩展包appium-python-client?
    Ø  工欲善其事必先利其器,需不需要选择一个IDE工具?例如Pycharm或者VSCode。
    Ø  对这些问题有大致思考后,将更容易理解Appium环境安装整体流程。
    1. Appium环境安装
    (一)安装node.js
    安装node.js,可以在官网https://nodejs.org/zh-cn/download/下载长期稳定支持版,这里选择的是node-v8.12.0-x64,node.js在持续更新,截止去年年底当前长期支持版为12.13.1。
    安装过程中会收到询问是否安装Chocolatey,选择“是”,自动弹出powershell.exe来安装它。


    安装nodejs后,通过在命令行输入node –v,查看版本号:



    在nodejs的安装目录中可以查看到它包含node、npm。npm是nodejs的包管理器,用于node插件管理,包括安装、卸载、管理依赖等。

    命令行输入npm,可以查看npm版本和安装目录。

    (二)安装JDK,并配置环境变量
    1.安装JavaJDK
    可以参考链接下载jre和jdk:https://www.oracle.com/technetwo ... nloads-4417026.htmlhttps://www.oracle.com/technetwo ... nloads-4416644.html,要求版本在jdk1.8.0_181以上即可。

    安装jdk,如图所示。
    安装jre,注意此步骤在后面安装的android-sdk之前,否则android-sdk将无法安装。

    设置环境变量:
    “我的电脑”右键菜单>属性>高级>环境变量>系统变量>新建:
    1. <font size="3" face="微软雅黑" color="#000000">变量名:JAVA_HOME
    2. 变量值:D:\Program Files\Java\jdk1.8.0_181;
    3. 变量名:CALSS_PATH
    4. 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
    5. </font>
    复制代码
    找到path变量名>“编辑”添加:
    1. <font size="3" face="微软雅黑" color="#000000">变量名:PATH
    2. 变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
    3. </font>
    复制代码
    在Windows命令提示符下验证java是否成功:C:\Users\admin>java
    在Windows命令提示符下验证javac是否成功:C:\Users\admin>javac
    说明Java环境安装成功。
    注意:java和javac都在java安装目录的bin下。
    扩展:

    如果安装不成功,提示“'java' 不是内部或外部命令,也不是可运行的程序或批处理文件。”那么说明环境变量没有设置成功。在执行java或javac前,在命令行运行
    1. <font size="3" face="微软雅黑" color="#000000">set path=D:\program files\java\jdk\bin
    2. set classpath=D:\Program Files\Java\jdk\lib\tools.jar;D:\Program Files\Java\jdk\lib\dt.jar;D:\Java\jdk\bin
    3. </font>
    复制代码
    (三)安装Android SDK
    这是Android开发所需的SDK(下载的是android5.0)。下载的官网地址http://www.androiddevtools.cn,安装的时候最好按默认安装路径安装。

    设置环境变量:
    1. <font size="3" face="微软雅黑" color="#000000">变量名:ANDROID_HOME
    2. 变量值:D:\Program Files (x86)\Android\android-sdk
    3. 变量名:PATH
    4. 变量值:;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
    5. </font>
    复制代码
    (四)安装SDK platform-tools
    这是 adb、fastboot 等工具包。把解压出来的 platform-tools 文件夹放在 android sdk 根目录下,并把 adb所在的目录添加到系统 PATH 路径里,即可在命令行里直接访问了 adb、fastboot 等工具。接着设置环境变量,可以把解压出来的 platform-tools 文件夹放在 android sdk 根目录下,并将 platform-tools 文件夹中的 adb所在的目录添加到系统 PATH 路径里。
    (五)安装(拷贝)apache-ant
    下载地址是https://ant.apache.org/bindownload.cgi,下载后把Ant的文件夹目录放到path变量中。
    (六)安装Apache Maven
    下载地址是http://maven.apache.org/download.cgi。设置M2HOME和M2环境变量,M2HOME设为Maven 安装目录。
    (七)安装Git
    下载地址是https://git-scm.com/downloads。除了Configuring the terminal emulator to use with Git Bash需要选择“Use Windows’default console window”选项外,其他都按默认选项即可。安装路径需要添加进系统变量Path中。除了Configuring the terminal emulator touse with Git Bash需要选择“Use Windows’default console window”选项外,其他都按默认选项即可。
    (八)安装(拷贝)cURL
    下载地址是https://curl.haxx.se/download.html。安装路径添加到系统变量Path中。
    (九)安装appium

    安装时不用选择安装路径,默认安装即可。如果重装系统后需要重新安装。打开Windows命令提示符,通过“appium-doctor”命令检查appium环境。

    如果遇到“'appium-doctor' 不是内部或外部命令,也不是可运行的程序或批处理文件”,要将Appium安装目录中的.bin添加到环境变量Path中,细心的你会发现appium目录中没有.bin目录。那么在运行cmd中运行npminstall appium-doctor -g命令:

    然后在环境变量的path下添加路径C:\Users\用户\AppData\Roaming\npm

    在CMD中重新运行appium-doctor,可以检查到appium安装成功。

    (十)安装android adt
    通过官方地址http://developer.android.com/sdk/index.html下载,如果访问不到这个地址则可以访问http://dl.google.com/android/adt ... ws-x86-20140702.zip,代理服务器设为mirrors.neusoft.edu.cn,安装路径放在系统环境变量Path中。
    (十一)安装android模拟器
    这是Android开发所需的sdk,下载并解压后,将解压出的整个文件夹复制或者移动到your sdk 路径/platforms文件夹,移动之后的路径类似:D:\android-sdk\platforms\android-21。然后打开SDKManager,打开 Tools(工具)菜单选择 Options(选项)菜单项打开Android SDK Manager-Settings对话框,点击 ClearCache(清除缓存)按钮,然后重启Eclipse(或Android Studio)和SDK Manager。

    Ø 扩展
    ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升级或者变更,简单理解为在Eclipse下开发工具的升级下载工具。adt只是一个eclipse的插件,里面可以设置sdk路径
      SDK(Software Development Kit): 一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。在Android中,他为开发者提供了库文件以及其他开发所用到的工具。简单理解为开发工具包集合,是整体开发中所用到的工具包,如果你不用Eclipse作为你的开发工具,你就不需要下载ADT,只下载SDK即可开发。SDK可以自己编译,在linux环境下通过make命令进行,耗时比较长,需要有耐心哦。然后我们可以把自己编译的SDK通过ADT导入eclipse。在此基础上可以对源码包进行修改,比如修改android system/app/phone.apk中的源码。
    (十二)安装SDK Samples
    这是Android SDK自带的示例代码,下载并解压后,将解压出的整个文件夹复制或者移动到 yoursdk 路径/samples文件夹下,然后重启Eclipse(或Android Studio)。
    (十三)安装SDK System images
    这是在创建模拟器时需要的system image,也就是在创建模拟器时 CPU/ABI项需要选择的。下载并解压后,将解压出的整个文件夹复制或者移动到 your android sdk 路径/system-images文件夹下即可,如果没有 system-images目录就先创建此文件夹,然后打开SDKManager,打开 Tools(工具)菜单选择 Options(选项)菜单项打开Android SDK Manager Setting对话框,点击 ClearCache(清除缓存)按钮,然后重启Eclipse(或Android Studio)和SDK Manager。如果不做android开发只需要重启SDK Manager。
    (十四)安装GoogleMap APIs SDK

    (十五)安装python3.7.0

    (十六)安装Appium-Python-Client
    安装Appium-Python-Client,添加python进系统变量
    执行命令pip install Appium-Python-Client。
    为预防后面需要,这里把GoogleMap APIs SDK、Android Framework Source Code全部做了安装。
    1. 安装后启动脚本运行
    双击“AVD Manager.exe”创建android模拟器。

    启动AVD,如果提示需要安装Intel Hardware Accelerated Execution Manager (Intel HAXM),见下面步骤安装android studio会提到如何安装。
    如果提示模拟器过期,则按照下面的方法操作
    1. <font size="3" face="微软雅黑" color="#000000">Start Android Studio
    2. - Select menu "Tools > Android > SDK Manager"
    3. - Click "SDK Tools" tab
    4. - Check "Android SDK Tools" checkbox
    5. - Click "OK"
    6. </font>
    复制代码
    模拟器的注意启动顺序:启动AVD ->启动appium ->运行脚本。

    注意:
    安装中JDK和JRE的时候,版本避开10.0.2,因为该版本装不了Android-SDK。
    1. <font size="3" face="微软雅黑" color="#000000">3. Appium server与 Appium desktop
    2. 请来看Appium代码里面的参数,示例如下:
    3. desired_caps = {  'platformName': 'Android',
    4.                 'platformVersion': '8.0.0',
    5.                 'deviceName': 'LDN-AL20',
    6.                 'app': PATH(r"D:\dev\apptest\com.baidu.searchbox_12.28.5.10_108025088.apk"),
    7.                 # appium server
    8.                 # 'package': 'com.baidu.searchbox',
    9.                 # appium deskstop
    10.                 'appPackage': 'com.baidu.searchbox',
    11.                 'noReset': True,
    12.                 'appActivity': 'com.baidu.searchbox.SplashActivity',
    13.                 'automationName':'uiautomator2',
    14.                 'unicodeKeyboard': True,
    15.                 'resetKeyboard': True,                               
    16.                 'uiautomator2ServerLaunchTimeout':3000
    17.                 }
    18. </font>
    复制代码
    Appium-Server配置后就可以运行上面的代码,但Appium-Server有一两年没有更新了。Windows版在2015年底止步于的 AppiumForWindows_1_4_16_1.zip。
    # 设备名称
    desired_caps['deviceName']= 'T1_823L'
    通过命令行abd命令查看手机信息:
    adb devices –l

    L5FDU15C04003547是手机的udid,T1_823L是手机的型号。
    Appium deskstop需要到官网https://github.com/appium/appium-desktop/releases/tag/v1.17.0下载安装。

    简述一下appium deskstop与appium server的几大不同:
    Ø  desired_capacity中设置apppackage
    1. <font size="3" face="微软雅黑" color="#000000"># appium desktop
    2. 'appPackage':'com.test',
    3. # appium server
    4. # 'package':'com.test',
    5. </font>
    复制代码
    具体说明看官方文档:
    https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/android/activity-startup.md
    Ø  定位方式,appium desktop不再支持name,用by_android_uiautomator(‘text(“”)’)代替
    Ø  对手机设备定义appium server更严格.对appiumdeskstop来讲,填写的设备名称不必与电脑连接的手机一致;但是appium server就必须完全对应。
    二 Appium API1 id定位
    ID是最常用的定位方法,一般元素都有ID属性。
    基本用法:find_element_by_id(id_)
    参数:元素的ID
    返回:被定位到的页面元素
    报错:如果元素未被找到,则会弹出NoSuchElementException的异常
    2 name定位
    基本用法:find_element_by_name(name_)
    参数:元素的name
    返回值:被定位到的页面元素
    报错:如果元素未被找到,则会弹出NoSuchElementException的异常
    3 class名称定位
    基本用法:find_element_by_class_name(name_)
    参数:元素的class name
    返回值:被定位到的页面元素
    报错:如果元素未被找到,则会弹出NoSuchElementException的异常
    4 link_text定位
    通过可视的文字链接定位元素
    基本用法:find_element_by_link_text(link_text)
    参数:链接文字字符串
    返回值:被定位到的页面元素
    报错:如果元素未被找到,则会弹出NoSuchElementException的异常
    5 partial_link_text定位
    通过可视的部分文字链接定位元素
    基本用法:find_element_by_partial_link_text(link_text)
    参数:部分匹配的链接文字字符串
    返回值:被定位到的页面元素
    报错:如果元素未被找到,则会弹出NoSuchElementException的异常
    6 xpath定位
    基本用法:find_element_by_xpath(“//input[@text=’element’]”)
    参数:input取元素的class值,text取元素的text值
    返回值:被定位到的页面元素
    报错:如果元素未被找到,则会弹出NoSuchElementException的异常
    7 CSS定位
    基本用法:find_element(By.CSS_SELECTOR,‘#password’)
    参数:#取元素的ID
    返回值:被定位到的页面元素
    报错:如果元素未被找到,则会弹出NoSuchElementException的异常
    三常用的API实例
    这里以百度App为例,说明如何进行app元素定位。跑遍百度APP,查看元素属性,发现大多数元素是以id和xpath作为主要属性的。
    1. 通过id定位元素
    百度搜索框,id属性值=obfuscated



    代码:
    driver.find_element(By.ID,'obfuscated').send_keys('id定位')
    1. 通过xpath定位元素

    相机,xpath属性值class=android.widget.ImageView, content-desc="点击相机,搜你所见"
    代码:
    driver.find_element(By.XPATH,"//android.widget.ImageView[@content-desc='点击相机,搜你所见']").click()根据id、xpath定位是比较常用的两种定位元素的方法。
    1. Class定位

    1. <font size="3" face="微软雅黑" color="#000000">Class属性值class=android.widget.TextView
    2. 代码:
    3. driver.find_element(By.CLASSNAME,'android.widget.TextView').click()
    4. </font>
    复制代码
    4. Toast定位
    在APP中提示信息为Toast的时候,可以通过获取Toast信息来判断元素是否存在。
    首先安装cnpm,通过执行命令:
    npm install -g cnpm --registry=https://registry.npm.taobao.org
    如果npm安装不成功,需要先安装获得NPM镜像,访问https://npm.taobao.org/
    执行命令:
    npm install -g cnpm--

    接着安装uiautomator2的配置文件,执行命令:
    1. <font size="3" face="微软雅黑" color="#000000">cnpm install appium-uiautomator2-driver </font>
    复制代码

    准备工作完成后,在编写测试脚本时,需要导入包,如下所示:
    1. <font size="3" face="微软雅黑" color="#000000">from selenium.webdriver.support.ui import WebDriverWait
    2. from selenium.webdriver.support import expected_conditions as EC
    3. from selenium.webdriver.common.by import By
    4. #Toast定位
    5. def return_toast(driver, number = 3):
    6.     for i in range(number):
    7.         toast_loc = ("xpath","//*[@text = '清理成功']")
    8.         try:
    9.             et = WebDriverWait(driver,3,0.1).until(EC.presence_of_element_located(toast_loc))
    10.             return et.text
    11.         except:
    12.             print("定位不到toast")
    13.             pass
    14. return_toast(self.driver)
    15. try:
    16.     driver.find_element(return_toast())
    17. except:    img_folder=os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
    18.     when = time.strftime("%Y%m%d%H%M", time.localtime(time.time()))
    19.     screen_save_path = img_folder + when + '.png'
    20.     driver.get_screenshot_as_file(screen_save_path)
    21. driver.implicitly_wait(3)
    22. </font>
    复制代码
    5. DatePicker控件定位
        在APP测试模块当中,经常会遇到DatePicker时间选择控件,如图所示。

    定位该元素的基本思路是,模拟上下滑动屏幕直至找到需要的年份。
    示例代码如下:
    1. <font size="3" face="微软雅黑" color="#000000">wide = driver.get_window_size()['width']
    2. heighth = driver.get_window_size()['height']
    3. number = 5
    4. for i in range(number):
    5.     try:
    6.         driver.find_element(By.XPATH,"//android.widget.TextView[@text='1985']").click()
    7.         break
    8.     except Exception as e:
    9.         driver.swipe(wide/2,heighth*0.8,wide/2,heighth*0.2)

    10. month = "10月"
    11. if month in driver.find_element(By.ID,'android:id/date_picker_header_date').text:
    12.     driver.find_element(By.ID,'android:id/button1').click()
    13. else:
    14.     num = 12
    15.     for i in range(num):
    16.         try:
    17.             driver.find_element(By.XPATH,"//android.view.View[@content-desc='25 十月 1985']").click()
    18.             break
    19.         except Exception as e:
    20.             driver.find_element(By.ID,'android:id/next').click()
    21. driver.find_element(By.ID,'android:id/button1').click()
    22. </font>
    复制代码
    Ø  扩展:
    需要导入time的包,import time
    time.time() #获取当前时间戳
    time.localtime() #当前时间的struct_time形式
    time.ctime() #当前时间的字符串形式
    time.strftime("%Y%m%d %H:%M:%S", time.localtime()) #当前时间的年月日时分秒形式四 Appium高级应用示例1. 参数化
    Python语言是优美简洁的语言,如果可以,尽量简洁易懂。随着测试脚本的编写,你会发现类似的函数在一个文件中出现多次,以登录为典型代表。把这些测试账号参数化,如果后期有改动,也只需要改动公共函数。
    下面以实例来介绍登录参数化。
    #公共文件common.py:
    1. <font size="3" face="微软雅黑" color="#000000">def login(appdriver, username, password):
    2.         appdriver.find_element(By.ID,"account_edit").clear()
    3.         appdriver.find_element(By.ID,"account_edit").send_keys(username)
    4.         appdriver.find_element(By.ID,"password_edit").clear()
    5.         appdriver.find_element(By.ID,"password_edit").send_keys(password)
    6.         appdriver.find_element(By.ID,'login_button').click()

    7. #登录文件test_logincheck.py

    8. from appium import webdriver
    9. from HTMLTestRunner import HTMLTestRunner
    10. from selenium.webdriver.support.ui import WebDriverWait
    11. from selenium.webdriver.support import expected_conditions as EC
    12. from common import login
    13. </font>
    复制代码
    #  参数化
    1. <font size="3" face="微软雅黑" color="#000000">def test_incorrect_login(appdriver):
    2.     username = '1234'
    3.     password = '123456'
    4.     login(appdriver, username, password)
    5. # toast
    6.     def return_toast(appdriver, number = 3):
    7.         for i in range(number):
    8.             toast_loc = ("xpath", "//*[@text = '用户名或者密码无效!']")
    9.             try:
    10.                 et = WebDriverWait(appdriver, 3, 0.1).until(EC.presence_of_element_located(toast_loc))
    11.                 return et.text
    12.             except:
    13.                 print("定位不到toast")

    14. assert "无效" in return_toast(appdriver)
    15. </font>
    复制代码
    运行结果通过展示:
    App自动化测试使用还需要平时多练习多积累,熟能生巧。
    五 部署与测试的问题和常见解决方案
    1. 安装selenium时,配置好了环境变量,报错:
    解决办法:
    pip3 install selenium == 3.14.0
    由于本机装的python是3.7.0版。造成这个问题的原因大多数是由于本机安装了多个版本的python,默认pip是python2的,自然找不到selenium.14.0。
    1. <font size="3" face="微软雅黑" color="#000000">2. Appium报错: Couldn't start Appium REST http interface listener. Requested port is already in use. Please make sure there's no other instance of Appium running already.</font>
    复制代码
    解决办法:
    任务管理器-进程,杀掉node32的进程,再重启appium
    1. 在使用native和h5混合的代码时,遇到报错
    1. <font size="3" face="微软雅黑" color="#000000">selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver found that can automate Chrome '55.0.2883'.
    2. 错误主要源于“No Chromedriver found that can automate Chrome '55.0.2883”,
    3. </font>
    复制代码
    在appium日志里也能看到详情
    解决办法:
    appium可以通过加上chromedriver_version属性配置使用特定的chromedriver版本,比如
    npminstall appium –chromedriver_version="2.16"
    或者在CHROMEDRIVER_VERSION环境变量指定版本,如
    CHROMEDRIVER_VERSION=2.20 npm install appium
    能得到最新的版本。
    app的webview自动化是依赖于chromedriver的,并且每个app的webview版本号都不太一样,这就导致了每次都需要重新去下载对应的chromedriver版本.
    1. 运行脚本时报错Could not find a connected Android device
    解决方法:
    打开开发者模式,打开USB调试。如果是vivo手机,同时要开启USB模拟点击。
    2. 偶尔运行appium时报错Original error: Could not proxy command to remoteserver. Original error: Error: socket hang up
    导致测试app被关闭,而非正常流程退出登录。
    解决办法:
    卸载appium、卸载app ,重启手机,再重新安装app、appium。
    配置appium desired capability后start session报错
    1. <font size="3" face="微软雅黑" color="#000000">An unknown server-side error occurred while processing the command. Original error: Error getting device platform version. Original error: Error executing adbExec. Original error: 'Command ''C:\\Program Files (x86)\\Android\\android-sdk\\platform-tools\\adb.exe' -P 5037 -s L5FDU15C04003547 shell getprop ro.build.version.release' exited with code 1'; Stderr: 'error: device unauthorized.
    2. This adb server's $ADB_VENDOR_KEYS is not set
    3. Try 'adb kill-server' if that seems wrong.
    4. Otherwise check for a confirmation dialog on your device.'; Code: '1
    5. </font>
    复制代码
    用运行cmd的adb devices命令查看,提示设备未被认证。
    解决办法:
    数据线重连手机,弹出是否允许USB调试,选择“是”。
    用Appium运行代码时报错
    1. <font size="3" face="微软雅黑" color="#000000">selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: pkg: /data/local/tmp/appium_cache/7280876e456c1bb793964772b5bcb2ac96ecfcc4.apk</font>
    复制代码
    解决办法:
    1. <font size="3" face="微软雅黑" color="#000000">'automationName':'uiautomator2'改为automationName':'uiautomator1',</font>
    复制代码
    这是由于使用的手机型号陈旧(例如HUAWEI VNS-AL00)和Android版本低导致不支持uiautomator2。


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-10 00:27 , Processed in 0.071978 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表