dcsxlh

导航

 

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)
======================================================================================
posted on 2020-12-30 20:27  多测师_肖sir  阅读(361)  评论(0编辑  收藏  举报