美文网首页工作生活
Appium 使用 tap 方法操作元素

Appium 使用 tap 方法操作元素

作者: 自如_ | 来源:发表于2019-07-05 10:41 被阅读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()
    

    相关文章

      网友评论

        本文标题:Appium 使用 tap 方法操作元素

        本文链接:https://www.haomeiwen.com/subject/upmrhctx.html