appium几种元素定位(id,class,content-desc,AndroidUiAutomator,bound,相对定位-通过父类,xpath)
appium 五种定位方式
1.通过id定位,resrouce-id
2.通过ClassName定位: classname
3.通过Accessiblityld定位:content-desc
4.通过AndroidUiAutomator
5.根据bound定位
6.相对定位
7.通过xpath定位(app中很少用到)终极定位
- 通过id定位元素:`find_element(by_id, 'id')` - 通过class_name定位元素:`find_element(by_class_name, 'class name')` - 通过content-desc定位元素:`find_element(by_content_desc, 'content desc')` - 通过text定位元素:`find_element(by_text, 'text')` - 通过xpath定位元素:`find_element(by_xpath, 'xpath')` - 通过uiautomator定位元素(仅适用于Android):`find_element(by_android_uiautomator, 'resourceId')` 。
可能因为webdriver版本的问题,所以定位 find_element方法有所不同
from appium import webdriver
from appium.webdriver.common import mobileby
# 发送指令到appium server driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 定位元素 by = mobileby.MobileBy() driver.find_element(by.ID, "com.baidu.searchbox:id/search_box_text_1")
通过id定位,
resrouce-id
driver.find_element_by_id('co****ban:id/navigation_tiku').click() time.sleep(2)
若警告Unresolved attribute reference 'find_element_by_id' for class 'WebDriver'
通过Accessiblityld定位:content-desc/description 元素功能描述,语音播报
driver.find_elements_by_accessibility_id() # 值为content-desc的值
通过ClassName定位: classname
driver.find_element_by_class_name()
通过AndroidUiAutomator
driver.find_element_by_android_uiautomator('new UiSelector().className(\"android.widget.TextView\").textContains(\"信息\").resourceId(\"com.lemon.lemonban:id/category_title\")').click()
根据bound定位
目前使用bounds定位的方式一般是因为这个元素clickable=false时,用bounds进行定位后用tap方法模拟点击。
相对定位
先找到元素的父元素节点,再通过父元素进行元素定位
root_element=driver.find_element_by_id('id') root_element.find_element_by_class_name('android.widget.TextView').click()
通过xpath定位(app中很少用到)
driver.find_element_by_xpath('//android.widget.ImageView[@resource-id="com.zhijiepay.xls:id/confirm_ok"]').click()
#注意调试时不关闭driver,则认为进程还在开启中,uiautomatorviewer截图会出现失败。
本身SDK自带的uiautomatorviewer可能没有获取xpath的功能。
下载可以获取xpath的uiautomatorviewer 的 github 地址:https://github.com/lazytestteam/lazyuiautomatorviewer
将新的jar包放到原来的uiautomatorviewer的jar包目录,名字一定要和原生的jar包名字相同,不然会打不开。
运行uniautomatorviewwe.bat结果如下:
driver.find_element_by_xpath("//android.widget.ImageView[@resource-id='com.zhijiepay.xls:id/confirm_ok']").click()
由上面可以看出,xpath是由resource-id 和 class 拼接起来的:
xpath = //"classname"[@resource-id="resourceid "]
@后面可以是resource-id,也可以是其他的属性
这边如果显示resource-id,那么说明这个属性是唯一的