还是使用qq做为测试app,先通过start recording生成python代码:
# This sample code uses the Appium python client
# pip install Appium-Python-Client
# Then you can paste this into a file and simply run with Python
from appium import webdriver
caps = {}
caps["deviceName"] = "e0a92c49"
caps["platformName"] = "Android"
caps["platformVersion"] = "4.4.4"
caps["appPackage"] = "com.tencent.mobileqq"
caps["appActivity"] = "com.tencent.mobileqq.activity.SplashActivity"
#不重置软件,通常用作保持登录状态
caps["noReset"] = True
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
#这里先使用time.sleep,更好的方式是用显式等待。
import time
time.sleep(2)
*******************************
可以把下面的定位方式的代码copy过来,直接执行
*******************************
driver.quit()
下面介绍4种定位方式:
方式1:通过id定位(id精确匹配和模糊匹配都可以)
# 精确匹配id
el2 = driver.find_element_by_id("com.tencent.mobileqq:id/btn_login")
#模糊匹配id
el2 = driver.find_element_by_id("btn_login")
el2.click()
# driver.find_element_by_xpath("")
方式2:通过class定位
在方式1中我们使用id定位到了登陆,这次我们模拟点击“新用户注册”,并使用class方式定位,由于class属性属于重复属性,也就是说不同的对象的class属性值可能一样,这就有可能在app界面里找到多个匹配的对象,例如(如图):qq登陆和新用户这两个按钮的class属性都是:android.widget.Button。
那么怎么区别这两个按钮呢,实现方式:使用“driver.find_elements_by_class_name”,注意elements用复数形式,取到下标,找到该对象。代码如下:
elements = driver.find_elements_by_class_name("android.widget.Button")
print(elements)
运行结果如下:
由于“新用户”的按钮下标是1,所以我们使用[1]来取到“新用户”按钮
elements = driver.find_elements_by_class_name("android.widget.Button")[1]
elements.click()
方式3:通过xpath定位,模拟登录
element = driver.find_element_by_xpath("//android.widget.Button[@text='登 录']")
element.click()
说明:
使用xpath属性时,推荐使用不受影响的xpath属性,如下图,在本案里,应该使用content-desc属性
方式4:通过accessibility_id定位,模拟登录
element = driver.find_element_by_accessibility_id("请输入QQ号码或手机或邮箱")
element.send_keys('1728731231')
彩蛋:如果执行的时候出现We wanted {"required":["value"]} and you sent ["text","sessionId"]
解决方法1:降级selenium为3.3.1
解决方法2:使用setvalue api代替
方式5:android特有的定位方式,通过ui-automator-selector
element = driver.find_elements_by_android_uiautomator('new UiSelector().text("登 录")')