appium桌面版本以及一些自動化測試方方封裝


appium_desktop

標簽(空格分隔): appium_desktop


一 appium_desktop_v1.2.6
1.appium_desktop在github上最新下載地址:appium桌面版本地址
image.png-64kB
2.一路傻瓜式安裝就好了:
image.png-103.3kB
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"

image.png-96.3kB
2.參數配置好之后可以保存下,連接手機,再點Start Session按鈕就能定位元素了
image.png-92.2kB
3.用上圖導航欄的箭頭按鈕,定位左邊app的元素屬性
四 彈出框的坑
1.這里有個坑,這種彈出框的元素無法定位到,需要用UI Automator Viewer這個工具才能定位到
image.png-144.6kB
五 對比分析
inspector優點
appium自帶的inspector可以查看xpath路徑,對比xpath不熟悉的同學可以很好的幫助
inspector缺點
1.有些彈出框的元素無法定位到
2.過分依賴工具匹配出來的xpath會讓你變懶,形成對工具的依賴
總結:xpath實際上是定位的下下策,能不用盡量不用,另外不要一直復制xpath粘貼,那對你定位一點幫助也沒有,想用xpath的同學,多學習語法,自己去寫!

六:如果定位的過程你使用了全部的招數都無法定位到元素:
so:那就要使用坐標定位了
七:定位坐標
image.png-172.3kB
如圖我們可以看到對應的坐標的屬性

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='小說']

image.png-61.8kB

toast提示消息判斷

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

image.png-4.6kB
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種定位
image.png-110.7kB
find_elements也有13種
image.png-107.6kB

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()

image.png-96.1kB

三、兄弟定位:

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

image.png-144.5kB

長按操作:

長按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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM