Appium 使用 tap 方法操作元素

前面讲解的例子中,我们已经学习过对元素的输入和点击操作了。分别通过对 WebElement 对象调用 send_keysclick 方法。这些都是最长用的。现在我们再讲一个新的操作界面元素的方法。

5.1 tap

tap 方法和 click 类似,都是点击界面。但是最大的区别是,tap 是针对做坐标而不是针对找到的元素。有的时候,我们难以用通常的方法定位元素的时候,可以用这个 tap 方法。看一个例子,打开开发者头条点击我的,界面如下:

image.png

既然 tap 是坐标用来点击界面的,我们怎么知道这个元素的坐标呢?大家还记得元素的 bounds 属性吗?它是标识元素的左上角和右下角坐标的,那么我们点击该元素的时候,最好点击它的中间部位。可以通过左上角、右下角坐标估算出中间部分的坐标。左上角和右下角的 X 坐标加起来除以2就是它中心点的 X 坐标,左上角和右下角的 Y 坐标加起来加起来除以2就是它中心点的 Y 坐标。

还有一种简单的方式不需要计算,就是没必要非要往中心靠,中心点没有必要那么中心,我们手指点击的时候也不是每次都是中心,大差不差就行了,这个点我们可以直接获取到。有一个地方可以直接看到坐标。

image.png

就是随着你光标在动的时候,数值会在变,它就是你光标所在位置的坐标。所以我们这里如果想要获取到中心点,只要手表停在上面就可以,大概是965,1845,对应的代码怎么是:

from appium import webdriver
 
desired_caps = {}
desired_caps['platformName'] = 'Android'  #测试平台
desired_caps['platformVersion'] = '7'   #平台版本,不能写错
desired_caps['deviceName'] = 'test'    #设备名称,多设备时需区分
# desired_caps['app'] = r'd:\apk\toutiao.apk'
desired_caps['appPackage'] = 'io.manong.developerdaily'  #app package名
desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity' #app默认Activity
# desired_caps['unicodeKeyboard']  = True  # 一定要有该参数,否则unicode 输入的中文无效
desired_caps['noReset'] = True
desired_caps['newCommandTimeout'] = 6000
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) #启动Remote RPC
driver.implicitly_wait(10)
print(driver.session_id)

# 等待界面出现
driver.find_element_by_class_name("android.widget.ImageButton")
# 点击 右下角 我的
driver.tap([(965,1845)],300)

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

这里点击就是用的 tap 方法,我们点进去看一下 tap 方法的描述。

image.png

我们可以看到它有两个参数,第一个参数是 positions 我们看一下它的描述。an array of tuples representing the x/y coordinates of the fingers to tap. Length can be up to five. 表示点击的坐标,注意最多可以有五个坐标,代表5根手指。所以是 list 类型。

第二个参数 duration我们看一下它的描述。(optional) length of time to tap, in ms按住停留的时间。

由于现在我们只要点击一个元素 list 中只要一个值(表示屏幕的一个点)就可以了。停留时间也可以比较短,所以这里取值是300,表示300毫秒也就是0.3

注意: 不到万不得已不要用 tap 方法,因为不同手机分辨率不同,同样的元素在不同手机的位置不同。

如果必须要用坐标的方式,又有多种手机要测试,你可以把当前要支持屏幕分辨率的坐标事先获取到。这些元素的坐标写到一个配置文件中 比如说要支持,打开开发者头条,首先点击+进入登录界面,进入之后点左下角的邮箱,再输入用户名密码,我们用坐标做怎么做呢?你不是要支持不同的屏幕吗?我有个配置文件,事先把不同屏幕分辨率烦人的手机坐标获取到,比如说1080P的手机和720p的手机,我们这里有个叫 cfg.py 的配置文件

coordinates = {
    '1080p':{
        '首页_+' :          (548, 1839),
        '登录页_邮箱图标' : (147, 1802),
        '登录页_邮箱地址' : (264, 370),
        '登录页_邮箱密码' : (264, 570),
        '登录页_登录按钮' : (264, 780),
    },

    '720p': {
        '首页_+': (640, 1250),
        '登录页_邮箱图标': (147, 1802),
        '登录页_邮箱地址': (264, 370),
        '登录页_邮箱密码': (264, 570),
        '登录页_登录按钮': (264, 570),
    }

}
cfg_phone_resolution = '1080p'

对应代码是

from appium import webdriver

desired_caps = {}
desired_caps['platformName'] = 'Android'  # 测试平台
desired_caps['platformVersion'] = '7'  # 平台版本,不能写错
desired_caps['deviceName'] = 'test'  # 设备名称,多设备时需区分
# desired_caps['app'] = r'd:\apk\toutiao.apk'
desired_caps['appPackage'] = 'io.manong.developerdaily'  # app package名
desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity'  # app默认Activity
desired_caps['unicodeKeyboard'] = True  # 一定要有该参数,否则unicode 输入的中文无效
desired_caps['noReset'] = True
desired_caps['newCommandTimeout'] = 6000
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)  # 启动Remote RPC
driver.implicitly_wait(10)
print(driver.session_id)

# 不得不用sleep
import time
time.sleep(10)

from cfg import cfg_phone_resolution,coordinates

coordinate = coordinates[cfg_phone_resolution]


driver.tap([coordinate['首页_+']], 300)
time.sleep(2)


driver.tap([coordinate['登录页_邮箱图标']], 300)
time.sleep(1)

driver.tap([coordinate['登录页_邮箱地址']], 300)
time.sleep(1)

# 没有WebElement对象 ,如何输入字符?
# adb shell input text "<your string>"

import os
os.system('adb shell input text "qqqqrss@163.com"')
#注意,如果要输入中文,需要下载一个adb键盘应用,
# 参考 https://blog.csdn.net/slimboy123/article/details/54140029

time.sleep(1)

driver.tap([coordinate['登录页_邮箱密码']], 300)
time.sleep(1)
os.system('adb shell input text "sdqwefsdf"')

driver.tap([coordinate['登录页_登录按钮']], 300)

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

推荐阅读更多精彩内容