一、环境准备

1、安装Python3,Python3的Appium库

①下载地址:Python官网https://www.python.org/,直接下载即可

②Appium库:命令行输入pip install Appium-Python-Client安装即可

2、安装Android SDK(下载Android Studio)

下载地址:https://developer.android.google.cn/studio/

image.png

①下载完成后,next安装,如需要安装自带的模拟器,勾选Android Virtual Device选项,如下图:

image.png

②继续Next,到达定制组件页面,设置一下SDK的安装路径,如下图:

image.png

③继续Next…finish,下载完成后即完成安装。

3、安装JDK

下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

4、安装Appium

下载地址:http://appium.io/,windows快捷下载地址:https://github.com/appium/appium-desktop/releases/download/v1.7.1/appium-desktop-setup-1.7.1.exe

image.png

①安装完成后,启动Appium,host和port默认的即可,然后编辑下配置信息

image.png
image.png
②点击下边那个保存并重启的按钮,然后点第一个Start Server按钮,启动成功
image.png

5、安装夜神模拟器

下载地址: https://www.yeshen.com/,傻瓜式安装,下一步即可,注意安装路径

①安装完成后,更改配置,进入bin目录

image.png

②把安装好的Android SDK里的adb.exe文件(比如D:\Android\SDK\platform-tools目录下)复制到该目录覆盖掉该目录已存在的adb.exe文件

image.png

③删掉该目录的nox_adb.exe文件,再复制一份adb.exe并重命名为nox_adb.exe,启动模拟器

④在bin目录打开控制台,执行nox_adb.exe connect 127.0.0.1:62001,然后执行adb devices

image.png

⑤安装apk文件,直接拖入即可。

image.png

⑥继续在刚刚的控制台窗口里输入aapt dump badging D:\apk\XXXXXX,其中D:\apk\XXXXXX是测试apk的完整路径。

记录package中的name,launchable activity name,脚本会用到。
image.png
image.png
注:如果模拟器重启了,需要重新连接:nox_adb.exe connect 127.0.0.1:62001

二、pytest脚本准备

1、项目目录

image.png
allure_report/allure_result:allure报告
logs:存放生成的日志文件
test_case

  • test_app.py:测试用例文件

pytest.ini:主配置文件,可以改变pytest的默认行为
run.py:主程序入口,执行测试用例

2、test_app.py

image.png

  1. 连接appium需要的参数:
  2. 'platformName': 'Android', # 平台名称
  3. 'platformVersion': '7.1.2', # 系统版本号,即夜神模拟器的Android版本
  4. # 设备名称。如果是真机,在'设置->关于手机->设备名称'里查看
  5. 'deviceName': '127.0.0.1:62001',
  6. 'appPackage': 'xxxxxx', # apk的包名
  7. 'appActivity': 'xxxxxx.activities.MainActivity' # activity 名称

3、run.py

image.png

①allure报告命令

  1. 运行生成测试结果:pytest <测试目录> --alluredir <测试结果存放目录>
  2. 例:pytest test --alluredir allure_result --clean-alluredir 清除上次生成的报告数据
  3. 注意!这个时候allure_result里边的数据只是测试结果(json.txt文件),还不是测试报告
  4. 生成测试报告:allure generate <allure测试结果目录> -o <存放报录> --clean(清空旧数据)

②运行run.py

image.png
运行后,生成两个小机器,进入相应app页面人即连接成功。

三、appium打开元素编辑页面

1、点击放大镜,打开会话窗口

image.png

2、填写需要的参数,点击开始会话,出现模拟器一样的窗口即成功

image.png
image.png

四、备注

1、adb命令

安卓调试桥 (Android Debug Bridge, adb),是一种可以用来操作手机设备或模拟器的命令行工具。它存在于 sdk/platform-tools 目录下。

  1. 1.显示当前运行的全部模拟器:adb devices
  2. 2.启动ADBadb start-server
  3. 3.停止ADBadb kill-server
  4. 4.安装应用程序:adb install -r [apk文件]
  5. -l #锁定该程序-r #重新安装该程序,保存数据-s #安装在SD卡内,而不是设备内部存储
  6. 例:adb install --r D:\mm.apk
  7. 5.卸载应用程序:adb uninstall [packagename] 例:adb uninstall com.tencent.mm
  8. -k #不删除程序运行所产生的数据和缓存目录(如软件的数据库文件)
  9. 例:adb uninstall -k com.tencent.mm
  10. 6. 讲手机设备中的文件copy到本地计算机:adb pull 设备目录 本地目录
  11. 例:adb pull /sdcard/mm.txt D:\(讲内存卡根目录的txt文件copyD盘根目录)
  12. 7.将本地计算机的文件copy到手机设备中:adb push 本地目录 手机设备目录
  13. 例:adb push D:\mm.txt /sdcard
  14. 8.查看adb命令帮助信息:adb help
  15. 9.截屏例:adb shell screencap -p 截图文件路径
  16. 10.查看指定包名应用的数据库储存信息(包括储存的SQL语句)
  17. 例:adb shell dumpsys dbinfo[packagename]
  18. 11.查看指定的进程或则进程id的内存信息:adb shell dumpsys meminfo[packagename/pid]可以查看进 程当前的内存情况
  19. 例:adb shell dumpsys meminfo com.tencent.mm
  20. 12.查看指定包名应用的详细信息(相当于AndroidMainfest.xml中内容)
  21. adb shell dumpsys [packagename]例:adb shell dumpsys com.tencent.mm
  22. 13.查看当前应用的activity信息:adb shell dumpsys activity top
  23. 查看bug报告:adb bugreport
  24. 14.列出手机装的所有apk包名:adb shell pm list packages
  25. 系统应用:adb shell pm list packages -s
  26. 第三方应用:adb shell pm list packages -3
  27. 使用grep过滤:adb shell pm list packages | grep qq
  28. 15.清除应用缓存信息:adb shell pm clear [packagename]
  29. 16.通过adb启动应用程序页面:adb shell am start -n[包名+activity名]
  30. 例:adb shell am start -n com.tencent.mm/.ui.SplashAcitvity
  31. 强制停止应用有些时候应用卡死了,需要强制停止,则执行以下命令:
  32. adb shell am force-stop <packagename>
  33. 如:adb shell am force-stop cn.androidstar.demo
  34. 17、记录无线通讯日志:
  35. 一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,
  36. 设置记录:adb shell logcat -b radio
  37. 18、获取设备的ID和序列号:adb get-product
  38. adb get-serialno
  39. 19、访问数据库SQLite3adb shell sqlite3#cd system/sd/data //进入系统内指定文件夹
  40. #ls //列表显示当前文件夹内容
  41. #rm -r xxx //删除名字为xxx的文件夹及其里面的所有文件
  42. #rm xxx //删除文件xxx
  43. #rmdir xxx //删除xxx的文件夹
  44. 20.导出设备信息
  45. adb get-serialno > 序列号.txt
  46. adb shell cat /sys/class/net/wlan0/address > MAC地址.txt
  47. adb shell getprop ro.product.model > 设备型号.txt
  48. adb shell getprop ro.build.version.release> 系统版本.txt
  49. adb shell pm list packages -s > 系统应用的所有包名.txt
  50. adb shell pm list packages -3 > 第三方应用包名.txt
  51. adb shell wm size > 屏幕分辨率.txt
  52. adb shell wm density > 屏幕密度.txt
  53. adb shell cat /proc/cpuinfo > CPU信息.txt
  54. adb shell pm list permissions -f > 权限.txt
  55. adb shell pm list users -f > 用户.txt
  56. 21.重启:adb reboot

2、appium定位元素(Android)

image.png

  1. 见上图,定位到“关于我们”并点击
  2. # appium的webdriver提供了11种元素定位方法,
  3. selenium的基础上扩展了三个,可以在pycharm里面输入driver.find_element_by然后会自动匹配出来
  4. #通过id定位成功
  5. driver.find_element_by_id("com.youdao.calculator:id/tv_about").click()
  6. #tap是模拟手指点击,一般页面上元素.语法有两个参数,第一个是positions,是list类型最多五个点,duration是持续时间,单位毫秒
  7. #通过tap定位成功
  8. driver.tap([(540,556)],300)
  9. #通过xpath定位
  10. driver.find_element_by_xpath("//*[@resource-id='com.youdao.calculator:id/tv_about']//android.widget.LinearLayout[3]").click()
  11. # 通过android_uiautomator定位
  12. # 通过id定位
  13. my = 'new UiSelector().resourceId("com.youdao.calculator:id/tv_about")'
  14. driver.find_element_by_android_uiautomator(my).click()
  15. # 通过text定位
  16. # 1.通过text文本定位语法
  17. new UiSelector().text("关于我们")
  18. # 2.文本比较长的时候,可以用textContains模糊匹配,只要文本包含匹配内容就可以了。
  19. new UiSelector().textContains("关于我们")
  20. # 3.textStartsWith是以某个文本开头的匹配
  21. new UiSelector().textStartsWith("以‘关于我们’开头")
  22. # 4.正则匹配textMatches,这个需要配合正则表达式,就不举例了。
  23. new UiSelector().textMatches("正则表达式")
  24. # class属性一般不唯一,多半用在复数定位,className复数定位
  25. loc_class = 'new UiSelector().className("android.widget.TextView")'
  26. driver.find_elements_by_android_uiautomator(loc_class)[2].click()
  27. # 组合定位,一般组合用id,class,text这三个属性会比较好一点
  28. # id+class 属性组合
  29. id_class = 'resourceId("com.youdao.calculator:id/tv_about").className("android.widget.TextView")'
  30. driver.find_element_by_android_uiautomator(id_class).click()
  31. # 父子定位childSelector
  32. # 有时候不能直接定位某个元素,但是它的父元素很好定位,这时候就先定位父元素,通过父元素找儿子。
  33. son = 'resourceId("com.youdao.calculator:id/tv_about").childSelector(text("关于我们"))'
  34. driver.find_element_by_android_uiautomator(son).click()
  35. # 兄弟定位fromParent
  36. # 有时候父元素不好定位,但是跟他相邻的兄弟元素很好定位,这时候就可以通过兄弟元素,找到同一父级元素下的子元素。
  37. brother = 'resourceId("com.youdao.calculator:id/tv_about").fromParent(text("关于我们"))'
  38. driver.find_element_by_android_uiautomator(brother).click()

3、appium移动端特有操作

Appium 的swipe函数是针对屏幕上的坐标来滑动的。swipe函数是安卓和 IOS 两种设备同时通用。
从一个点滑到另外一个点,那么每个点都有 x 值和 y 值。
swipe有 4 个参数。所以起始 x,起始 y,结束 x,结束 y。

①获取滑屏的屏幕大小

1、获取到整屏的大小,按百分比来滑动,滑动的距离在70%-90%,首先获取屏幕的size
get_window_size()这个函数的返回值:返回的是个字典。
2、swipe有两个坐标点:
首先要得到start_x;
x 轴是width。size[‘width’]是 x 轴的最大值;
从一个页面滑动到另外一个页面,y 轴没有变化。所以 y 值是固定的,就取个中间值 0.5;

  1. #height、width
  2. size= driver.get_window_size()
  3. start_x=size['width']*0.9
  4. start_y=size['height']*0.5

②滑动间距(通常达到 80%以上)

  1. #height、width
  2. size= driver.get_window_size()
  3. start_x=size['width']*0.9
  4. start_y=size['height']*0.5
  5. end_x=size["width"]*0.1

③滑动时长

swipe还有个参数叫做duration(时长),这个单位是毫秒。

  1. #height、width
  2. size= driver.get_window_size()
  3. start_x=size['width']*0.9
  4. start_y=size['height']*0.5
  5. end_x=size["width"]*0.1
  6. end_y=size['height']*0.5
  7. #从右向左滑
  8. driver.swipe(start_x,start_y,end_x,end_y,200)
  9. #从左向右滑
  10. driver.swipe(end_x,end_y,start_x,start_y,200)
  11. #向下滑动
  12. #向上滑动:x轴不变,y从大到小
  13. driver.swipe(size["width"]*0.5,size["heigth"]*0.9,size["width"]*0.5,size["heigth"]*0.1)
  14. #向上滑动:x轴不变,y从小到大
  15. driver.swipe(size["width"]*0.5,size["heigth"]*0.1,size["width"]*0.5,size["heigth"]*0.9)