ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Appium常用操作之「元素定位、swipe 滑屏操作」

2021-07-23 14:01:35  阅读:253  来源: 互联网

标签:Appium swipe driver width 滑动 id 滑屏 size


目录
一、打开 uiautomatorviewe
二、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.准备花多长时间去滑动呢?

一、打开 uiautomatorviewe
用这个工具来给大家定位:在这里插入图片描述
在这里插入图片描述
实现一个截屏(通常情况下这样用,可以截屏成功)。

二、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 webdrive

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 返回窗口的宽和高。在这里插入图片描述
从一个点滑到另外一个点,那么每个点都有 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)

最后:【可能给予你一定的帮助】

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

关注我的微信公众号【软件测试小dao】免费获取~

我的学习交流群:644956177 群里有技术大牛一起交流分享~

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

标签:Appium,swipe,driver,width,滑动,id,滑屏,size
来源: https://blog.csdn.net/m0_57162664/article/details/119032391

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有