zoukankan      html  css  js  c++  java
  • Python3+Appium学习笔记09-元素定位android_uiautomator

    appium是使用了uiautomator的框架的,所以uiautomator所带的定位方式。appium也是支持的

    需要使用appium中find_element_by_android_uiautomator()方法

    示例基本都已百度app为例

    1)text定位

    1.通过text文本来定位

    'new UiSelector().text("对应text的值")'

    2.类似模糊匹配,只要包含text内容

    'new UiSelector().textContains("包含text文本")'

    3.通过text开头内容来定位

    'new UiSelector().textStartsWith("text开头")'

    4.通过正则匹配

    'new UiSelector().textMatches("正则表达式")'
    from appium import webdriver
    import time
    
    desired_caps = {
        'platformName': 'Android',
        'platformVersion': '7.1.2',
        'deviceName': '1b6ca8f',
        'noReset': True,
        # 'app':'apk路径',
        'automationName': 'uiautomator2',
        'appPackage': 'com.baidu.searchbox',
        'appActivity': '.MainActivity'
    }
    driver = webdriver.Remote('127.0.0.1:4723/wd/hub',  desired_caps)
    time.sleep(10)
    
    # text = 'new UiSelector().text("搜索或输入网址")'
    # driver.find_element_by_android_uiautomator(text).click()
    
    # text1 = 'new UiSelector().textContains("输入网址")'
    # driver.find_element_by_android_uiautomator(text1).click()
    
    # text2 = 'new UiSelector().textStartsWith("搜索")'
    # driver.find_element_by_android_uiautomator(text2).click()
    
    text3 = 'new UiSelector().textMatches("^搜索.*")'
    driver.find_element_by_android_uiautomator(text3).click()
    

    四个方法效果全是点击百度app的搜索框。执行时要把另外三个给注释掉。

    2)resourceId

    resourceId等价于by_id

    'new UiSelector().resourceId("id")'
    from appium import webdriver
    import time
    
    desired_caps = {
        'platformName': 'Android',
        'platformVersion': '7.1.2',
        'deviceName': '1b6ca8f',
        'noReset': True,
        # 'app':'apk路径',
        'automationName': 'uiautomator2',
        'appPackage': 'com.baidu.searchbox',
        'appActivity': '.MainActivity'
    }
    driver = webdriver.Remote('127.0.0.1:4723/wd/hub',  desired_caps)
    time.sleep(10)
    text = 'new UiSelector().resourceId("com.baidu.searchbox:id/baidu_searchbox")'
    driver.find_element_by_android_uiautomator(text).click()
    

    点击百度app的搜索框

    3)className

    就是用class的值,等价于class_name

    'new UiSelector().className("class")'
    from appium import webdriver
    import time
    
    desired_caps = {
        'platformName': 'Android',
        'platformVersion': '7.1.2',
        'deviceName': '1b6ca8f',
        'noReset': True,
        # 'app':'apk路径',
        'automationName': 'uiautomator2',
        'appPackage': 'com.baidu.searchbox',
        'appActivity': '.MainActivity'
    }
    driver = webdriver.Remote('127.0.0.1:4723/wd/hub',  desired_caps)
    time.sleep(10)
    text = 'new UiSelector().className("android.widget.TextSwitcher")'
    su = driver.find_elements_by_android_uiautomator(text)
    print(len(su))
    su[0].click()
    

    点击百度app的搜索框

    class一般都是有重复的,要用find_elements。这里正好是唯一的。

    4)description

    使用content-desc的值定位,等价于accessibility_id

    'new UiSelector().description("content-desc的值")'
    from appium import webdriver
    import time
    
    desired_caps = {
        'platformName': 'Android',
        'platformVersion': '7.1.2',
        'deviceName': '1b6ca8f',
        'noReset': True,
        # 'app':'apk路径',
        'automationName': 'uiautomator2',
        'appPackage': 'com.baidu.searchbox',
        'appActivity': '.MainActivity'
    }
    driver = webdriver.Remote('127.0.0.1:4723/wd/hub',  desired_caps)
    time.sleep(10)
    text = 'new UiSelector().description("产品大全")'
    driver.find_element_by_android_uiautomator(text).click()
    

    效果是打开百度app,点击右上角的产品大全按钮

    5)组合定位

    可以使用两个定位方式组合在一起来定位。一般使用id,class,text这三个属性来组合。

    'resourceId("id值").text("text值")'
    from appium import webdriver
    import time
    
    desired_caps = {
        'platformName': 'Android',
        'platformVersion': '7.1.2',
        'deviceName': '1b6ca8f',
        'noReset': True,
        # 'app':'apk路径',
        'automationName': 'uiautomator2',
        'appPackage': 'com.baidu.searchbox',
        'appActivity': '.MainActivity'
    }
    driver = webdriver.Remote('127.0.0.1:4723/wd/hub',  desired_caps)
    time.sleep(10)
    text = 'resourceId("com.baidu.searchbox:id/image_search_entrance").className("android.widget.ImageView")'
    driver.find_element_by_android_uiautomator(text).click()
    

    效果是打开百度app,点击搜索旁边的拍照按钮

    6)父子层级

    使用childSelector

    当一个元素很难定位的时候,可以先定位到他的父元素,然后再定位到这个子元素

    比如百度app的这个频道管理按钮,和频道管理平级的三个元素class全是不一样的。我们先定位到父元素,再来定位到他

    from appium import webdriver
    import time
    
    desired_caps = {
        'platformName': 'Android',
        'platformVersion': '7.1.2',
        'deviceName': '1b6ca8f',
        'noReset': True,
        # 'app':'apk路径',
        'automationName': 'uiautomator2',
        'appPackage': 'com.baidu.searchbox',
        'appActivity': '.MainActivity'
    }
    driver = webdriver.Remote('127.0.0.1:4723/wd/hub',  desired_caps)
    time.sleep(10)
    su = driver.find_elements_by_class_name("android.widget.ImageView")
    print(len(su))
    text = 'resourceId("com.baidu.searchbox:id/tab_right_button_area").childSelector(className("android.widget.ImageView"))'
    driver.find_element_by_android_uiautomator(text).click()
    

    执行代码,会打开百度app,然后点击频道管理

    可以看到如果直接通过class去定位,会有22个重复的元素。当先定位到父元素,再通过class去定位,能直接定位到该元素。

    7)兄弟层级

    使用fromParent

    这个就是通过同层级的某元素,去定位另外一个同层级的元素

    这次通过先定位到频道管理,然后再定位到朗读的按钮

    from appium import webdriver
    import time
    
    desired_caps = {
        'platformName': 'Android',
        'platformVersion': '7.1.2',
        'deviceName': '1b6ca8f',
        'noReset': True,
        # 'app':'apk路径',
        'automationName': 'uiautomator2',
        'appPackage': 'com.baidu.searchbox',
        'appActivity': '.MainActivity'
    }
    driver = webdriver.Remote('127.0.0.1:4723/wd/hub',  desired_caps)
    time.sleep(10)
    su = driver.find_elements_by_class_name("android.widget.LinearLayout")
    print(len(su))
    text = 'resourceId("com.baidu.searchbox:id/tab_right_plus").fromParent(className("android.widget.LinearLayout"))'
    driver.find_element_by_android_uiautomator(text).click()
    

    执行代码,会打开百度app,然后点击朗读按钮

    可以看到如果直接通过class去定位,会有10个重复的元素。当先定位到同层级元素,再通过class去定位,能直接定位到该元素。

    Uiautomator还有很多定位方式,感兴趣可以百度一下,比如id,text也可以使用正则。

  • 相关阅读:
    Too many fields describes: 101 解决方法
    [Salesforce] 时区 问题
    [Salesforce] related list remove edit link
    apex获取页面中的url中的参数
    定义常量 map
    FIELD_CUSTOM_VALIDATION_EXCEPTION
    Salesforce message 里 放 link
    WinForm上显示gif动画[转]
    C/C++ Handle data types[转]
    Temporary Post Used For Theme Detection (b4e6dd688472447db6af8590aee16d59 3bfe001a32de4114a6b44005b770f6d7)
  • 原文地址:https://www.cnblogs.com/myal/p/10871619.html
Copyright © 2011-2022 走看看