• Appium - python


    一、appium的介绍

    Appium是一款开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合 的应用。Appium在不同平台中使用了标准的自动化APIs,所以在跨平台时,不需要重新编译或者修改 自己的应用。Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、 Php、Python、Ruby、C#、,或者Perl语言,更可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架.Appium实现了真正的跨平台自动化测试。

    二、appium 架构

            appium 是一个node.js 编写的http server ,它的创建、并管理多个webDriver sessiion 来和不同平台交互,如ios,Android等等,appium 开始一个测试后,就会在被测设备(手机)上启动一个server,监听来自appium server 的指令,每种平台ios 和android 都有不同的运行、和交互方式。4所以appiium会用某个桩程序 入侵该平台,并接受指令,来完成测试用例的运行

    2.appium 的工作原理

    client端发送自动化指令给appium server ,appium server 接收到client发送的指令后,转换为移动端能够识别的指令,然后发送给移动端设备,并对移动端设备进行操作。

    工作流程,脚本请求--->4723端口appium server --->解析参数给pc端4724端口---->发送给设备4724端口---->通过设备4724端口发给bootstrap.jar --->bootstrap.jar把命令发给 uiautomator

    注意:bootstrap.jar:是push到android手机上的一个应用程序,主要是接受appium server的执行并且运行这些测试指令。而指令的执行正式通过UIAutomator来驱动

    1.appium安装

            1.安装jdk

            下载好后点击进行安装。安装好后进行环境变量的配置

            打开计算机-》系统属性-》高级系统设置-》环境变量-》新建(系统变量),如图所示:

    配置JAVA_HOME C:\Program Files\Java\jdk\jdk1.8.0_91(根据自己的安装磁盘决定盘符)

    配置Path: ;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin; 追加进Path中;

    配置CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

    验证:

    验证一下JDK的环境是否配置好,win+r 输入cmd进入dos下输入java -version检查环境是否配置成 功。

    安装 Android sdk  ---安装步骤类似jdk,不在赘述

    验证:

    2.安装Node.js

    建议使用我提供下载的6.9.4版本,类似jdk,不再赘述

    验证:

    3.安装appium

    下载:AppiumForWindows_1_4_16_1.zip

    验证:

    cmd打开命令行窗口,输入appium-doctor ,出现以下提示,All Checks were successful ,说明环境 配置成功

    4.安装依赖包

    appium-pytho-client 目的是需要将python 与appium 关联起来,首先要安装python3.x ,进行环境配置。配置的默认环境是本地的python 环境,如果后期使用pycharm的虚拟环境,这需要在虚拟环境中再次安装。

    在需要的环境下,输入:pip install Appium-Python-Client==1.3.0,(此处需要配合appium版本使 用,所以需要指定版本安装)提示成功就可以了,我这边是已经安装过了。同时selenium的包要指定安 装4.8.0,安装命令:pip install selenium==4.8.0

    验证 :出现successfully,就安装成功。

    三、启动设备

    1.appium 已经启动

            双击该软件appium-desktop,启动appium服务器

            点击start server,启动appium服务器

    看到以上图形,代表服务启动成功

    2.设备已连接

            A.连接模拟器

            adb命令进行连接模拟器  

            命令:adb connect 127.0.0.0.1:port

    端口号:逍遥安卓模拟器:21503

    B.连接真机:

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

            

    3.被测软件已经安装:

    将目标apk安装到目标机器上,如果是模拟器,如下图

    四、启动目标app

    此处我们以模拟器上的今日头条的apk为例 代码如下:

    代码如下:

    1. import time
    2. from appium import webdriver
    3. def startUp():
    4. print("启动中")
    5. #启动参数设置dict数据格式
    6. desire_caps = {
    7. #通过adb devices获取,此处是模拟器所以填写的是ip和port
    8. "deviceName": "127.0.0.1:21503",
    9. # 使用哪个移动操作系统平台
    10. "platformName": "Android",
    11. # 使用移动操作平台的版本
    12. "platformVersion": "5.1.1",
    13. # app的包名,通过aapt dumpsys bading xxx.apk获取
    14. "appPackage": "com.ss.android.article.news",
    15. "appActivity": "com.ss.android.article.news.activity.MainActivity",
    16. "noReset": True,
    17. "unicodeKeyboard": True
    18. # "autoLaunch": False
    19. }
    20. driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desire_caps)
    21. print("启动成功,等待6s关闭")
    22. time.sleep(6)
    23. #智能等待
    24. driver.implicitly_wait(1)
    25. time.sleep(4)
    26. driver.quit()
    27. if __name__ == '__main__':
    28. startUp()

    报错:
    ValueError: Timeout value connect was , 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

    APP启动参数说明:

    参数描述
    appPackageApp的包名,通过aapt dumpsys badging
    xxx.apk获取
    例如:'appPackage': 'com.jyibb.shell_customer',
    platformName使用哪个移动操作系统平台例如:'platformName': 'Android'
    platformVersion移动操作系统版本例如:'platformVersion': '5.1'
    deviceName使用的移动设备或模拟器的名称,通过adb devices获取例如:'deviceName':'8TB6V4ZPZ54LPJ5P'
    app如果为第一次启动则需要
    通过该参数指定app安装
    包的位置,一般为绝对路径
    例如:'app': ‘D:\shell_customer-debug.apk'
    newCommandTimeout在假定客户端退出并结束
    会话之前,Appium将等
    待来自客户端的新命令
    (以秒为单位)
    例如 60
    appActivity通过aapt dumpsys
    badging xxx.apk获取
    例如 appActivity':
    'com.jyibb.module_launch_customer.SplashActivity',
    udid连接的物理设备的唯一设
    备标识符,此参数为ios
    特有参数
    例如 :'udid':'1ae203187fc012g'
    noReset在此会话之前不要重置应 用程序状态。true, false
    fullReset执行完整的重置true, false
    unicodeKeyboard解决输入中文的问题,否 则不能用sendkeys输入 中文例如, ‘unicodeKeyboard':'True'
    resetKeyboard将键盘隐藏起来,默认 truetrue, false
    autolunchAppium是否要自动启动 或安装app默认true ,该参数在设计框架时开启了lunchapp方法 后使用可以避免每次第一个用例失败
    automationNameUiAutomator2有些手机定位不到元素,或调不动时,可以使用此参数

    注意: "udid":设备唯一标识,通过adb devices获取,显示的设备标识,如果当前连接了多台设备,可以通过 此参数区分要启动的设备,安卓的deviceName不会校验正确性(可以随便写),ios必须校验 系统版本:打开模拟器里面的设置,查看系统版本即可,类似手机操作系统,如下图

    appPackage和appActivity获取:

    1、 将目标apk放在一个已知目录下

    2、 进入该目录的dos环境,输入以下命令

    1. aapt dump badging jinritoutiao.apk |findstr package ----用来查看package
    2. aapt dump badging jinritoutiao.apk |findstr activity ----用来查看activity

    如果是linux或者mac 则把findstr换成grep

    1. aapt dump badging d:\xxx.apk #获取安装包的所有信息
    2. adb devices(查看手机是否连接到电脑,可以看到设备名称)
    3. adb shell 可以进入默认连接设备的linux环境
    4. 如果不想进入linux环境好需要输入命令进行操作的话可以通过一下方式:
    5. adb shell ls -l(shell后直接跟命令)
    6. 如果是连接了多台设备,可以通过adb -s 127.0.0.1:21503 shell来进入指定设备的linux环境
    7. adb shell pm list packages 列出所有的包名
    8. adb shell dumpsys package com.android.xxx:查看某个包的具体信息
    9. adb logcat | grep xxx:查看当前app的日志并过滤关键字

    自动化测试用例的实现

    以今日头条发微头条为例

    手工执行用例的步骤:

    前提:启动头条app,且是登录状态

    1- 打开首页,点击发表按钮

    2- 点击微头条,输入内容

    3- 点击发布

    4- 检查是否发表成功(数据库/页面)

    自动化执行的步骤:

    1、 定位目标元素(坐标,元素属性),操作目标元素(点击,滑动,输入)

    2、 定位目标元素(坐标,元素属性),操作目标元素(点击,滑动,输入)

    3、 定位目标元素(坐标,元素属性),操作目标元素(点击,滑动,输入)

    4、 断言(接口状态码,数据库字段,app页面)

    五、元素定位工具

    1. uiautomator

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

    找到sdk下的tools里面的uiautomatorviewer.bat

    2. appium-desktop

    优先使用desktop,启动appium-desktop,点击服务器右上角的查找按钮,界面如下

    点击启动后:

    3-monitor:Android SDK自带的一个工具,在tools目录下,此工具主要用来监控Android手机的运行情 况,比如线程、堆内存,日志输出、等等。

    六、元素定位方式

    1. 单个元素定位

            方法:find_element

            用法:driver.find_element(By.属性,'属性值'),传递两个参数:一个是定位属性,一个是该属性的值

            1. 通过id定位 取resource-id的属性值,替换到xxx

    driver.find_element(By.ID," xxxx ")
    

            2. 通过class_name定位

                    取class的属性值,替换到xxx

    driver.find_element(By.CLASS_NAME," xxxx ")

            3. 通过xpath定位 取xpath的属性值,替换到xxx

    driver.find_element(By.XPATH," xxxx ")

            4. 通过link_text定位 取text属性值,替换到xxx

            写法一:

    driver.find_element(By.LINK_TEXT," xxxx ")

           写法二:

    1. driver.find_element_by_android_uiautomator("new UiSelector().text(\"+关注
    2. \")")

    5. 通过css_selector定位(webview)

    driver.find_element(By.CSS_SELECTOR,"XXXX")

    6. 通过name定位(webview) web view容器中的html页面可以用name定位,native并没有name属性

    driver.find_element(By.NAME," xxxx ")

    2. 多个元素定位

            方法:find_elements

            用法:与find_element方式一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果 例如:通过ID定位到多个元素,我想点击第一个元素

    1. driver.find_elements(By.ID,"xxxxx")[0].click()
    2. # 或采用以下写法
    3. list1 = driver.find_elements(By.ID,"xxxxx")
    4. list1[0].click()

    七、元素操作

    找到元素后可以对元素进行的操作

    1. click() 点击操作,也可以用tab实现点击操作

    driver.find_element(By.ID," xxxx ").click()

    2. clear() 清空输入框内容

    driver.find_element(By.ID," xxxx ").clear()

    3. send_keys() 输入框内输入内容

    driver.find_element(By.ID," xxxx ").send_keys("test content")

    4. text 获得元素的text内容

    1. result = driver.find_element(By.XPATH," xxxx").text
    2. print(result)

    5. get_attribute() 通过传入xx属性,获取xx属性值

    driver.find_element(By.ID,' xxxx ').get_attribute('text')
    

    6. size 获取元素的大小,得到一个字典如:{'height': 48, 'width': 640}

    driver.find_element(By.ID,' xxxx ').size

  • 相关阅读:
    Day15用栈实现队列&用队列实现栈
    粗俗解释C# 8.0+的变量后面有?问号是什么意思?
    前端TypeScript学习-交叉类型与泛型
    cocos小游戏实战-04-碰撞检测与NPC渲染
    03 最小CMake项目
    BERT应用——文本相似度计算
    java-net-php-python-s2sh教学管理平台hsg8229AGA2修改回复计算机毕业设计程序
    每日一题2609. 最长平衡子字符串
    自研 MySQL Binlog 分析程序介绍
    理解 ByteBuffer
  • 原文地址:https://blog.csdn.net/weixin_47347921/article/details/133140538