Appium Webdriver 的 swipe 方法

手机应用,最常见的操作之一就是滑动。我们做移动 app 测试的时候,经常需要滑动界面。怎么滑动界面呢? AppiumWebDriverswipe 方法,就提供了这个功能,我们来看一下这个方法的说明和参数:

image.png

前面4个参数 start_x,start_y,end_x,end_y 分别表示滑动的起始和终点位置的 x/y 坐标,第5duration 是滑动所耗费的时间(毫秒)。注意这个时间非常重要。时间短就表示滑动的很快。我们知道移动设备,在屏幕上滑动同样的距离,如果滑动很快和滑动很慢有什么区别?比如我们翻看新闻,滑动同样的距离。如果滑动很会出现屏幕上翻页的效果,而滑动很慢,则会移动固定的位置。

下面是华为应用市场 App 的例子。该 App 有一个广告轮播图,如下图黄色框中的区域。

image.png

我们现在要实现手指连续滑动该区域,实现不停翻看图片的动作。该区域对应界面元素它是有 idcom.huawei.appmarket:id/backPicture,我们可以通过其 bounds 属性或者移动鼠标光标大概估算出我们要滑动的点的坐标,代码如下:

from appium import webdriver
import time
import traceback

#准备自动化配置信息
desired_caps={
    #移动设备平台
    'platformName':'Android',
    #平台OS版本号,写整数位即可
    'plathformVersion':'9',
    #设备的名称--值可以随便写
    'deviceName':'test0106',
    #提供被测app的信息-包名,入口信息:
    #adb shell dumpsys activity recents | findstr intent={
    'appPackage':'io.manong.developerdaily',
    'appActivity':'io.toutiao.android.ui.activity.LaunchActivity',
    #确保自动化之后不重置app
    'noReset':True,
    #设置session的超时时间,单位秒
    'newCommandTimeout':6000,
    #设置底层测试驱动-1.15默认使用的底层驱动就是UiAutomator2
    'automationName':'UiAutomator2',#或者UiAutomator1
    # 'skipServerInstallation':True#跳过UI2的安装,如果第一次运行程序,不要添加该配置
}

#初始化driver对象-用于控制手机-启动被测应用
#IP-appium-server所在机器的网络ip,port-监听的端口号,path固定/wd/hub
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
driver.implicitly_wait(20)#稳定元素

try:
    ele = driver.find_element_by_id(
        'com.huawei.appmarket:id/backPicture')

    time.sleep(3)
    for i in range(10):
        driver.swipe(start_x=560, start_y=340, end_x=130, end_y=340, duration=500)
        time.sleep(0.5)
except:
    print(traceback.format_exc())

input('**** Press to quit..')
driver.quit()

因为 y 坐标不变,这样就可以实现预期循环滑动10次的效果了。上面的的代码有个问题。如果屏幕分辨率不同,代码就不对了,比如同样的应用,在2K屏的手机上,坐标就不同了。所有一种解决方法是,动态获取元素坐标,而不是查看当前手机的固定坐标。怎么动态获取呢?根据元素的 location 属性,是个 dict,里面有两个key x y 保存了该元素的左上角坐标,但是这个例子里面我需要的右下角的坐标,怎么得到右下角的坐标呢?根据元素的 size 属性,是个 dict,里面有两个key :width,height 保存了该元素的宽、高就可以得到右下角的坐标。
改进代码如下:

ele = driver.find_element_by_id('com.huawei.appmarket:id/banner')
time.sleep(2)

location = ele.location
size1 = ele.size
print(location, size1)
x1 = location['x'] + int(size1['width'] * 0.8)
x2 = location['x'] + int(size1['width'] * 0.2)
y = location['y'] + int(size1['height'] * 0.5)

for i in range(10):
    driver.swipe(start_x=x1, start_y=y, end_x=x2, end_y=y, duration=500)
    time.sleep(0.5)

这样代码就健壮一些了,整体代码是

from appium import webdriver
import time
import traceback

desired_caps = {}
desired_caps['platformName'] = 'Android'  #测试平台
desired_caps['platformVersion'] = '7'   #平台版本,不能写错
desired_caps['deviceName'] = 'test'    #设备名称,多设备时需区分
# desired_caps['app'] = r'd:\apk\HiSpace.apk'  #app 文件 名,指定了要安装的app 在电脑上的路径
desired_caps['appPackage'] = 'com.huawei.appmarket'  #app package名,指定了要运行的app
desired_caps['appActivity'] = 'com.huawei.appmarket.MainActivity' #app默认Activity
desired_caps['unicodeKeyboard']  = True  # 一定要有该参数,否则unicode 输入的中文无效
desired_caps['noReset'] = True
desired_caps['newCommandTimeout'] = 60
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) #启动Remote RPC
driver.implicitly_wait(10)

try:

    ele = driver.find_element_by_id('com.huawei.appmarket:id/banner')
    time.sleep(2)

    location = ele.location
    size1 = ele.size
    print(location, size1)
    x1 = location['x'] + int(size1['width'] * 0.8)
    x2 = location['x'] + int(size1['width'] * 0.2)
    y = location['y'] + int(size1['height'] * 0.5)

    for i in range(10):
        driver.swipe(start_x=x1, start_y=y, end_x=x2, end_y=y, duration=500)
        time.sleep(0.5)

except:
    print(traceback.format_exc())

input('**** Press to quit..')
driver.quit()

可以拿去运行一下,记得改安卓的版本号。

操作不可见屏幕

比如说我们滑动安卓手机的屏幕,可以通过 driverget_window_size() 获取到获取全屏尺寸, get_window_size() 返回的是手机屏幕的宽度和高度,比如你要滑动这段距离,如图:

image.png

这个相当于全屏幕的,这个时候你可以把整个屏幕的分辨率获取,然后算出起始位置和结束位置。

screenSize = driver.get_window_size()
screenW = screenSize['width']
screenH = screenSize['height']

只提供方法,具体代码实现自己操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容