前言:

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 使用小结的更多相关文章

  1. Appium原理

    Appium原理小结 Api接口调用selenium的接口,android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的) ...

  2. Appium原理及版本变化细节

    Appium原理小结 Api接口调用selenium的接口,Android底层用android的instrumentation(API2.3+ 通过绑定另外一个独立的selendroid项目来实现的) ...

  3. 【转】RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】

    接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动化脚本通过RobotFrameWork将命令传递给Appium的客户端: 2.然后[Appium的客户端]将接受 ...

  4. RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】

    http://blog.csdn.net/deadgrape/article/details/50574459 接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动 ...

  5. Appium Android Bootstrap控制源代码的分析AndroidElement

    通过上一篇文章中<Appium Android Bootstrap源代码分析之简单介绍>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一 ...

  6. Appium Server源码分析之作为Bootstrap客户端

    Appium Server拥有两个主要的功能: 它是个http服务器,它专门接收从客户端通过基于http的REST协议发送过来的命令 他是bootstrap客户端:它接收到客户端的命令后,需要想办法把 ...

  7. Appium Server 源码分析之启动运行Express http服务器

    通过上一个系列Appium Android Bootstrap源码分析我们了解到了appium在安卓目标机器上是如何通过bootstrap这个服务来接收appium从pc端发送过来的命令,并最终使用u ...

  8. Appium Android Bootstrap源码分析之启动运行

    通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...

  9. Appium Android Bootstrap源码分析之命令解析执行

    通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...

随机推荐

  1. C++:几种callable实现方式的性能对比

    C++中几种callable实现方式的性能对比 前言 C++中想实现一个callable的对象,通常有四种方式: std::function:最common的方式,一般会配合std::bind使用. ...

  2. STL_算法_02_排序算法

    ◆ 常用的排序算法: 1.1.合并(容器A(全部/部分)&容器B(全部/部分)==>容器C(全部/部分),容器C中元素已经排好顺序),返回的值==>iteratorOutBegin ...

  3. js中如何访问对象和数组

    js中如何访问对象和数组 一.总结 一句话总结:js访问对象点和中括号,访问数组的话就是中括号 对象 . [] 数组 [] 1.js访问对象的两种方式? . [] 可以使用下面两种方式访问对象的属性和 ...

  4. Phalcon框架数据库读写分离的实现方法

    Phalcon框架和Yaf类似,是一款用C实现的拓展级别的框架,不过其功能实现更加丰富,设计思路基于依赖注入.容器等方式,更符合现代框架思想.本文主要针对Phalcon框架数据库层的读写分离进行说明, ...

  5. English trip -- VC(情景课)8 C

    MP review: 音标(Phonetic symbol) [ɪ]    lit adj. 照亮的,点着的(light的过去式及过去分词)n. (Lit)人名:(瑞典)利特:(老)李 [ʊ]   g ...

  6. English trip -- VC(情景课)4 D

    What do you see? I can see three men in the pictrue. one older man is a doctor, two younger men are ...

  7. 20170728xlVba还是这个混蛋

    Public Sub Main22() If Now() >= #1/1/2018# Then Exit Sub Dim strText As String Dim Reg As Object, ...

  8. 谈谈http与https

    今天简单的来说一下http和https, 简单来讲: HTTP 是 超文本协议,TCP 端口是 80    HTTPS 是一种配合了SSL协议的.加密的HTTP 协议 ,TCP端口是 443 HTTP ...

  9. Elections CodeForces - 1020C (贪心)

    大意: 有n个选民, m个党派, 第i个选民初始投$p_i$一票, 可以花费$c_i$改变投票, 求最少花费使得第一个党派的票数严格最大 假设最终第一个党派得票数$x$, 枚举$x$, 则对于所有票数 ...

  10. Codeword CodeForces - 666C (字符串计数)

    链接 大意:求只含小写字母, 长度为n, 且可以与给定模板串匹配的字符串个数 (多组数据) 记模板串为P, 长为x, 总串为S. 设$f_i$为S为i时的匹配数, 考虑P最后一位的首次匹配位置. 若为 ...