基于Python3 Appium+Pytest的UI自动化实例(Android)

春有百花秋有月,夏有凉风冬有雪 若无闲事挂心头,便是人间好时节

  • 第一部分:所需环境的配置
  • 所需软件网盘链接(提取码1908):传送门
  • java1.8版本配置环境变量:
    1,JAVA_HOME D:\Software\Java\jdk1.8.0_231
    2,CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
    3,Path %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

  • AndroidSDK环境配置
    1,下载解压AndroidSDK后需要启动SDK Manager.exe下载所需的文件
    2,配置环境变量:
        ANDROID_HOME D:\SDK\android-sdk_r24.4.1-windows\android-sdk-windows
        path %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools
        检验是否安装成功:adb / adb shell

  • appium环境
    1, appium desktop(appium server +appium inspector工具)
    2,appium server
        官方:npm install -g appium(需要爬墙)
        国内镜像:
        先安装NodeJs之后用npm安装cnpm:
        npm install -g cnpm --registry=https://registry.npm.taobao.org
        通过cnpm安装:cnpm install -g appium
        appium-docter: cnpm install appium-docter
    3,安装后输入appium进行检验是否成功,不报错说明成功
  • appium client(即使用的语言脚本)这里使用python
        通过pip安装:pip install appium-python-client
    4,模拟器连接,mumu模拟器为例
    adb connect 127.0.0.1:7555
    ***到此就所有的环境准备完成!***
  • 第二部分:python测试脚本的编写
    以网易云音乐搜索为实例
    1,项目目录:
  • Page页面建模
  • basepage.py 内容:
from appium.webdriver.webdriver import WebDriver
from appium.webdriver.common.touch_action import TouchAction
import yaml
import pytest
from time import sleep'''创建一个基础页面类,用于封装公共模块的处理方法和根据yaml配置文件进行案例的测试步骤'''class BasePage:_blackList = []  # 黑名单列表,用于处理再case运行过程中可能出现的未知弹窗_errorCount = 0  # 定位元素的错误次数,元素定位中可能出现一次定位不到_errorMax = 5  # 允许进行元素定位的最大错误次数def __init__(self, driver: WebDriver = None):  # 初始化driverself._driver = driverdef find(self, by, locator):  # $by>定位元素的方法,$locator>定位元素对应的所需valuetry:if isinstance(by, tuple):  # 如果传入的定位是个元组形式,包括方法和locator,就进行解包的方式定位element = self._driver.find_element(*by)else:element = self._driver.find_element(by, locator)self._errorCount = 0  # 找到元素,错误次数为0return elementexcept Exception as e:self._errorCount += 1  # 未找到该元素,错误次数加1if self._errorCount >= self._errorMax:raise e  # 错误次数大于设置的最大次数抛出异常for black in self._blackList:elements = self._driver.find_elements(*black)  # 找到黑名单列表里的所有元素,[(by, locator),]的形式设置if len(elements) > 0:  # 出现弹框匹配黑名单列表大于0,即出现未知弹框elements[0].click()  # 点击过后就找不到该元素了,所以永远点击第一个找到的就可以了return self.find(by, locator)  # 点击后返回原方法,轮询去让定位可以继续执行raise e  # 没有找到,抛出异常def send(self, by, locator, value):  # 数据输入的方法try:self._driver.find(by, locator).send_keys(value)  # 定位到输入的位置,输入值self._errorCount = 0except Exception as e:self._errorCount += 1if self._errorCount >= self._errorMax:raise e  # 大于错误次数,抛出异常for black in self._blackList:elements = self._driver.find_element(*black)if len(elements) > 0:elements[0].click()return self.find(by, locator)raise edef steps(self, path):  # 定义操作步骤的方法,用于通过编写配置文件,执行相关用例with open(path, 'r', encoding='utf-8') as f:steps: list[dict] = yaml.safe_load(f)  # 操作步骤的数据类型为:[{},{}]# 遍历操作步骤for step in steps:if 'by' in step.keys():element = self.find(step['by'], step['locator'])  # 定位到元素# 要进行的动作操作if 'action' in step.keys():if 'click' == step['action']:  # 点击操作element.click()if 'send' == step['action']:element.send_keys(step['value'])if 'TouchAction' in step['action']:  # 滑动操作action = TouchAction(self._driver)action.press(x=step['value'][0]['x_start'], y=step['value'][0]['y_start']).wait(300)\.move_to(x=step['value'][1]['x_end'], y=step['value'][1]['y_end']).release().perform()# 断言if 'assertion' in step.keys():if "sleep" in step['assertion'].keys():sleep(step['assertion']['sleep'])element = self.find(step['assertion']['by'], step['assertion']['locator'])attribute = element.get_attribute(step['assertion']['attribute'])pytest.assume(attribute == step['assertion']['assert_info'])if 'back' in step.keys():self._driver.back()
  • app.py 内容:
from appium import webdriver
from Page.basepage import BasePage
from Page.main import Mainclass App(BasePage):# 启动appdef start(self):_package = "com.netease.cloudmusic"_activity = ".activity.LoadingActivity"if self._driver is None:desir_cap = {"appPackage": _package,"appActivity": _activity,"platformName": "Android","platformVersion": "10","dontStopAppOnReset": "true","noReset": "true","deviceName": "6de9e7a2"}self._driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desir_cap)self._driver.implicitly_wait(5)  # 隐式等待5selse:self._driver.start_activity(_package, _activity)return selfdef main(self):return Main(self._driver)
  • discovery.py 内容:因为是举例,所以以搜索为栗子
from Page.basepage import BasePage# 发现page
class Discovery(BasePage):def daily_recommendation(self):self.steps("../TestData/discovery.yml")
  • main.py 内容
from Page.basepage import BasePage
from Page.discovery import Discovery# 该类为进入不同页面(对<我的,发现,云村,视频>四个页面建模page的调配page
class Main(BasePage):def quit(self):self._driver.quit()def go_discover(self):  # 进入发现页self.steps('../TestData/main.yml')return Discovery(self._driver)
  • TestCase:测试案例
  • test_discoverypage.py 内容,发现page要进行的测试
from Page.app import App
import pytestclass TestDiscovery:def setup_class(self):self.testDriver = App().start().main()def teardown_class(self):self.testDriver.quit()def test_daily_recommendation(self):self.testDriver.go_discover().daily_recommendation()
  • TestData:测试数据配置文件(yaml)
  • main.yml
-by: accessibility idlocator: 我的推荐

discovery.yml

-by: accessibility idlocator: 搜索action: click
-by: idlocator: com.netease.cloudmusic:id/search_src_textaction: sendvalue: 似是故人来
-by: idlocator: com.netease.cloudmusic:id/adBannerViewaction: click

到此一个简单的PO模式的UI自动化测试就完成了,后边的一些其他类型的操作验证可以结合自己项目自行进行添加改进,本主也会更新完善该网易云实例的各种操作;谢谢观看!

基于Appium+Pytest的UI自动化实例(Android)相关推荐

  1. 深圳软件测试培训:Pytest+Appium+Allure 做 UI 自动化的那些事

    深圳软件测试培训:Pytest+Appium+Allure 做 UI 自动化的那些事 文本主要介绍下 Pytest+Allure+Appium 记录一些过程和经历. 法主要用了啥: Python3 A ...

  2. pythonapp自动化_基于python的App UI自动化环境搭建

    Android端Ui 自动化环境搭建 一,安装JDK.SDK 二,添加环境变量 Widows: 1.系统变量→新建 JAVA_HOME 变量 E:\Java\jdk1.7.0 jdk安装目录 2.系统 ...

  3. 基于airtest的安卓ui自动化实践

    在tester home上初识airtest感觉很惊艳,最近想给组里的同学分享一下,仔细研究了一番.分享之后,发现他们练习做的还很不错. 莫非我真的有教书育人的能力?(天真脸) 分为四个部分讲解:ai ...

  4. 基于X5内核的UI自动化

    前言 最近无论是在微信.QQ浏览器.微信小程序还是加载X5内核的页面进行UI自动化,都会遇到X5内核自动化问题,这篇进行一个问题的总结. 基础介绍 1.什么是X5内核? X5内核是腾讯基于优秀开源We ...

  5. 基于图像识别原理的UI自动化工具——Airtest入门

    一.背景 1当前UI自动化面临的问题 难以使用一套工具对移动端.web端.桌面端进行自动化测试 版本更新页面改动较大,自动化脚本的维护成本高 图片内容难以验证 2 解决方案 用图像识别方法代替传统坐标 ...

  6. Java自动化获取页面主题_基于Selenium2+Java的UI自动化(4) - WebDriver API简单介绍

    1. 启动浏览器 前边有详细介绍启动三种浏览器的方式(IE.Chrome.Firefox): private WebDriver driver = null; private String chrom ...

  7. 记录使用pytest测试UI自动化遇到的self = <script.test01_user_login.TestUserLogin object at 0x000001A8BE16E430>问题解决

    在使用pytest进行UI自动化测试,一开始是可以正常运行的,加入pytest.ini文件后出现如下图错误 解决方法:pytest.ini文件中等号前后一定要都有空格!!!!! 同时需要把脚本文件所在 ...

  8. 【自动化测试】Pytest+Appium+Allure 做 UI 自动化的那些事

    文本主要介绍下 Pytest+Allure+Appium 记录一些过程和经历. 法主要用了啥: Python3 Appium Allure-pytest Pytest Appium 不常见却好用的方法 ...

  9. 基于Selenium2+Java的UI自动化(6)-操作Alert、confirm、prompt弹出框

    alert.confirm.prompt这样的js对话框在selenium1 时代处理起来比价麻烦,常常要用autoit来帮助处理. 而现在webdriver对这些弹出框做了专门的处理,使用selen ...

最新文章

  1. 微软的平板电脑_关于微软轻便版平板电脑Surface Go,你想知道的一切细节都在这了...
  2. NoSql数据库使用半年后在设计上面的一些心得
  3. 深入浅出新一代云网络——VPC中的那些功能与基于OpenStack Neutron的实现(二)-带宽控制...
  4. html5虚拟摇杆,[Unity插件] 虚拟摇杆EasyTouch
  5. 神舟计算机主板bios,神舟HASEE笔记本电脑开机进入BIOS的方法与bios设置图解
  6. C#上位机与欧姆龙PLC通讯(FINS)
  7. 计算机屏幕保护程序怎么设置,电脑屏保怎么设置锁屏
  8. 11月书讯(下) | 拿下这些新书,赢在起跑线
  9. R 生成中国地图并保存为eps文件
  10. 中国的顶级黑客在国际上是一个什么样的水平?
  11. 英寸与毫米的换算依据
  12. 退出登录清空session
  13. 如何终止forEach循环
  14. CSDN日报20170615 ——《11 年高考结束到 17 年日本修士的心路历程》
  15. html5 涂鸦板
  16. Java如何创建项目
  17. 收藏一个白嫖资源的网站链接
  18. 对于单链表结构体中LinkList以及Lnode,*LinkList两种不同定义方式的个人理解
  19. 教学中利用计算机软件,计算机软件应用类课程教学方法探讨
  20. 浅谈信息安全与ISO27001体系认证的紧密性

热门文章

  1. 35.文本输出函数TabbedTextOut、ExtTextOut、TextOut、SetBkColor
  2. oracle spool文件名+系统时间,Oracle Spool详解
  3. Tessent MemoryBIST Overview
  4. 【Seq2Seq】卷积序列到序列学习
  5. [随笔]_写在断网时
  6. 我们在囧途之年终奖篇
  7. Xilinx 常用模块汇总(verilog)【03】
  8. 什么可以助眠?我身边的人都在推荐这几个助眠神器
  9. ThinkPad S1 Yoga配置
  10. Hibernate笔记整理3(一对多关系,保存删除操作)