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也可以使用正则。

posted @ 2019-05-15 19:43  梦忆安凉  阅读(665)  评论(0编辑  收藏  举报