• python+appium【第五章-Appium初识】


    今天教大家如何针对app进行元素识别

    • 先了解一下appium的工作原理

    • 由上图可知:

    appium支持多语言,因为它针对流的几种语言分别开发的相应的appium库。好处就是我们可以选择自己熟悉的语言编写appium脚本
    appium支持多平台,包括MAC和Windows。它针对这两大平台开发了appium-Server
    appium又同时支持Android 和 iOS两个操作系统,这就可以应用分别不同的移动设备上,覆盖市场上的大部分移动设备机型。

    • appium配置连接参数

    那我们不多说废话了,直接开整,我这边连接的是真机,先查看一下设备的id

    可以发现当前的设备id : c6c8c4ce

    
    

    这个时候获取到了我们的设备id,接下来获取被测试的包名信息,通过反编译本地包的方法

    aapt dumpsys badging 本地apk包名的位置
    
    aapt dumpsys badging D:apkjisuanqi.apk

    获取到了包名:rock.Simple.Calculator

    活动入口名称:rock.Simple.Calculator.MainActivity


    
    
    

    拿到这两个参数之后,我们离成功就不远了,终点就在前方 ,我们来解析一下连接appium远程的一些参数

    # 首先要先下载 Appiunm-Python-Client 包
    
    from appium import webdriver # 引入webdriver方法
    
    
    des = {
    "automationName": "Appium", # 默认是配置appium
    "platformName": "Android", # 平台名称 ios/android/firefox Os
    "platformVersion": "8.1.0", # 安卓的版本
    "deviceName": "vivo x20", # 随便填 没关系
    "app": "D:apkjisuanqi.apk",
    "appPackage": "rock.Simple.Calculator", # 包名
    "appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口
    "udid": "c6c8c4ce", # adb连接的设备名称
    "noSign": True,
    "newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接
    }
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)

    配置完这些我们就打开我们的appium,启动一下服务

    服务启动完成



    然后运行代码,观察日志,观察手机,发现运行完成,成功打开

    
    
    • appium识别元素

    那我们现在会打开app了,那是不是就可以开始识别元素了呢? 对的,接下来教大家如何使用appium自带的元素识别工具

    1.点击这个小放大镜

    2.填入我们刚刚在代码里面的配置,不过不需要太多,只需要一下这些

     

    2.添加参数信息

     3. 然后点击start session,就会出现计算器的样子

    • appium元素定位

    • 先说说绝对定位,比如我们要定位到【8】这个元素,会发现他有6层 不着急我们一层一层的写

    from appium import webdriver
    
    des = {
        "automationName": "Appium",  # 默认是配置appium
        "platformName": "Android",  # 平台名称 ios/android/firefox Os
        "platformVersion": "8.1.0",  # 安卓的版本
        "deviceName": "vivo x20",  # 随便填 没关系
        "app": r"D:apkjisuanqi.apk",
        "appPackage": "rock.Simple.Calculator",  # 包名
        "appActivity": "rock.Simple.Calculator.MainActivity",  # 活动入口
        "udid": "c6c8c4ce",  # adb连接的设备名称
        "noSign": True,
        "newCommandTimeout": 30  # 30s没对手机发送新命令,就断开连接
    }
    
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)
    
    driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/'
                                 'android.widget.LinearLayout/android.widget.LinearLayout[2]/'
                                 'android.widget.LinearLayout[2]/android.widget.Button[2]').click()

    可以发现我们这边定位到了六层之后,他就会点击8,这里需要注意的是,开头为什么要用双斜杠?
    其实是因为它并不是顶级目录,上面还有一个目录,不信你可以自己试试去除双斜杠

    • 使用属性定位

    from appium import webdriver
    
    des = {
        "automationName": "Appium",  # 默认是配置appium
        "platformName": "Android",  # 平台名称 ios/android/firefox Os
        "platformVersion": "8.1.0",  # 安卓的版本
        "deviceName": "vivo x20",  # 随便填 没关系
        "app": r"D:apkjisuanqi.apk",
        "appPackage": "rock.Simple.Calculator",  # 包名
        "appActivity": "rock.Simple.Calculator.MainActivity",  # 活动入口
        "udid": "c6c8c4ce",  # adb连接的设备名称
        "noSign": True,
        "newCommandTimeout": 30  # 30s没对手机发送新命令,就断开连接
    }
    
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)
    
    driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/'
                                 'android.widget.LinearLayout/android.widget.LinearLayout[2]/'
                                 'android.widget.LinearLayout[2]/android.widget.Button[2]').click()
    
    # 使用text属性定位  '//属性值[@text=""]'
    driver.find_element_by_xpath('//android.widget.Button[@text="+"]').click()  # 点击+号
    # 使用resource-id  '//属性值[@resource-id=""]'
    driver.find_element_by_xpath('//android.widget.Button[@resource-id="rock.Simple.Calculator:id/six_btn"]').click()  # 点击6
    # 使用bounds
    driver.find_element_by_xpath('//android.widget.Button[@bounds="[807,1458][1029,1958]"]').click()  # 点击=
    # 当然还有很多的方式,可以自己查阅一下其他资料

    
    
    
     
    • 使用Xpath定位方法

    from appium import webdriver
    
    des = {
        "automationName": "Appium",  # 默认是配置appium
        "platformName": "Android",  # 平台名称 ios/android/firefox Os
        "platformVersion": "8.1.0",  # 安卓的版本
        "deviceName": "vivo x20",  # 随便填 没关系
        "app": r"D:apkjisuanqi.apk",
        "appPackage": "rock.Simple.Calculator",  # 包名
        "appActivity": "rock.Simple.Calculator.MainActivity",  # 活动入口
        "udid": "c6c8c4ce",  # adb连接的设备名称
        "noSign": True,
        "newCommandTimeout": 30  # 30s没对手机发送新命令,就断开连接
    }
    
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des)
    
    # # 以什么元素开头    '//类名[contains(@元素名,"内容")]'  这里没有元素好定位的
    # driver.find_element_by_xpath('//android.widget.Button[contains(@元素,"xxxxx")]').click()
    # 元素包含某某内容   '//类名[contains(@元素名,"内容")]'
    driver.find_element_by_xpath('//android.widget.Button[contains(@resource-id,"six_btn")]').click()
    # 末尾开始匹配   '//类名[ends-with(@元素名,"内容")]'
    driver.find_element_by_xpath('//android.widget.Button[ends-with(@resource-id,"one_btn")]').click()


    • uiautomator定位方法

    appium在android端是调用其底层的UIAutomator2自动化测试框架去驱动自动化,在定位元素的时候,可以借助UIAutomator2的语法来实现定位。在代码实现上提供的API是find_element_by_android_uiautomator。


    from
    appium import webdriver des = { "automationName": "Appium", # 默认是配置appium "platformName": "Android", # 平台名称 ios/android/firefox Os "platformVersion": "8.1.0", # 安卓的版本 "deviceName": "vivo x20", # 随便填 没关系 "app": r"D:apkjisuanqi.apk", "appPackage": "rock.Simple.Calculator", # 包名 "appActivity": "rock.Simple.Calculator.MainActivity", # 活动入口 "udid": "c6c8c4ce", # adb连接的设备名称 "noSign": True, "newCommandTimeout": 30 # 30s没对手机发送新命令,就断开连接 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', des) # driver.find_element_by_xpath('//android.widget.LinearLayout/android.widget.FrameLayout/' # 'android.widget.LinearLayout/android.widget.LinearLayout[2]/' # 'android.widget.LinearLayout[2]/android.widget.Button[2]').click() # # 使用text属性定位 '//属性值[@text=""]' # driver.find_element_by_xpath('//android.widget.Button[@text="+"]').click() # 点击+号 # # 使用resource-id '//属性值[@resource-id=""]' # driver.find_element_by_xpath('//android.widget.Button[@resource-id="rock.Simple.Calculator:id/six_btn"]').click() # 点击6 # # 使用bounds # driver.find_element_by_xpath('//android.widget.Button[@bounds="[807,1458][1029,1958]"]').click() # 点击= # # 以什么元素开头 '//类名[contains(@元素名,"内容")]' 这里没有元素好定位的 # driver.find_element_by_xpath('//android.widget.Button[contains(@元素,"xxxxx")]').click() # # 元素包含某某内容 '//类名[contains(@元素名,"内容")]' # driver.find_element_by_xpath('//android.widget.Button[contains(@resource-id,"six_btn")]').click() # # 末尾开始匹配 '//类名[ends-with(@元素名,"内容")]' # driver.find_element_by_xpath('//android.widget.Button[ends-with(@resource-id,"one_btn")]').click() # 点击 9 driver.find_element_by_android_uiautomator('text("9")').click() # 点击9 新建一个UiSelect对象 driver.find_element_by_android_uiautomator('resourceId("rock.Simple.Calculator:id/nine_btn") ').click()
    # 点击8 driver.find_element_by_android_uiautomator(
    'new UiSelector().resourceId("rock.Simple.Calculator:id/eight_btn")').click()





    后续更新...

  • 相关阅读:
    20191324第一周读书笔记
    20191324《信息安全专业导论》第十一周学习总结
    20191324《信息安全专业导论》第九周学习总结
    20191324《信息安全专业导论》第八周学习总结
    20191324《信息安全专业导论》第七周学习总结
    20182317 2018-2019-1《程序设计与数据结构》课程总结
    20182317 2019-2020-1 《数据结构与面向对象程序设计》实验九报告
    学号20182317 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结
    # 20182317 2019-2020-1 哈夫曼测试
    学号20182317 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结
  • 原文地址:https://www.cnblogs.com/yushengaqingzhijiao/p/15246014.html
Copyright © 2020-2023  润新知