一.元素定位工具
(1)可以使用android sdk自带工具uiautomatorviewer定位,路径存在Android SDK的Tools工具下。
(2)可以使用Appiuma-desktop安装包自带的Appium-inspector工具
二者的区别:
支持平台不同:uiautomatorviewer支持andorid native;Appium-inspector不仅支持android native还支持IOS
二.元素定位方法
1.ID定位
通常就是resource-id的值,直接在uiautomatorview复制即可
2.class name
name定位直接复制text的值就是appium的name定位,不建议使用name定位,1.6以上版本已经不支持这种定位方式
3.Xpath
(1)绝对路径
(2)相对路径
详细使用参照Xpath语法
注意“/”表示直接子元素,
“//”表示子元素的子元素
例如:定位B站APP“热门”
在Inspector展示的层级关系如图所示:
如图
driver.find_element_by_xpath("//android.widget.LinearLayout[1]/\ android.view.View[@resource-id='tv.danmaku.bili:id/video_layout'][1]/\ android.widget.FrameLayout[@resource-id='tv.danmaku.bili:id/cover_layout'][1]"\ ).click()
4.AccessibilityId
在 Android 上,主要使用元素的content-desc属性,如该属性为空,不能使用此定位方式。
5.坐标定位
一般很少用,因为屏幕分辩率发生变化,坐标点也容易发生变化
三.实战环节:
环境准备:
1.JAVA JDK 1.8
2.Android SDK
3.Appium-Desktop
4.Python 3.7
5.Pycharm
6.夜神模拟器
7.使用pip命令安装库
pip install Appium-Python-Client
完整代码如下:
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time
desired_caps = {
'platformName': 'Android',
'platformVersion': '5.1.1',
'deviceName': '127.0.0.1:62001',
'appPackage': 'tv.danmaku.bili',
'appActivity': '.ui.splash.SplashActivity'
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# time.sleep(10)强制等待
driver.implicitly_wait(10)#隐式等待是针对全部元素设置的等待时间
driver.find_element_by_id('tv.danmaku.bili:id/agree').click()
driver.implicitly_wait(10)
#显式等待是针对某个元素来设置的等待时间。
driver.find_element_by_xpath("//*[@resource-id='tv.danmaku.bili:id/tabs']//android.widget.FrameLayout[3]").click()
WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath("//android.widget.LinearLayout[1]/\
android.view.View[@resource-id='tv.danmaku.bili:id/video_layout'][1]/\
android.widget.FrameLayout[@resource-id='tv.danmaku.bili:id/cover_layout'][1]"))
driver.find_element_by_xpath("//android.widget.LinearLayout[1]/\
android.view.View[@resource-id='tv.danmaku.bili:id/video_layout'][1]/\
android.widget.FrameLayout[@resource-id='tv.danmaku.bili:id/cover_layout'][1]"\
).click()