美文网首页
[AP_08] Appium元素定位01:id定位&检测元素存在

[AP_08] Appium元素定位01:id定位&检测元素存在

作者: Fighting_001 | 来源:发表于2019-05-19 17:15 被阅读0次

    目录结构

    一、Appium元素定位概述
        1. 元素定位
        2. id定位
        3. 元素定位:id定位测试场景
        4. 检测定位元素的存在性
    二、id定位综合实践:自动登录APP
    

    一、Appium元素定位概述

    1. 元素定位

    同Web自动化测试(如:Selenium+Python)类似,APP自动化测试(如:Appium+Python)过程中最重要的一个环节就是元素定位,只有准确定位到元素才能进行相关元素的操作(输入、点击、拖拽、滑动)

    对比参考:Selenium WebDriver定位元素的9种方式及操作

    appium提供了元素定位的多种方法:id定位、name定位、class定位、层级定位...

    元素定位方式

    • id定位
    • name定位
    • class定位
    • List定位
    • 相对定位
    • Xpath定位
    • H5页面元素定位
    • UIAutomator定位

    2. id定位

    在app界面元素中,可使用id值来区分不同的元素,然后进行定位操作。Appium可使用find_element_by_id()方法进行id定位

    3. 元素定位:id定位测试场景

    测试场景:
    (1)安装指定APP到移动设备中
    (2)在升级提示页面点击【取消升级】按钮(旧版本才会出现此页面,最新版本无此验证)
    (3)在引导页面点击【跳过】按钮(首次启动APP才会出现此页面,再次启动则不会出现)

    kaoyan_skip_cancel.py

    from appium import webdriver
    
    # 定义字典,存储capabilities配置信息
    desired_caps={}
    
    # 移动设备信息-1(Android模拟器)
    desired_caps['platformName']='Android'
    desired_caps['deviceName']='127.0.0.1:62001'
    desired_caps['platformVersion']='5.1.1'
    
    # 移动APP应用信息
    desired_caps['app']=r'C:\Users\Administrator\Desktop\kaoyanbang_3.3.7beta.243.apk'
    desired_caps['appPackage']='com.tal.kaoyan'
    desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
    
    # 连接远程服务器,监听端口,开启会话
    driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
    driver.implicitly_wait(10)  # 等待时间
    
    # 点击升级【取消】按钮,不作APP升级
    driver.find_element_by_id('android:id/button2').click()
    # 点击【跳过】按钮,直接进入登录界面
    driver.find_element_by_id('com.tal.kaoyan:id/tv_skip').click()
    

    定位方式:
    在已连接移动设备的基础之上,利用UI Automator进行元素定位,也可使用Appium的Inspector定位元素,但不建议2个工具同时启用定位,有可能会引起冲突or异常

    定位操作:
    连接Android模拟器:adb connect 127.0.0.1:62001
    检查当前连接的设备:adb devices

    方式①:UI Automator定位元素

    方式②:Appium启动Inspector后利用Select Elements定位元素

    4. 检测定位元素的存在性

    from appium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    import time
    
    # 定义字典,存储capabilities配置信息
    desired_caps={}
    # 移动设备信息(Android模拟器)
    desired_caps['platformName']='Android'
    desired_caps['deviceName']='127.0.0.1:62001'
    desired_caps['platformVersion']='5.1.1'
    
    # 移动APP应用信息
    desired_caps['app']=r'C:\Users\Administrator\Desktop\kaoyanbang_3.3.7beta.243.apk'
    desired_caps['appPackage']='com.tal.kaoyan'
    desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
    
    # 连接远程服务器,监听端口,开启会话
    driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
    # driver.implicitly_wait(50)  # 等待时间(隐式)
    time.sleep(50)
    
    # 定义点击取消升级按钮的方法
    def check_cancelBtn():
        print('check cancel Button')
        try:
            cancelBtn=driver.find_element_by_id('android:id/button2')
        except NoSuchElementException:
            print('no cancel button')
        else:
            cancelBtn.click()
    
    # 定义点击跳过引导页的方法
    def check_skipBtn():
        print('check skip Button')
        try:
            skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
        except NoSuchElementException:
            print('no skip button')
        else:
            skipBtn.click()
    
    # 调用函数
    check_cancelBtn()
    check_skipBtn()
    

    执行结果:

    以上,安装的是最新版本的被测APP,故没有捕获到取消升级的提醒元素,而捕获到了跳过引导页的元素并点击实现页面跳过,直接进入到登录界面
    PS:在Android模拟器上执行代码前,根据需要可能先要删除已安装的被测APP、Appium settings

    二、id定位综合实践:自动登录APP

    场景描述:

    (1)启动App,进入到登录界面
    (2)在登录界面输入[用户名+密码],然后点击登录

    需求分析:
    1. 将启动后检测升级弹窗、跳出引导页面,作为独立的模块进行抽离,让其他模块来调用,从而提高代码复用率
    2. 获取用户名和密码输入框、登录按钮所对应的元素id属性。另外要考虑启动时App之前是否有登录过账号,已登录过和从未登录过对应的操流程是不一样的
      从未登录过被测APP:启动APP->点击【取消升级】->点击【跳过】->输入用户名+密码,点击【登录】按钮
      已有登录过被测APP:启动APP->点击【跳过】->点击【我的】->点击【未登录】->输入用户名+密码,点击【登录】按钮
    3. send_keys() 传入中文时需要在capability中配置如下内容:
    desired_caps['unicodeKeyboard']="True"
    desired_caps['resetKeyboard']="True"
    
    描述
    unicodeKeyboard 使用 Unicode 输入法。 默认值为 false
    resetKeyboard 在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。默认值为 false

    以上设置完成之后,会有Appium的输入法守护来执行输入操作

    代码实现:

    2个模块:capability.py、kaoyan_login.py(位于同一个目录之下)

    capability.py
    实现:capabilities配置、登录前的页面处理(取消升级、跳过引导页面)

    from appium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    
    # 定义字典,存储capabilities配置信息
    desired_caps={}
    
    # 移动设备信息(Android模拟器)
    desired_caps['platformName']='Android'
    desired_caps['deviceName']='127.0.0.1:62001'
    desired_caps['platformVersion']='5.1.1'
    # 设置键盘输入法Unicode格式
    desired_caps['unicodeKeyboard']='True'
    desired_caps['resetKeyboard']='True'
    # 重置登录状态(每次都需要输入[用户名+密码]登录)
    desired_caps['noReset']='False'
    # 移动APP应用信息
    desired_caps['app']=r'C:\Users\Administrator\Desktop\kaoyanbang_3.3.7beta.243.apk'
    desired_caps['appPackage']='com.tal.kaoyan'
    desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'
    
    # 连接远程服务器,根据配置开启会话
    driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
    driver.implicitly_wait(10)  # 等待时间(隐式)
    
    # 定义点击取消升级按钮的方法
    def check_cancelBtn():
        print('check cancel Button')
        try:
            cancelBtn=driver.find_element_by_id('android:id/button2')
        except NoSuchElementException:
            print('no cancel button')
        else:
            cancelBtn.click()
    
    # 定义点击跳过引导页的方法
    def check_skipBtn():
        print('check skip Button')
        try:
            skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
        except NoSuchElementException:
            print('no skip button')
        else:
            skipBtn.click()
    
    # 调用函数
    check_cancelBtn()
    check_skipBtn()
    

    kaoyan_login.py
    实现:引导进入登录界面,输入[用户名+密码],提交登录

    from capability import driver,NoSuchElementException
    
    # 定义登录方法
    def login():
        # 定位用户名输入框,清空输入框中的原有内容,再输入新的用户名
        username=driver.find_element_by_id('com.tal.kaoyan:id/login_email_edittext').clear()
        username.send_keys('xxxxx')
        # 定位密码输入框,输入密码
        password=driver.find_element_by_id('com.tal.kaoyan:id/login_password_edittext').send_keys('yyyyy')
        # 定位登录按钮,点击
        driver.find_element_by_id('com.tal.kaoyan:id/login_login_btn').click()
    
    # 设置已有登录的场景处理
    try:
        myBtn=driver.find_element_by_id('com.tal.kaoyan:id/mainactivity_button_mysefl') # 定位【我】按钮
        nonLg=driver.find_element_by_id('com.tal.kaoyan:id/activity_usercenter_username')   # 定位【未登录】按钮
    except NoSuchElementException:
        login()     # 没有获取到【我】【未登录】元素时,执行常规登录方法
    else:
        myBtn.click()   # 点击【我】按钮
        nonLg.click()   # 点击【未登录】按钮
        login() # 进入登录界面,调用常规登录方法执行登录
    

    执行命令:python kaoyan_login.py
    执行结果:自动登录OK

    相关文章

      网友评论

          本文标题:[AP_08] Appium元素定位01:id定位&检测元素存在

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