Appium常用操作之「元素定位、swipe 滑屏操作」
坚持原创输出,点击蓝字关注我吧

作者:清菡
博客:oschina、云+社区、知乎等各大平台都有。
目录
- 一、打开 uiautomatorviewer
- 二、Appium 常用操作
- 1.用 layui 做 app 元素定位的时候会报错怎么办?
- 2.不等待,直接去找这个元素会报错吗?
- 3.如果是 Web 自动化,会 import By,在 Appium 中 MobileBy 有 8 种定位方式。如果现在还用 By,就没办法用到 uiautomator 以及 accessibility_id。
- 4.如果是欢迎页面,没有这种元素的怎么办?
- 三、打开 app 并登录
- 四、移动端特有的操作
- 1.swipe 滑屏操作
- 2.如果写一个操作,所有的手机都能适用,是不是应该考虑屏幕的尺寸呢?
- 3.有没有什么办法可以获取整个设备的尺寸大小?
- 4.屏幕的 size 怎么获取呢?
- 5.这个东西想一口气把它滑过来,不能出现滑动到半路上又回去了。如果我要从右边滑到左边,起点和终点怎么选?
- 6.准备花多长时间去滑动呢?
一、打开 uiautomatorviewer
用这个工具来给大家定位:


实现一个截屏(通常情况下这样用,可以截屏成功)。
二、Appium 常用操作
1.用 layui 做 app 元素定位的时候会报错怎么办?
建议不用 layui。layui 在有些情况下定位元素是有问题的。在环境基本上是正确的情况下,它截图截不到。所以可以舍弃 layui,直接用自带的 uiautomatorviewer(现在拥有的定位方式,它全部都支持)。
2.不等待,直接去找这个元素会报错吗?
和 Web 自动化一样,Appium 执行这个命令也是需要时间的。这一行代码,是进入到 app 当中,app 在这个过程中做一件事(一堆的东西),所以即便你运行的这只有这一行代码,它做的事比较多。
感觉上比 Web 等待的时间要长,但是如果你是用真机的话比用模拟器快。
所以这个之前需要等待一下。在 Web 自动化等待的时候用的是这个WebDriverWait以及EC条件表达。在这里也是一样,因为都是要页面等待元素出现,等待元素可见。
3.如果是 Web 自动化,会 import By,在 Appium 中 MobileBy 有 8 种定位方式。如果现在还用 By,就没办法用到 uiautomator 以及 accessibility_id。
所以在移动端当中代码:
from selenium.webdriver.common.by import By
要改成:
from appium.webdriver.common.mobileby import MobileBy
再也不需要用By了,By有的id、class,它都有的。所以,在这个地方要等到这个id出现,那就是:
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,'com.huyu.yuncaidian:id/id_text')))
这个是打开 app 之后一定要做的等待工作。
4.如果是欢迎页面,没有这种元素怎么办?
如果默认进入的就是欢迎界面,要我们左滑右滑的这种,那就sleep,因为你没有可识别的元素。
通过 Activity 的名字来识别没有用,因为它也叫 Activity。

可以找到,但是不代表这个东西出来了。
如果有明确元素的时候,就不要用time.sleep了。就等到元素出现,再去操作元素。
这个元素定位和 Web 元素定位一样的,有多种方式。
安卓和 ios 的手机屏幕有大小的限制,所以一个页面当中元素不会太多,也不会很密密麻麻。因为它需要你不但要能看得清楚还能用手点得着。所以它会做的格局上面内容偏少,间距也会比较大。
点击“我的”后,页面内容切换。页面内容切换,你就要等,它也是要加载时间的。
三、打开 app 并登录
# 某app 2.9.0准环境
from appium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy
desired_caps={}
# 平台类型
desired_caps["platformName"]="Android"
# 平台版本号
desired_caps["platformVersion"]="7.0"
# 设备名称
desired_caps["deviceName"]="XPUDU17713003790"
# app 包名
desired_caps["appPackage"]="保密"
# app 入口 acitivity
desired_caps["appActivity"]="保密"
# 连接Appium server。前提:appium desktop要启动。有监听端口。
# 将desired_caps发送给appium server。打开app
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
# 运行代码之前:
#1.appium server启动成功。处于监听状态
#2.模拟器/真机必须能够被电脑识别。即adb devices能够识别到要操作的设备。
# 点击“我的”
time.sleep(5)
# 元素定位-组合定位方式
driver.find_element_by_xpath("//*[@resource-id='com.tfffc.cf:id/id_text' and @text='我的']").click()
#点击手机密码登录
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,'com.tfffc.cf:id/tv_phone_passwad')))
driver.find_element_by_id('com.tfffc.cf:id/tv_phone_passwad').click()
#输入用户名、密码、点击登录按钮
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,'com.tfffc.cf:id/editview_phone')))
driver.find_element_by_id('com.tfffc.cf:id/editview_phone').send_keys('输入手机号')
driver.find_element_by_id('com.tfffc.cf:id/editview_phone_password').send_keys('输入密码')
driver.find_element_by_id('com.tfffc.cf:id/phone_password_login').click()
四、移动端特有的操作
1.swipe 滑屏操作
Appium 的swipe函数是针对屏幕上的坐标来滑动的。
swipe函数是安卓和 IOS 两种设备同时通用。

从一个点滑到另外一个点,那么每个点都有 x 值和 y 值。swipe有 4 个参数。所以起始 x,起始 y,结束 x,结束 y。
2.如果写一个操作,所有的手机都能适用,是不是应该考虑屏幕的尺寸呢?
手机有 5 寸、4.4 寸、5.7 寸的。分辨率是 1280x700,所以它最大的坐标点就是 1280x700。不同的安卓厂商、不同的大小,它的分辨率都不一样,它的坐标值是绝对不一样的。
这个怎么办?怎么兼容下这个特征比较好?
不需要针对每个版型的手机写一段代码,全部通用。
用坐标有个缺陷:可能适用于某一种手机,换个手机就不行了,因为坐标值对不上。
3.有没有什么办法可以获取整个设备的尺寸大小?
直接获取下它的宽和高是多少。针对屏幕上的某个坐标点来滑动的,又不是针对某一个元素。整屏滑动就是左滑右滑,上滑下滑。
设置下滑动的百分比,如果滑动40%-50%,感觉根本滑动不过去。如果能够获取到整屏的大小,按百分比来滑动,滑动的距离在70%-90%,那肯定就能滑过去了。
根据每个手机的 x 轴和 y 轴,确定它的滑屏百分比,那随便什么样的手机都是可以滑屏的。所以在实现这个滑屏的时候,首先获取屏幕的size。
4.屏幕的 size 怎么获取呢?
有个专门的函数:
get_window_size 返回窗口的宽和高。

get_window_size()这个函数的返回值:
返回的是个字典。

5.这个东西想一口气把它滑过来,不能出现滑动到半路上又回去了。如果我要从右边滑到左边,起点和终点怎么选?
swipe有 2 个坐标点,首先要得到start_x。
x 轴是width。size['width']是 x 轴的最大值。
所有人的使用习惯: 滑屏都是在正中间滑屏或者稍微偏下一点。从一个页面滑动到另外一个页面,y 轴没有变化。
所以 y 值是固定的,就取个中间值 0.5:
#height、width
size= driver.get_window_size()
start_x=size['width']*0.9
start_y=size['height']*0.5
滑动的间距最好是达到 80%以上,这样写,间距就是 0.8 了:
#height、width
size= driver.get_window_size()
start_x=size['width']*0.9
start_y=size['height']*0.5
end_x=size["width"]*0.1
swipe还有个参数叫做duration(时长),这个单位是毫秒。
6.准备花多长时间去滑动呢?
看过手机的操作,如果滑动的太快了,根本没有效果。有的时候滑动的太快了,它还没来得及响应就结束了。所以可以设置下duration(时长),放缓一点呢,相对来说更稳定些。
向上向下滑动的时候,start_x 是?
上下滑动,x 轴不变,x 轴同样取中间值。但是 y 轴从下往上,值越来越小。
这个可以把它封装起来,以后需要的时候直接调用就好了,随便什么设备都是一样的。如果webdriver中有些方法标明了仅仅是 ios 或者安卓,那就只能在对应的平台上使用。
如果一个函数并没有说明,那么就是大家一起用的,不分彼此。
#height、width
size= driver.get_window_size()
start_x=size['width']*0.9
start_y=size['height']*0.5
end_x=size["width"]*0.1
end_y=size['height']*0.5
#从右向左滑
driver.swipe(start_x,start_y,end_x,end_y,200)
#从左向右滑
driver.swipe(end_x,end_y,start_x,start_y,200)
#向下滑动
#向上滑动:x轴不变,y从大到小
driver.swipe(size["width"]*0.5,size["heigth"]*0.9,size["width"]*0.5,size["heigth"]*0.1)
#向上滑动:x轴不变,y从小到大
driver.swipe(size["width"]*0.5,size["heigth"]*0.1,size["width"]*0.5,size["heigth"]*0.9)
公众号清菡软件测试首发,更多原创文章:清菡软件测试 94+原创文章,欢迎关注、交流,禁止第三方擅自转载。

感谢支持清菡原创,欢迎点击在看和转发!
Appium常用操作之「元素定位、swipe 滑屏操作」的更多相关文章
- Appium常用的3种元素定位方式
以最右App为例 .apk文件网盘地址: 链接:https://pan.baidu.com/s/1L4MYkhpb5ECe8XeaneTx_Q 提取码:0jqm 1.find_element_by_i ...
- Appium + python - swipe滑屏操作实例
方法一: from appium import webdriverfrom time import sleep descred_caps = { "platformName":&q ...
- Appium移动自动化测试(三)之元素定位
实验简介 做过UI自动化(web自动化, 移动自动化)的同学都会知道, 除去框架的选型和搭建以外, 落到实处的对元素进行定位就成了最重要的技能. 做过UI自动化的同学会知道, 对页面元素的定位方式有8 ...
- Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载
元素定位及其他操作 0.常见的识别元素的方法是什么? driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...
- selenium(5):常用的8种元素定位
selenium的webdriver提供了18种(注意不是8种)的元素定位方法,比较常用的定位方法是如下8种,xpath和css定位更加灵活,需要重点掌握其中一个. 经常会用到的8种定位:1.id定位 ...
- (appium+python)UI自动化_03_元素定位工具
前言 在UI自动化过程中,需要对手机app上的元素进行定位,然后进一步编写自动化脚本操作app.定位元素首先需要定位工具来辅助查看页面元素.小编常用的定位工具有2种,分别是uiautomatorvie ...
- Appium移动端自动化测试之元素定位(三)
1.name定位 driver.find_element_by_id(') driver.find_element_by_id(') driver.find_element_by_name('登录') ...
- python中通过selenium简单操作及xpath元素定位&轴定位
浏览器的简单操作 # 导入webdriver模块 # 创建driver对象,指定Chrome浏览器 driver = webdriver.Chrome() # 窗口最大化 driver.maximiz ...
- Appium移动自动化测试(四)之元素定位
做过UI自动化测试的童鞋都会发现, 在上一篇文章中居然没有万能定位方式Xpath. 是滴, 确实没有! ADT自带的uiautomatorviewer里面并没有属性xpath, 如果我们需要的话,还需 ...
随机推荐
- 关于sqlmap当中tamper脚本编码绕过原理的一些总结(学习python没多久有些地方肯定理解有些小问题)
sqlmap中tamper脚本分析编写 置十对一些编码实现的脚本,很多sqlmap里面需要引用的无法实现,所以有一部分例如keywords就只写写了几个引用了一下,其实这里很多脚本运用是可以绕过安全狗 ...
- PHP审计基础
php核心配置 register_globals 全局变量注册开关 设置为on时,把GET/POST的变量注册成全局变量 PHP 5.4.0中移除 allow_url_include 包含远程文件 设 ...
- Laver 文件版本遍历器
系统简介 最近有个需求,需要罗列出各个目录中文件的信息,检索各类文件的最新版本.网上看了很多方式,但发现没有合适的.于是利用空余时间开始编写了一套文件遍历系统,如此便有了Laver(紫菜).Laver ...
- Artwork (Gym - 102346A)【DFS、连通块】
Artwork (Gym - 102346A) 题目链接 算法 DFS,连通块 时间复杂度:O(k*n + k * k) 1.这道题就是让你判断从(0,0)到(m,n),避开中途所有的传感器(传感器的 ...
- Python-如何在一个for循环中迭代多个可迭代对象?
案例: 某班学生期末考试成绩,语文.数学.英语分别存储在3个列表中,同时迭代三个列表.,计算每个学生的总分(并行) 某年级有4个班,某次英语成绩分别记录在4个列表中,依次迭代每个列表,统计全年级高于9 ...
- 关于Python中以字母r,或字母u 开头的字符串
(1)以r或R开头的Python中的字符串表示(非转义的)原始字符串 python里面的字符,如果开头处有个r,比如: (r'^time/plus/\d{1,2}/$', hours_ahead) ...
- HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 02
工具1:HBuilder X 1.9.9.20190522 工具2:火狐浏览器 67.0.4 (64 位) 其实,我想使用表格,做一个这样的颜色表,如下图所示: 例 3:我们参照上图,基于上一个例子, ...
- 用于ASP.net的MVC模块
下载MVCBricks_SRC - 492.58 KB 表的内容 介绍系统要求游戏闪屏的最终考虑历史 介绍 自从我写上一篇关于ASP的文章以来,已经有很长时间了.净的话题.这次我决定写一些关于它的东西 ...
- devops-jenkins-Pipeline基础语法
1. jenkins-Pipeline基础语法 1) jenkins-Pipeline总体介绍 • Pipeline,简而言之,就是一套运行与jenkins上的工作流框架,将原本独立运行于单个或多个 ...
- Docker学习:(一)初识Docker
Docker(容器虚拟化技术)要点(秒级启动) Docker的WWH公式学习 What[是什么]. Why[为什么要用它]. How[怎么用] 1.Docker简介 (1)问题:为什么会有docker ...