Android 初始化参数 (首先下载Android sdk,appium desktop)
from appium import webdriver
des={ "deviceName": "127.0.0.1:62001", #手机名称 cmd->adb devices
"platformName": "Android", # 操作系统
"platformVersion": "5.1.1", #系统版本
"unicodeKeyboard": True, #输入法
"resetKeyboard": True, #重置输入法
"noReset": True, #是否重装,True不重装
"appActivity": "com.tencent.mobileqq.activity.SplashActivity", # aapt dump badging+包的路径(在log中查找)
"appPackage": "com.tencent.mobileqq" # aapt dump badging+包的路径(在log中查找)
}
driver=webdriver.Remote('172.0.0.1:4723/wd/hub',des)
Android 定位元素
driver.find_element_by_accessibility_id('content-desc') # content-desc定位
ele=driver.find_elements_by_class_name('android.widget.EditText')[1] #class定位 (定位的是复数下标取值)
ele.send_keys('123')
driver.find_element_by_xpath('//android.widget.EditText[@content-descc="请输入QQ号码或手机或邮箱"]')
#在APPium中xpath定位时,斜杠后可跟class名,//+classname+[@type='name']
driver.find_element_by_android_uiautomator('new UiSelector().text("请输入手机号码")') #text定位
ios 初始化参数
from appium import webdriver
desired_caps = {}
desired_caps['automationName'] = 'XCUITest' # Xcode8.2以上无UIAutomation,需使用XCUITest
desired_caps['platformName'] = 'iOS' #系统
desired_caps['platformVersion'] = '10.3.2' #版本
desired_caps['deviceName'] = 'iPhone 7 Plus' #手机名
desired_caps['bundleId'] = '需要启动的bundle id, 去问开发者' #包名 id
# ['app']
desired_caps['udid'] = '真机的udid 可在Xcode或iTunes里查看'
desired_caps['newCommandTimeout'] = 3600 # 1 hour
# 打开Appium服务器,start server后,尝试启动被测App
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
iOS元素定位
type:元素类型,与className作用一致,如:XCUIElementTypeButton
value: 一般不用
name:元素的文本内容,可用作 AccessibilityId定位方式,如:ClearEmail
label:绝大多数情况下,与 name 作用一致
enabled:元素是否可点击,一般值为true或者false
visible;元素是否可见,一般值为true或者false
1、ios_predicate
在 iOS 的 UI 自动化中,使用原生支持的Predicate定位方式是最好,可支持元素的单个属性和多个属性定位,强烈推荐使用。
使用方法,举例如下:
driver.find_element_by_ios_predicate("value == 'ClearEmail'")
driver.find_element_by_ios_predicate("type == 'XCUIElementTypeButton' AND value == 'ClearEmail'")
2、accessibility_id
替代以前的name定位方式,在 iOS 上,主要使用元素的label或name(两个属性的值都一样)属性进行定位,如该属性为空,也是不能使用该属性。
driver.find_element_by_accessibility_id('ClearEmail')
3.class_name
使用元素的type属性定位,特别注意该属性的唯一性!class_name唯一的情况并不多,一般情况下用不上。
driver.find_element_by_class_name('XCUIElementTypeButton')
4.xpath
1)使用绝对路径定位:
driver.find_element_by_xpath('/XCUIElementTypeApplication/XCUIElementTypeButton')
2)使用相对路径定位
driver.find_element_by_xpath('//XCUIElementTypeButton')
3)通过元素的索引定位
driver.find_element_by_xpath('//XCUIElementTypeButton[index]')
4.通过元素的属性定位
一种属性:
driver.find_element_by_xpath("//className[@value='ClearEmail']")
两种属性:
driver.find_element_by_xpath("//className[@value='ClearEmail'][@ visible =true]")
部分属性(最强大):driver.find_element_by_xpath("//className[contains(@value,'ClearEmail')]")