工作生活

Appium 使用 tap 方法操作元素

2019-07-05  本文已影响0人  自如_

前面讲解的例子中,我们已经学习过对元素的输入和点击操作了。分别通过对 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()
上一篇下一篇

猜你喜欢

热点阅读