appium案頭版本以及一些自動化測試方方封裝

來源:互聯網
上載者:User

標籤: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案頭版本以及一些自動化測試方方封裝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.