app屏幕滑动定位(swipe方法)
swipe语法:
Swipe(int start x,int start y,int end x,int y,time)#参数的个数根据实际情况使用
解释:
int start x-开始滑动的x坐标,
int start y -开始滑动的y坐标。
int end x -结束点x坐标,
int end y -结束点y坐标。
time 滑动时间(默认5毫秒)
给swipe指定坐标,因为每个手机的屏幕分辨率不一样,指定一个固定的坐标,并不是适用所有手机,所以这里可以通过获取手机屏幕坐标实现,提升代码重用。
python-appium手机自动测试如何实现滑动呢,在webdriver 的api中只提供了指定两个坐标的滑动,但不同的手机分辨率不同,这样写出来的自动化脚本兼容性就不是那么好了。。那么怎么实现滑动呢,仔细看了下webdriber中的方法,发现有个方法get_window_size() ,这个方法可以获得手机的宽度和高度,这样我们就可以实现按屏幕比率滑动了。。具体方法如下:
首先我们给定固定三个参数:0.5 0.25 0.75,(参数合理就好)因为不管向上向下还是向左向右滑,他们的参数都在由大到小变化或者由小到大的变化
理解下下面的图:
1、屏幕的坐标图,向上滑动屏幕就是x轴不变,y轴由大到小的变化过程:图来解释,这个时候屏幕坐标肯定是比原来屏幕1,3坐标小,因为屏幕在往上滑
2、屏幕的坐标图,向下滑动屏幕就是x轴不变,y轴由小到大的变化过程
3、屏幕的坐标图,向左滑动屏幕就是y轴不变,x轴由大到小的变化过程
4、屏幕的坐标图,向右滑动屏幕就是y轴不变,x轴由小到大的变化过程
图的理解:当前屏幕的参数跟着当前滑动屏幕的参数走,在屏幕滑动时在屏幕上下选个参考物做讲解
来区分上下滑
size = driver.get_window_size()
print(size)
#获取屏幕的大小{'width': 720, 'height': 1280}
源码如下:
#defgetSize():获取机器屏幕大小
#def
swipeup(t):屏幕向上滑动,x1为x轴坐标,y1起始的y轴坐标,y2结束的y轴坐标
# x1 =int(l[0] *0.5):l是上面函数中返回的屏幕大小,0和1其实是索引位,0代表x值,1代表y的值
defgetSize():
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return(x, y)
#屏幕向上滑动(代码里把注释去掉)
defswipeup(t):
l = getSize()
x1 =int(l[0] *0.5)
y1 =int(l[1] *0.75)
y2 =int(l[1] *0.25)
driver.swipe(x1, y1, x1, y2, t)
sleep(6)
swipeup(1000)
#屏幕向下滑动
defswipedown(t):
l = getSize()
x1 =int(l[0] *0.5)
y1 =int(l[1] *0.25)
y2 =int(l[1] *0.75)
driver.swipe(x2, y1, x1, y1, t)
sleep(6)
swipedown(1000)
#屏幕向左滑动
def swipLeft(t):
l=getSize()
x1=int(l[0]*0.75)
y1=int(l[1]*0.5)
x2=int(l[0]*0.25)
driver.swipe(x1,y1,x2,y1,t)
#屏幕向右滑动
def swipRight(t):
l=getSize()
x1=int(l[0]*0.25)
y1=int(l[1]*0.5)
x2=int(l[0]*0.75)
driver.swipe(x2,y1,x1,y1,t)
===============================================================
案例(1):模板百度阅读中,向左移动两次
from appium import webdriver from bbbb.roll import * caps = { "platformName": "Android", "deviceName": "127.0.0.1:62001", "platformVersion": "4.4.w", "appPackage": "com.baidu.yuedu", "appActivity": "com.baidu.yuedu.splash.SplashActivity" } driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps) sleep(8) # 取消更新 driver.find_element_by_id("com.baidu.yuedu:id/negativeUpgrade").click() sleep(4) driver.find_element_by_id('com.baidu.yuedu:id/righttitle').click() #点击图书 sleep(8) #向右移动一次 size = driver.get_window_size() x1 = size.get("width") * 0.9 x2 = size.get("width") * 0.1 y = size.get("height") * 0.5 driver.swipe(x1, y, x2, y, duration=1000) #向右移动一次 size = driver.get_window_size() x1 = size.get("width") * 0.9 x2 = size.get("width") * 0.1 y = size.get("height") * 0.5 driver.swipe(x1, y, x2, y, duration=1000)
==============================================================
案例(2):模板百度阅读中,封装在调用向上滑,向下滑,向左滑,向右滑
写在两个模块中:
aa模块:
from appium import webdriver from bbbb.bb import * caps = { "platformName": "Android", "deviceName": "127.0.0.1:62001", "platformVersion": "4.4.w", "appPackage": "com.baidu.yuedu", "appActivity": "com.baidu.yuedu.splash.SplashActivity" } driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps) sleep(8) # 取消更新 driver.find_element_by_id("com.baidu.yuedu:id/negativeUpgrade").click() sleep(4) driver.find_element_by_id('com.baidu.yuedu:id/righttitle').click() #点击图书 sleep(8) rollUp(driver, 2) rollDown(driver, 2) rollLeft(driver, 3) rollRight(driver, 3)
bb模块(封装滑动方法)
from time import sleep # 左滑 def rollLeft(driver, t=1): for i in range(t): size = driver.get_window_size() x1 = size.get("width") * 0.9 x2 = size.get("width") * 0.1 y = size.get("height") * 0.5 driver.swipe(x1, y, x2, y, duration=1000) sleep(2) # 右滑 def rollRight(driver, t=1): for i in range(t): size = driver.get_window_size() x1 = size.get("width") * 0.1 x2 = size.get("width") * 0.9 y = size.get("height") * 0.5 driver.swipe(x1, y, x2, y, duration=1000) sleep(2) # 上滑 def rollUp(driver, t=1): for i in range(t): size = driver.get_window_size() x = size.get("width") * 0.5 y1 = size.get("height") * 0.9 y2 = size.get("height") * 0.2 driver.swipe(x, y1, x, y2, duration=1000) sleep(2) # 下滑 def rollDown(driver, t=1): for i in range(t): size = driver.get_window_size() x = size.get("width") * 0.5 y1 = size.get("height") * 0.2 y2 = size.get("height") * 0.9 driver.swipe(x, y1, x, y2, duration=1000) sleep(2)
=================================================================================
案例3:根据坐标定位
tap是模拟手指点击页面元素
语法有两个参数,第一个是positions,是list类型最多五个点,duration是持续时间,单位是毫秒
缺点:
tap方法:通过坐标定位是元素定位的下下下策,实在没办法才用这个,不同的手机分辨率不同,因此适用性不强,这个坐标就不能写死,得算出所在屏幕的比例。
driver.tap([坐标],持续点击时间)
[55,741][665,801]
案例:百度阅读【取消按钮】
坐标:bounds :[55,741][665,801] #第一个坐标值可以定位到,第二个坐标值定位就报错,不超出长度;
driver.tap(driver.tap([(55,741)],2)) #坐标x1,y1
driver.tap(driver.tap([(55,741),(665,801)],500))
错误写法:driver.tap(driver.tap(55,741)
代码:
======================================================================
tap详解:
def __init__(self, driver):
self.driver = driver
# 获取屏幕的 size
self.size = driver.get_window_size()
# 获取屏幕宽度 width
self.width = self.size['width']
# 获取屏幕高度 height
self.height = self.size['height']
# 坐标定位、点击长按通用,调试机型屏幕分辩2280*1080,只适配全面屏、2K
# 注意全面屏与有底部导航的分辨率不一样,要考虑Y轴的底部导航,[(x,y),z],z:持续时间
def driverTap(self, x, y, z=None):
self.driver.tap([((x / 1080) * self.width, (y / 2280) * self.height)], z)def __init__(self,driver):
self.driver = driver
# 获取屏幕的 size
self.size = driver.get_window_size()
# 获取屏幕宽度 width
self.width = self.size['width']
# 获取屏幕高度 height
self.height = self.size['height']
# 坐标定位、点击长按通用,调试机型屏幕分辩2280*1080,只适配全面屏、2K
# 注意全面屏与有底部导航的分辨率不一样,要考虑Y轴的底部导航,[(x,y),z],z:持续时间
def driverTap(self,x,y,z=None):
self.driver.tap([((x/1080)*self.width,(y/2280)*self.height)],z)
======================================================================================