目录
1. 常用:id/clss_name/content-desc/name/uiautomator/xpath
前提设置:
from appium import webdriver
# 模拟器/真机已经被电脑识别到(adb devices)
# 字典
# 1、设置终端参数项
desired_caps = {
"platformName": "Android",
"platformVersion": "6.1.1",
"appPackage": "com.ss.android.article.news",
"appActivity": "com.ss.android.article.news.activity.MainActivity",
"deviceName": "JAD-AL50",
"noReset": True,
"unicodeKeyboard": True, # 是否支持unicode的键盘。如果需要输入中文,要设置为“true”
"resetKeyboard": True, # 是否在测试结束后将键盘重轩为系统默认的输入法。
"automationName": "UiAutomator2" # 主要是版本引起的问题,有时候用的UiAutomator1
}
# 2、appium server进行启动
# 3、发送指令到appium server
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
夜神模拟器开启坐标:
手机桌面---->工具---->设置---->开发者选项---->打开“显示点按操作反馈”,“指针位置”
打开之后,我们鼠标滑动的时候就可以看到指定元素的位置坐标
一、元素定位方法
导入库
from appium.webdriver.common.appiumby import AppiumBy
可看出各种定位方式:
By: XPATH ID NAME WINDOWS_UI_AUTOMATION TAG_NAME CSS_SELECTOR CLASS_NAME LINK_TEXT PARTIAL_LINK_TEXT
AppiumBy: ACCESSIBILITY_ID ANDROID_UIAUTOMATOR ANDROID_VIEWTAG ANDROID_DATA_MATCHER ANDROID_VIEW_MATCHER CUSTOM IMAGE
1. 常用:id/clss_name/content-desc/name/uiautomator/xpath
id :元素功能描述:
driver.find_element(AppiumBy.ID, "com.android.launcher3:id/tv_search")
class_name :元素功能描述
该方法一般不使用,由于界面元素的class重复度太高,基本上不存在唯一值
driver.find_element(AppiumBy.CLASS_NAME, "android.widget.TextView")
content-desc :元素功能描述
content-desc 属性是用来描述该元素的作用
find_element(AppiumBy.ACCESSIBILITY_ID, "com.android.launcher3:id/tv_search")
name :元素功能描述:注释:Appium1.5及之后的版本废弃了name属性
2. uiautomator:参考文章
固定写法:
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,"new UiSelector().方法("value")")
方法包括很多:参考国外地址(需要翻墙)
# JAVA中的实例化
new UI = UiSelector()
new UiSelector() # 简写不需要变量接收class
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'') :外侧用 '' (单引号) ,里面的字符串用 " " (双引号)
# 1.className定位
# UISelector.className方法:通过ClassName找到所有的TextView控件,然后再在这些TextView控件查找text是”Add note“的控件
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().className("android.widget.TextView").text("重置")')
# UISelector.classNameMatches方法:通过正则表达式判断className是否和预期的一致
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().classNameMatches(".*TextView$")')
# 2.通过文本信息来定位:
# UISelector.text方法 :通过直接查找当前界面上所有的控件来比较每个控件的text属性是否如预期值来定位控件
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("重置")')
# UISelector.textContains方法,跟以上方法类似,但是不需要输入控件的全部text信息,如例子,只要写“重”或“置”即可。
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().textContains("重")')
# UISelector.textStartsWith方法 通过判断一个控件的text的开始是否和预期的字串相吻合来获得控件
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().textStartsWith("重置")')
# UISelector.textMatches方法 通过正则表达式的方式来比较控件的text来定位控件
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().textMatches("^重.*")')
# 3.通过控件ID定位。
# UiSelector.resourceId方法
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceId("com.android.settings:id/title")')
# UiSelector.resourceIdMatches方法
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().resourceIdMatches(".+id/title")')
# 4.通过控件contentDescription定位。即是 content'desc :contentDescription 一直是强调开发人员需要添加进去的
# UiSelector.description方法
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().description("lmappDesc")')
# UiSelector.descriptionContains方法
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().descriptionContains("lmapp")')
# UiSelector.descriptionStartWith方法
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().descriptionStartsWith("lmapp")')
# UiSelector.descriptionMatches方法
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().descriptionMatches("^lmapp.*$")')
# 5.1滑动屏幕查找 适用于 ANDROID 本身的滑动 存在滚动条的滑动,那么不显示滚动条执行报错!
e = 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).'+'scrollIntoView(new UiSelector().text("Popup Menu").instance(0));'
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,e).click()
# 5.2滑动屏幕查找:
ele = 'new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description("活动中心").instance(0));'
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, ele).click()
# 6.组合应用
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("重置").resourceId("com.android.settings:id/title")')
xpath :元素功能描述(能不用就不同xpath,效率太低)
根据id属性定位
表达式://*[@resource-id='id属性']
根据text属性定位
表达式://*[@text='text文本属性']
根据class属性定位
表达式: //*[@class='class属性']
通过content-desc属性定位
表达式: //*[@content-desc='文本']
driver.find_element(AppiumBy.XPATH, "//*[@resource-id='com.android.launcher3:id/tv_search']").click()
driver.find_element(AppiumBy.XPATH, "//*[@text='xxxx']").click()
driver.find_element(AppiumBy.XPATH, "//*[@class='android.widget.TextView']").click()
driver.find_element(AppiumBy.XPATH, "//*[@content-desc='xxxx']").click()
模糊定位
contains是模糊匹配的定位方法,对于一些元素的属性是可变的,但有一部分是固定的,这种就可以模糊匹配
//*[contains(@text, '查看')]
//*[contains(@content-desc, '')]
//*[contains(@resource-id, 'id属性')]
//*[contains(@clsss, 'class属性')]
组合定位
当单个元素定位不唯一时,这时候我们就可以采用多个属性组合定位,xpath也可以同时匹配2个属性,text, resource-id,class ,index,content-desc 这些属性都能任意组合定位。
id_class = '//android.widget.TextView[@resource-id='com.netease.edu.study:id/look_more']'
desc_class = '//*[@text='查看更多' and @index='2']'
层级定位
元素属性除了class属性,其他属性都为空,且class属性又不唯一时候用层级:
父类定位子类:
'//[@resoure-id='com.android.launcher3:id/tv_search']/android.widget.TextView'
'//[@resoure-id='com.android.launcher3:id/tv_search']/com.android.launcher3:id/tv_search[2]'
子类定位父类
'//[@resource-id='com.android.launcher3:id/tv_search']/…'
'//[@resource-id='com.android.launcher3:id/tv_search']/parent::'
'//[@resource-id='com.android.launcher3:id/tv_search']/parent::android.widget.LinearLayout'
兄弟元素定位:
'//*[@resource-id='com.android.launcher3:id/tv_search']/…/android.widget.RelativeLayout'
二、Appium 元素操作
1.click()
//点击操作
也可以用tab实现点击操作
driver.find_element(AppiumBy.ID, “com.android.launcher3:id/tv_search”).click()
2.clear()
//清空输入框内容
driver.find_element(AppiumBy.ID, “com.android.launcher3:id/tv_search”).clear()
3.send_keys(xx)
//输入框内输入内容
driver.find_element(AppiumBy.ID, “com.android.launcher3:id/tv_search”).send_keys(“test content”)
4.text
//获得元素的text内容
print(driver.find_element(AppiumBy.ID, “com.android.launcher3:id/tv_search”).text)
5.get_attribute
// 返回元素的文本值
driver.element.get_attribute(“class”)
6.size
//获取元素的大小(高和宽)
driver.element.size
7.location
// 获取元素左上角的坐标
driver.location.size
8.get_window_size
// 获取手机的分辨率
driver.get_window_size()
9.page_source
// 获取当前页面的源码
driver.page_source
10.quit
// 退出
driver.quit()
11.get_screenshot_as_file
// 将手机屏幕截图并保存电脑上的文件
driver.get_screenshot_as_file(“路径”)
12.open_notifications
// 打系统通知栏(仅支持API 18 以上的安卓系统)
driver.open_notifications()