appium_desktop
標簽(空格分隔): appium_desktop
一 appium_desktop_v1.2.6
1.appium_desktop在github上最新下載地址:appium桌面版本地址

2.一路傻瓜式安裝就好了:

3.然后點擊搜索按鈕(右上角)
三 inspector
1.元素定位探測器,在Desired Capabilitis下表格輸入參數配置信息:
"platformName": "Android",
"deviceName": "8681-M02-0x253b1876",
"platformVersion": "5.1",
"appPackage": "com.zhan.toefltom",
"appActivity": "com.zhan.toefltom.SplashActivity",
"app": "F:\\特殊處理包H5\\toefl_V2.1.0_071610_release.apk"

2.參數配置好之后可以保存下,連接手機,再點Start Session按鈕就能定位元素了

3.用上圖導航欄的箭頭按鈕,定位左邊app的元素屬性
四 彈出框的坑
1.這里有個坑,這種彈出框的元素無法定位到,需要用UI Automator Viewer這個工具才能定位到

五 對比分析
inspector優點
appium自帶的inspector可以查看xpath路徑,對比xpath不熟悉的同學可以很好的幫助
inspector缺點
1.有些彈出框的元素無法定位到
2.過分依賴工具匹配出來的xpath會讓你變懶,形成對工具的依賴
總結:xpath實際上是定位的下下策,能不用盡量不用,另外不要一直復制xpath粘貼,那對你定位一點幫助也沒有,想用xpath的同學,多學習語法,自己去寫!
六:如果定位的過程你使用了全部的招數都無法定位到元素:
so:那就要使用坐標定位了
七:定位坐標

如圖我們可以看到對應的坐標的屬性
android特有的wait_activity屬性
在啟動app的時候,如果直接做下一步點擊操作,經常會報錯,於是我們會在啟動完成的時候加sleep。
那么問題來了,這個sleep時間到底設置多少合適呢?設置長了,就浪費時間,設置短了,就會找不到元素報錯了,這個時候我們可以用wait_activity的語法,等到你想點擊的頁面activity出現了,再點擊,可以有效的節省時間。
- wait_activity(self, activity, timeout, interval=1):
等待指定的activity出現直到超時,interval為掃描間隔1秒
即每隔幾秒獲取一次當前的activity, android特有的
返回的True 或 False
activity - 需等待的目標 activity
- timeout - 最大超時時間,單位是s
- interval - 循環查詢時間
用法:driver.wait_activity(‘.activity.xxx’,5,2)
- 二、獲取current_activity
1.打開app后,先sleep10秒,等app完全啟動完成進入主頁面,然后獲取當前界面的activity
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
from time import sleep
import datetime
desired_caps = {
"platformName": "Android",
"deviceName": "8681-M02-0x253b1876",
"platformVersion": "5.1",
"appPackage": "com.zhan.toefltom",
"appActivity": "com.zhan.toefltom.SplashActivity"
}
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
ac =driver.current_activity
print(ac)
等待activity
1.用sleep太浪費時間了,並且不知道什么時候能啟動完成,所以盡量不用sleep
2.上一步已經獲取當主頁面的activity了,那就可以用wait_activity等它出現了,再做下一步的點擊操作
新版本的appium不支持name定位了:
- 一、 name定位報錯
1.最新版appium V1.7用name定位,報錯:
selenium.common.exceptions.InvalidSelectorException: Message: Locator Strategy 'name' is not supported for this session
2.這個報錯是說name這個定位方法目前已經不支持了,因為appium從1.5版本開始就已經拋棄了name這種定位方法了。
- 二、 xpath定位
1.既然name定位拋棄了,那就說明有更先進的定位代替了它,事實上xpath定位里面已經包含了name這種定位方法。
2.平常用過selenium,在定位頁面上文本的時候,應該知道這個xpath語法:
//*[text()='頁面text文本']
appium里面的xpath語法跟selenium有一點點區別:
//*[@text='頁面text文本']
- 三、 text屬性
1.上面的xpath語法適合頁面上這個text屬性是唯一的,才好直接定位到,那么問題來了:如果頁面上有多個text屬性的文本一樣,怎么辦?
2.xpath語法里面*是代表匹配任意的值,在selenium里面*是匹配任意標簽,appium里的*是匹配任意class名稱,如果幾個文本的class屬性不一樣,就可以通過以下組合:
//android.widget.TextView[@text='小說']

toast提示消息判斷
- 1.查看appium v1.7版本官方文檔
2.目前1.7的android版可以支持:Espresso、UiAutomator2、UiAutomator、Selendroid四種驅動模式
UiAutomator2是目前最穩的。
- 二、toast定位
1.先看下toast長什么樣,如下圖,像這種彈出來的消息"再按一次退出",這種就是toast了。

2.想要定位toast提示:
需要:
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
desired_caps = {
'platformName': 'Android',
'deviceName': '***',
'platformVersion': '4.4.2',
'appPackage': '*****',
'appActivity': '****',
'noReset': 'true',
'automationName': 'Uiautomator2'
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 等主頁面activity出現
driver.wait_activity(".****", 10)
driver.back() # 點返回
# 定位toast元素
toast_loc = ("xpath", ".//*[contains(@text,'再按一次退出')]")
t = WebDriverWait(driver, 10, 0.1).until(EC.presence_of_element_located(toast_loc))
print t
上述:***自行測試中填寫自己的內容
3.打印出來的結果,出現如下信息,說明定位到toast了
<appium.webdriver.webelement.WebElement (session="02813cce-9aaf-4754-a532-07ef7aebeb88", element="339f72c4-d2e0-4d98-8db0-69be741a3d1b")>
封裝toast判斷:
1.有時候我們需要單獨封裝一個方法來判斷toast是否存在,存在返回True,不存在返回False
3.打印出來的結果,出現如下信息,說明定位到toast了
def is_toast_exist(driver,text,timeout=30,poll_frequency=0.5):
# driver - 傳driver
#text - 頁面上看到的文本內容
#timeout - 最大超時時間,默認30s
#poll_frequency - 間隔查詢時間,默認0.5s查詢一次
try:
toast_loc = ("xpath", ".//*[contains(@text,'%s')]"%text)
WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(toast_loc))
return True
except:
return False
if __name__ == "__main__":
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
# 等主頁面activity出現
driver.wait_activity(".base.ui.MainActivity", 10)
driver.back() # 點返回
# 判斷是否存在toast-'再按一次退出'
print is_toast_exist(driver, "再按一次退出")
list定位:
當你定位元素的時候發現頁面元素不唯一的時候,怎么辦,這時候我們可以通過find_elements等list的取值來獲取自己想要的元素,然后進行操作;
find_element有13種定位

find_elements也有13種

driver.find_elements_by_id("***")[0].click()
android_uiautomator
- appium的前身就是封裝android的uiautomator這個框架來的,所以uiautomator的一些定位方法也可以用;
text
1.通過text文本定位語法
new UiSelector().text("text文本")
2.文本比較長的時候,可以用textContains模糊匹配,只要文本包含匹配內容就可以了。
new UiSelector().textContains("包含text文本")
3.textStartsWith是以某個文本開頭的匹配
new UiSelector().textStartsWith("以text文本開頭")
4.正則匹配textMatches,這個需要配合正則表達式,就不舉例了。
new UiSelector().textMatches("正則表達式")
#等主頁面activity出現
driver.wait_activity(".base.ui.MainActivity", 10)
loc_text = 'new UiSelector().text("圖書")'#text內容
driver.find_element_by_android_uiautomator(loc_text).click()
loc_textContains = 'new UiSelector().textContains("圖")'#textContains
driver.find_element_by_android_uiautomator(loc_textContains).click()
loc_textStart = 'new UiSelector().textStartsWith("圖")'#textStartsWith
driver.find_element_by_android_uiautomator(loc_textStart).click()
className
1.頁面上的class屬性一般不唯一,多半用在復數定位時候。比如通過class屬性定位'排行'這個按鈕下標就是2。
new UiSelector().className("className")
2.className復數定位loc_class = 'new UiSelector().className("android.widget.TextView")'driver.find_elements_by_android_uiautomator(loc_class)2.click()
3.escription
1.由於這個app的contenet-des屬性都是空的,就不用代碼演示了,跟上面方法一樣。
new UiSelector().description("contenet-des屬性")
android_uiautomator定位進階
上一篇介紹uiautomator的定位方式都是類似這種'new UiSelector().xxx("xxx")',看起非常長,我也記不住,怎樣去除呢?
一、組合定位
1.一般組合用id,class,text這三個屬性會比較好一點,其次description這個屬性也可以一起兩兩組合
2.id與text屬性組合
2.id與text屬性組合
# id+text
id_text = 'resourceId("com.baidu.yuedu:id/webbooktitle").text("小說")'
driver.find_element_by_android_uiautomator(id_text).click()
3.class與text屬性組合
sleep(2)
#class+text
class_text = 'className("android.widget.TextView").text("圖書")'
driver.find_element_by_android_uiautomator(class_text).click()
4.其它更多組合,id,class也可以與其它的index,checkable,clickable,password等這些不常用的屬性組合
二、 父子定位childSelector
1.有時候不能直接定位某個元素,但是它的父元素很好定位,這時候就先定位父元素,通過父元素找兒子。
#父子關系childSelector
son = 'resourceId("com.baidu.yuedu:id/rl_tabs").childSelector(text("小說"))'
driver.find_element_by_android_uiautomator(son).click()

三、兄弟定位:
# 兄弟關系fromParent
brother = 'resourceId("com.baidu.yuedu:id/lefttitle").fromParent(text("圖書"))'
driver.find_element_by_android_uiautomator(brother).click()

長按操作:
長按long_press
1.長按的操作可以用前面講到的TouchAction類里面的long_press方法操作
def long_press(self, el=None, x=None, y=None, duration=1000):
長按操作,可以傳定位的元素對象,也可以傳坐標
el 是定位元素的對象
x,y是傳坐標
duration是按住的持續時間,默認1000,單位是毫秒
2.實現方法
TouchAction(driver).long_press(el).perform()#長按
el = driver.find_elements_by_id("com.tencent.mm:id/apv")[0]
# 長按
TouchAction(driver).long_press(el).perform()
time.sleep(3)
