坚持原创输出,点击蓝字关注我吧

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


实现一个截屏(一般状况下这样用,能够截屏成功)。微信
2、Appium 经常使用操做
1.用 layui 作 app 元素定位的时候会报错怎么办?
建议不用 layui
。layui
在有些状况下定位元素是有问题的。在环境基本上是正确的状况下,它截图截不到。因此能够舍弃 layui
,直接用自带的 uiautomatorviewer
(如今拥有的定位方式,它所有都支持)。app
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
flex
不再须要用By
了,By
有的id、class
,它都有的。因此,在这个地方要等到这个id
出现,那就是:ui
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 的手机屏幕有大小的限制,因此一个页面当中元素不会太多,也不会很密密麻麻。由于它须要你不但要能看得清楚还能用手点得着。因此它会作的格局上面内容偏少,间距也会比较大。
点击“个人”
后,页面内容切换。页面内容切换,你就要等,它也是要加载时间的。
3、打开 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()
4、移动端特有的操做
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+原创文章,欢迎关注、交流,禁止第三方擅自转载。

感谢支持清菡原创,欢迎点击在看和转发!
本文分享自微信公众号 - 清菡软件测试(qinghanTester)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。