Appium 使用小结
前言:
Appium 是通过模拟用户操作进行自动化操控手机端第三方库。通常使用场景多用于回归测试。在产品教成熟,页面改动较少后,通过ui自动化进行回归操作测试。
Appium 本身使用很简单,java和python两种语言都可以使用,在此我们将使用python操作Appium。
1. 安装
Appium安装配置环境比较复杂,本文不做过多解释,直接引用别人的链接:
https://www.cnblogs.com/fnng/p/4540731.html
2.使用
Appium使用进行测试时,可以放到单元测试框架unittest中,然后用assert断言验证当前页面元素进行测试结果判断。
以下为一个例子:
# !/usr/bin/python3.6
# -*- coding: UTF-8 -*-
# author: lucien
# 用例: 登入
from appium import webdriver
import unittest
import time
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support.ui import WebDriverWait class login(unittest.TestCase):
@classmethod
def setUpClass(cls):
desired_caps = {
"platformName": "Android",
"platformVersion": "6.0",
"deviceName": "mate9",
"automationName": "UiAutomator2",
"appPackage": "cn.vsx.vc",
"appActivity": ".activity.RegistActivity",
"noReset": "true",
}
cls.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
WebDriverWait(cls.driver, 10).until(
lambda x: x.find_element_by_xpath(
"//android.widget.TextView[contains(@text, '选择单位')]").is_displayed()) # 验证等待10秒超时 def test001_login(self):
self.driver.find_element_by_xpath("//android.widget.TextView[contains(@text, '选择单位')]").click() # 点击展开选择单位
time.sleep(1)
self.driver.tap([(self.a * self.x, self.b * self.y)], duration=1) # 点击选择单位
WebDriverWait(self.driver, 10).until(
lambda x: x.find_element_by_xpath(
"//android.widget.Button[contains(@text, '按住说话')]").is_displayed()) # 验证等待10秒超时
结构很简单,单元测试框架中,套入appium操作手机,与验证元素。
注意点:
1. 头部文件重要的几个(appPackage, appActivity, platformVersion)
首先appPackage要找到你的app包
其次appActivity要找到你当前的页面
最后Android版本要对应你的系统版本
adb shell
dumpsys activity | grep mFocusedActivity

通过adb命令,应用程序启动后,找到包名和当前页
2. 元素的选择:
appium元素的选择与查找有很多方式
通常简短的有:
ID查找
self.driver.find_element_by_id()
类名查找:
self.driver.find_element_by_class_name()
其他还有by name by tag name 等等
其中比较精确的,也是比较常用的还是通过路径定位
self.driver.find_element_by_xpath()
3.元素的操作
操作点较多,不一一列举,同样转链接:
https://www.cnblogs.com/fanxiaojuan/p/4882676.html
3. 坑与经验
一 等待时间有三种: sleep(), implicitly_wait(), WebDriverWait().until()
1. sleep强制等待时间
2. implicitly_wait为隐性等待时间
3. WebDriver为知道当前元素找到后才进行后续动作,等待时间自己设置否则报错
通常建议使用第三种等待,较为科学
二 弹出窗口找不到元素,定位方式要么让开发加上焦点聚焦在弹出窗口上,要么通过相对定位方式,通过TAP去点击
开发中加入焦点
contentView.setFocusable(true)
Tap绝对路径定位
x = driver.get_window_size()['width'] # 获取当前屏幕宽
y = driver.get_window_size()['height'] # 获取当前屏幕高
a, b = 170 / 768, 790 / 1184 # 170和790为要选择的位置, 768和1184为屏幕实际大小
self.driver.tap([(a * x, b * y)], duration=1) # 点击选择
三 长按后面不要接等待时间,等待时间会自动归入到长按中计算,导致后面元素判断出错。
1. 可以通过其他操作直接中断长按操作
2. 可以选择对于当前元素进行释放,来取消长按操作
两种操作选择其一即可
el = self.driver.find_element_by_xpath("//android.widget.Button[contains(@text, '按住说话')]") # 找到组呼按钮
TouchAction(self.driver).long_press(el, None, None, 10 * 1000).perform() # 组呼按钮按下10秒
time.sleep(5)
TouchAction(self.driver).move_to(el).release().perform() # 释放按钮
四 单元测试框架中setUp中如果放入desired_caps,那么每一个test开头的用例都会导致重新启动一次连接,避免次情况产生,需要用到:
setUpClass(cls)方法,记住加上装饰器,@classmethod
这样在跑用例时,只会执行一次setUpClass方法,不会重复执行setUp
Appium 使用小结的更多相关文章
- Appium原理
Appium原理小结 Api接口调用selenium的接口,android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的) ...
- Appium原理及版本变化细节
Appium原理小结 Api接口调用selenium的接口,Android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的) ...
- 【转】RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】
接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动化脚本通过RobotFrameWork将命令传递给Appium的客户端: 2.然后[Appium的客户端]将接受 ...
- RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】
http://blog.csdn.net/deadgrape/article/details/50574459 接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动 ...
- Appium Android Bootstrap控制源代码的分析AndroidElement
通过上一篇文章中<Appium Android Bootstrap源代码分析之简单介绍>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一 ...
- Appium Server源码分析之作为Bootstrap客户端
Appium Server拥有两个主要的功能: 它是个http服务器,它专门接收从客户端通过基于http的REST协议发送过来的命令 他是bootstrap客户端:它接收到客户端的命令后,需要想办法把 ...
- Appium Server 源码分析之启动运行Express http服务器
通过上一个系列Appium Android Bootstrap源码分析我们了解到了appium在安卓目标机器上是如何通过bootstrap这个服务来接收appium从pc端发送过来的命令,并最终使用u ...
- Appium Android Bootstrap源码分析之启动运行
通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...
- Appium Android Bootstrap源码分析之命令解析执行
通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...
随机推荐
- .NET Core2.0应用IdentityServer4
IdentityServer4能解决什么问题 假设我们开发了一套[微博程序],主要拥有两个功能:[登陆验证].[数据获取] 随后我们又开发了[简书程序].[知乎程序],它们的主要功能也是:[登陆验证] ...
- python 阶乘
product= i= : product=i*product print('i=%d' %i,end='') print('\tproduct=%d' %product) i+= print('\n ...
- STL_算法_03_拷贝和替换算法
◆ 常用的拷贝和替换算法: 1.1.复制(容器A(全部/部分) 复制到 容器B(全部/部分)),返回的值==>iteratorOutBegin.end() iterator copy(itera ...
- Java成神之路技术整理
关于 Java 的技术干货,从以下几个方面汇总. Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具篇 Java 书籍篇 ...
- Flutter学习笔记(五)
一.Container 是一个便利的Widget,它把通用的绘制.定位和Widget的大小结合了起来. Container会先用padding填充子Widget和border之间的空白,然后添加其他的 ...
- 编写自己的代码库(javascript常用实例的实现与封装)[转]
1.前言 因为公司最近项目比较忙,没那么多空余的事件写文章了,所以这篇文章晚了几天发布.但是这也没什么关系,不过该来的,总是会来的.好了,其他的不多说的,大家在开发的时候应该知道,有很多常见的实例操作 ...
- AngularJs filter 过滤器基础【转】
Filter Ng里的过滤器. currency:把一个数字格式化成货币模式(如$1,234.56).当没有提供任何货币符号时,默认使用当前区域的符号. 使用: HTML:{{ currency_ex ...
- URAL 1513 Lemon Tale
URAL 1513 思路: dp+高精度 状态:dp[i][j]表示长度为i末尾连续j个L的方案数 初始状态:dp[0][0]=1 状态转移:dp[i][j]=dp[i-1][j-1](0<=j ...
- php.ini配置说明
1.设置时区为中国时区 date.timezone = PRC 2.设置支持MySql数据 extension=php_pdo_mysql.dll 直接将这个注释打开就OK了 3.让PHP支持简写&l ...
- 雷林鹏分享:C# 类(Class)
C# 类(Class) 当您定义一个类时,您定义了一个数据类型的蓝图.这实际上并没有定义任何的数据,但它定义了类的名称意味着什么,也就是说,类的对象由什么组成及在这个对象上可执行什么操作.对象是类的实 ...