標籤:for 入參 http 一起 ash not .class poll 自動化測試
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 webdriverfrom selenium.webdriver.support.ui import WebDriverWaitimport timefrom time import sleepimport datetimedesired_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_activityprint(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 webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom time import sleepdesired_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 Falseif __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,這個需要配合Regex,就不舉例了。
new UiSelector().textMatches("Regex")
#等首頁面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("圖")'#textContainsdriver.find_element_by_android_uiautomator(loc_textContains).click()loc_textStart = 'new UiSelector().textStartsWith("圖")'#textStartsWithdriver.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+textid_text = 'resourceId("com.baidu.yuedu:id/webbooktitle").text("小說")'driver.find_element_by_android_uiautomator(id_text).click()
3.class與text屬性群組合
sleep(2)#class+textclass_text = 'className("android.widget.TextView").text("圖書")'driver.find_element_by_android_uiautomator(class_text).click()
4.其它更多組合,id,class也可以與其它的index,checkable,clickable,password等這些不常用的屬性群組合
二、 父子定位childSelector
1.有時候不能直接定位某個元素,但是它的父元素很好定位,這時候就先定位父元素,通過父元素找兒子。
#父子關係childSelectorson = 'resourceId("com.baidu.yuedu:id/rl_tabs").childSelector(text("小說"))'driver.find_element_by_android_uiautomator(son).click()
三、兄弟定位:
# 兄弟關係fromParentbrother = '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)
appium案頭版本以及一些自動化測試方方封裝