Appium 使用 tap 方法操作元素

发表于:2019-7-17 13:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Longtimeno_fedb    来源:简书

#
Appium
分享:
  前面讲解的例子中,我们已经学习过对元素的输入和点击操作了。分别通过对 WebElement 对象调用 send_keys 和 click 方法。这些都是最长用的。现在我们再讲一个新的操作界面元素的方法。
   tap
  tap 方法和 click 类似,都是点击界面。但是最大的区别是,tap 是针对做坐标而不是针对找到的元素。有的时候,我们难以用通常的方法定位元素的时候,可以用这个 tap 方法。看一个例子,打开开发者头条点击我的,界面如下:
  既然 tap 是坐标用来点击界面的,我们怎么知道这个元素的坐标呢?大家还记得元素的 bounds 属性吗?它是标识元素的左上角和右下角坐标的,那么我们点击该元素的时候,最好点击它的中间部位。可以通过左上角、右下角坐标估算出中间部分的坐标。左上角和右下角的 X 坐标加起来除以2就是它中心点的 X 坐标,左上角和右下角的 Y 坐标加起来加起来除以2就是它中心点的 Y 坐标。
  还有一种简单的方式不需要计算,就是没必要非要往中心靠,中心点没有必要那么中心,我们手指点击的时候也不是每次都是中心,大差不差就行了,这个点我们可以直接获取到。有一个地方可以直接看到坐标。
  就是随着你光标在动的时候,数值会在变,它就是你光标所在位置的坐标。所以我们这里如果想要获取到中心点,只要手表停在上面就可以,大概是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 方法的描述。
  我们可以看到它有两个参数,第一个参数是 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()
  
      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号