一、滑屏操作 不需要看到欢迎页面,直接做里面的后续操作就好了。也就是我想记住一些用户的习惯,不要像第一次访问一样,有一个重置与否,给它关闭了。重置与否desiredcaps〔noReset〕True1。访问之后,马上就滑屏可以吗? 不可以。先等待首页有个元素出现,再去滑屏。滑屏操作需要时间,模拟器或者真机执行操作更需要时间。如果直接滑动2次,第一次滑动效果还没展示出来就直接滑动第二次了,就会看到看不懂得现象。所以这种情况下就要加上time。2。连续实现2次滑屏从右向左滑driver。swipe(startx,starty,endx,endy,200)time。sleep(1)driver。swipe(startx,starty,endx,endy,200)3。代码微信app安卓fromappiumimportwebdriverimporttimefromselenium。webdriver。support。waitimportWebDriverWaitfromselenium。webdriver。supportimportexpectedconditionsasECfromappium。webdriver。common。mobilebyimportMobileBydesiredcaps{}平台类型desiredcaps〔platformName〕Android平台版本号desiredcaps〔platformVersion〕7。0设备名称desiredcaps〔deviceName〕XPUDU17713003790app包名desiredcaps〔appPackage〕com。tencent。mmapp入口acitivitydesiredcaps〔appActivity〕com。tencent。mm。ui。LauncherUI重置与否desiredcaps〔noReset〕Trueaaptdumpbadging包名连接Appiumserver。前提:appiumdesktop要启动。有监听端口。将desiredcaps发送给appiumserver。打开appdriverwebdriver。Remote(http:127。0。0。1:4723wdhub,desiredcaps)ANDROIDUIAUTOMATOR这个是一种定位表达式,用其它的表达式也是可以的。loc(MobileBy。ANDROIDUIAUTOMATOR,newUiSelector()。text(通讯录))WebDriverWait(driver,30)。until(EC。visibilityofelementlocated(loc))height、widthsizedriver。getwindowsize()startxsize〔width〕0。9startysize〔height〕0。5endxsize〔width〕0。1endysize〔height〕0。5从右向左滑时间长短需要根据实际情况自己来调试,避免没滑过去,代码就执行完毕了。driver。swipe(startx,starty,endx,endy,300)time。sleep(2)driver。swipe(startx,starty,endx,endy,300)二、模拟触屏 滑屏也是触屏实现的。手指在屏幕上点点点,在Appium中提供了专门的TouchAction类来做这件事。 Press、longPress和release组合起来使用的。长按和短按的时间长度不同。 moveto手按住别松开,一直滑动到另外一个点。在每一个操作之间都调用下wait,暂缓下它们的操作间隙,不然太快了,看起来就是一团乱麻。1。短按和点击的区别? 短按是按住不松开,但是时间比较短。tap是点完就松开,不需要组合别的一起用。有Press就必须有release,不然就一直按着上面动都不动了。 发送命令后,只有调用perform才能真的去执行些操作命令,否则是不行的。 将所有的行为按要求放在列表中,可以将列表中所有的东西取消cancel。 滑屏操作是在屏幕上按住一个点,然后滑动到另外一个点,最后把它松掉。 九宫格就是个典型的触屏应用。 2。用坐标还是元素? 元素方便简单,但是不是你想选就一定是哪一种。一种情况,9个点都是独立的元素,那么用元素就可以了;第二种情况,9个点都在一个元素里面怎么办?就没有办法实现元素的移动,因为就一个元素。这个时候就必须要用坐标。 坐标需要精确定位。需要思考每个坐标之间的关系。3。引入TouchAction fromappium。webdriver。common。touchactionimportTouchActionTouchAction的源码: 4。每个行为函数都有3个参数 swipe滑屏操作是没有元素的,针对的是整个屏幕。屏幕的话就只能通过坐标点。所以你看swipe的源码就可以看到。看下swipe的实现源码:actionTouchAction(self)首先实例化TouchActionaction。press(xstartx,ystarty)。wait(msduration)。moveto(xendx,yendy)。release()action。perform()returnself 现在是它帮你封装好了。实际上不用swipe,就用TouchAction自己去写都可以。 xendx,yendy,没有用el。5。首先确定每一个点的位置选择一个元素上的坐标,大概会选哪个位置的? 中心。 坐标轴写错了一点,偏移了点,好歹也是在范围之内。如果选择边缘的点,偏了点可能就出不去了。所以,一般选一个元素的坐标,尽量选择中心。每个点之间的间隔是一样的。从一个点挪到另外一个点,y轴不用动,x轴只要有个固定的距离就好了。 例如3个点的值是:147。376、359。378、571。378能把这3个值直接这样写出来吗? 不能。换台设备就不行了,这样绝对的数据是不能放在这里的。采用和滑屏操作一样的思想,用百分比和相对距离。如果能获取到元素的大小以及起点坐标就可以了。 距离是59。1475988 可以估算一下: 如果是长方形那就需要另外再算,但是图中是正方形,这9个格子的间距是没有什么区别的,重点是它与边界值的差距。边界值的差距是多少? 把它分成6份。第一个点的坐标:能够得到view的起点坐标是45,272。有专门的函数可以获取元素的大小以及它的起点坐标。 假设起点坐标是x、y,我现在已经知道将它分成了6份。那么,第一个点的坐标怎么写? xwidth16height16看size源码: 看location源码: 元素的大小sizeele。size均分的步长高和宽一样(因为是正方形)stepsize〔width〕6py3中除是取整数的,会缺点小数点没关系。取得是终点,问题不大,还是可以滑动到的。元素的起点坐标左上角oriele。locationpoint1(ori〔x〕step,ori〔y〕step)TouchAction(driver) 等于横向走了这么远,纵向也走了这么远,刚好对着这个点了。 第二个点的坐标怎么算? 基于第一个点的基础上做调整就行了。y轴不变,x轴往前走了2份。 第3个点也是在第2个点的基础上往前挪动了2个。元素的大小sizeele。size均分的步长高和宽一样(因为是正方形)stepsize〔width〕6py3中除是取整数的,会缺点小数点没关系。取得是终点,问题不大,还是可以滑动到的。元素的起点坐标左上角oriele。locationpoint1(ori〔x〕step,ori〔y〕step)point2(point1〔0〕step2,point1〔1〕)x轴增加了2steppoint3(point2〔0〕step2,point2〔1〕)x轴增加了2stepTouchAction(driver) 第4个点的坐标: 它是倒着往回走。 第5个点的坐标。元素的大小sizeele。size均分的步长高和宽一样(因为是正方形)stepsize〔width〕6py3中除是取整数的,会缺点小数点没关系。取得是终点,问题不大,还是可以滑动到的。元素的起点坐标左上角oriele。locationpoint1(ori〔x〕step,ori〔y〕step)point2(point1〔0〕step2,point1〔1〕)相对于point1,x轴增加了2steppoint3(point2〔0〕step2,point2〔1〕)相对于point2,x轴增加了2steppoint4(point3〔0〕step2,point3〔1〕step2)相对于point3,x轴减少了2step,y轴增加了2steppoint5(point4〔0〕,point4〔1〕step2)相对于point4,x轴不变,y轴增加了2stepTouchAction(driver)。press(xpoint1〔0〕,ypoint1〔1〕)。wait(200)。moveto(xpoint2〔0〕,ypoint2〔1〕)。wait(200)。moveto(xpoint3〔0〕,ypoint3〔1〕)。wait(200)。moveto(xpoint4〔0〕,ypoint4〔1〕)。wait(200)。moveto(xpoint5〔0〕,ypoint5〔1〕)。wait(200)。release()。perform()。是换行用的。 以1个点做基准,针对不同的点做基准,容易把自己绕晕了。所以,都以前一个点做基准。也可以以起点作为基准。6。代码fromappiumimportwebdriverimporttimefromselenium。webdriver。support。waitimportWebDriverWaitfromselenium。webdriver。supportimportexpectedconditionsasECfromappium。webdriver。common。mobilebyimportMobileByimporttimefromappium。webdriver。common。touchactionimportTouchActiondesiredcaps{}平台类型desiredcaps〔platformName〕Android平台版本号desiredcaps〔platformVersion〕7。0设备名称desiredcaps〔deviceName〕XPUDU17713003790app包名desiredcaps〔appPackage〕填上appPackageapp入口acitivitydesiredcaps〔appActivity〕填上appActivity重置与否desiredcaps〔noReset〕True连接Appiumserver。前提:appiumdesktop要启动。有监听端口。将desiredcaps发送给appiumserver。打开appdriverwebdriver。Remote(http:127。0。0。1:4723wdhub,desiredcaps)eledriver。findelementbyid(填上元素定位下吧,如果你app这里的元素定位不了,那就只能用坐标了,需要另外学习这块的坐标怎么写,呜呜)元素的大小sizeele。size均分的步长高和宽一样(因为是正方形)stepsize〔width〕6py3中除是取整数的,会缺点小数点没关系。取得是终点,问题不大,还是可以滑动到的。元素的起点坐标左上角oriele。locationpoint1(ori〔x〕step,ori〔y〕step)point2(point1〔0〕step2,point1〔1〕)相对于point1,x轴增加了2steppoint3(point2〔0〕step2,point2〔1〕)相对于point2,x轴增加了2steppoint4(point3〔0〕step2,point3〔1〕step2)相对于point3,x轴减少了2step,y轴增加了2steppoint5(point4〔0〕,point4〔1〕step2)相对于point4,x轴不变,y轴增加了2stepTouchAction(driver)。press(xpoint1〔0〕,ypoint1〔1〕)。wait(100)。moveto(xpoint2〔0〕,ypoint2〔1〕)。wait(100)。moveto(xpoint3〔0〕,ypoint3〔1〕)。wait(100)。moveto(xpoint4〔0〕,ypoint4〔1〕)。wait(100)。moveto(xpoint5〔0〕,ypoint5〔1〕)。wait(100)。release()。perform()。是换行用的。三、注意 这里是V1。6。几的或V1。7。1,V1。7以前的,如果按上面代码的方式写坐标的话,会报错提示越界了。这个是版本差异引起的。需要看日志,日志中会告诉你,当前滑动的点是什么。 多看Appium中的日志,它会问你是el滑动还是坐标滑动? 坐标滑动会直接打印坐标值,看下坐标值超了就说明是有问题的。版本比较晚的应该都是绝对坐标。 实际上是不会越界的,那只因为用的相对距离来滑动的。moveto的每一个坐标点都是真实的绝对坐标。 用的当前元素的原坐标点加上移动的距离得到的是当前相对于整个屏幕左上角这个00的真实坐标值。 我现在用的坐标,但是有的版本的问题是: 它的moveto参数不是绝对坐标。而是相对于上一个点的移动距离。 比如第一个点,press是没有错的。用moveto的时候y没有动,x轴移动了2倍step。 如果是这种相对距离移动的话,要求x2step,没有坐标,y0。如果不是按这种风格写的,会报越界。 它拿着上一个点的坐标值加上x,y,得出来肯定超界了。因为代码里写的真实坐标,再加上x,第二个点可能没有越界,第三个点就越界了。 如果报越界错误,那么就改成相对坐标滑动一下,看看有没有报错。 Appium在不同的版本修复了不同的问题,但是修复的同时也可能出现不同的问题。