第三十五 APP移動端測試高級

一女淑、Appium介紹

Appium是一個移動端的自動化框架瞭郑,可用于測試原生應用、移動網(wǎng)頁應用和混合型應用鸭你,且是跨平臺的屈张。可用于IOS和Android以及firefox的操作系統(tǒng)袱巨。

原生的應用是指用android或ios的sdk編寫的應用阁谆;移動網(wǎng)頁應用是指網(wǎng)頁應用,類似于ios中safari應用或者Chrome應用或者類瀏覽器的應用愉老;混合應用是指一種包裹webview的應用,原生應用于網(wǎng)頁內(nèi)容交互性的應用场绿。

重要的是Appium是跨平臺的,何為跨平臺嫉入,意思就是可以針對不同的平臺用一套api來編寫測試用例焰盗。

二、環(huán)境搭建

主要幾個點如下:

image

1. appium安裝

直接解壓即可咒林,打開Appium.exe

image

啟動成功展示如下:

image

2. Appium庫安裝

# 安裝
pip install Appium-Python-Client
# 檢驗是否成功
pip list

三熬拒、Appium使用

1. 打開模擬器或真機的應用

①打開手機應用
②打開Appium
③創(chuàng)建一個python項目,并創(chuàng)建一個文件
④將下面代碼復制到文件中
⑤獲取當前應用包名和啟動activity并修改文件

from appium import webdriver
# server 啟動參數(shù)
desired_caps = dict()
# 設備信息
# 平臺信息垫竞,不區(qū)分大小寫
desired_caps['platformName'] = 'Android'
# 系統(tǒng)版本澎粟,7.1.2可以寫[7 ,7.1 , 7.1.2]
desired_caps['platformVersion'] = '7.1.2'
# 設備名稱活烙,可以隨便寫徐裸,但是不能亂寫,Android可以隨便寫啸盏,但是ios必須正確的寫
desired_caps['deviceName'] = 'emulator-5554'
# app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 聲明我們的driver對象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
driver.quit()

2. 腳本內(nèi)啟動其他app

driver.start_activity(appPackage,appActivity)

3. 關閉app

driver.close_app()  # 關閉當前操作的app重贺,不會關閉驅(qū)動對象

4. 關閉驅(qū)動對象

driver.quit()   # 關閉驅(qū)動對象,同時關閉所有關聯(lián)的app

三宫补、App基礎操作API

完成app自動化需要一些基礎條件的支持檬姥,本節(jié)將講解APP初始化API。

3.1前置代碼

# server 啟動參數(shù)

desired_caps = {}
desired_caps['platformName'] = 'Android' 
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True

# 聲明driver對象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

3.2 安裝APK到手機

driver.install_app(app_path) 

參數(shù):app_path:腳本機器中APK文件路徑

3.3 手機中移除APP

driver.remove_app(app_id) 

參數(shù):app_id:需要卸載的app包名

3.4 判斷APP是否已安裝

driver.is_app_installed(bundle_id) 

參數(shù):bundle_id: 可以傳入app包名,返回結(jié)果為True(已安裝) / False(未安裝)
3.5 發(fā)送文件到手機

import base64
data = str(base64.b64encode(data.encode('utf-8')),'utf-8')
driver.push_file(path,data)
參數(shù):

path:手機設備上的路徑(例如:/sdcard/a.txt)
data:文件內(nèi)數(shù)據(jù),要求base64編碼
Python3.x中字符都為unicode編碼粉怕,而b64encode函數(shù)的參數(shù)為byte類型健民,需要先轉(zhuǎn)碼;
生成的數(shù)據(jù)為byte類型贫贝,需要將byte轉(zhuǎn)換回去秉犹。

3.6 從手機中拉取文件

import base64
data = driver.pull_file(path) # 返回數(shù)據(jù)為base64編碼
print(str(base64.b64decode(data),'utf-8')) # base64解碼

參數(shù): path: 手機設備上的路徑

3.7獲取當前屏幕內(nèi)元素結(jié)構(gòu)

driver.page_source  

作用:返回當前頁面的文檔結(jié)構(gòu),判斷特定的元素是否存在

四稚晚、手機控件查看工具uiautomatorviewer

4.1 工具簡介

用來掃描和分析Android應用程序的UI控件的工具.

4.1 如何使用

  1. 進入SDK目錄下的tools目錄崇堵,打開uiautomatorviewer

  2. 電腦連接真機或打開android模擬器

  3. 啟動待測試app

  4. 點擊uiautomatorviewer的左上角Device Screenshot,會生成app當前頁面的UI控件截圖

    image
  5. 選擇截圖上需要查看的控件,即可瀏覽該控件的id,class,text,坐標等信息

    image

五客燕、APP元素定位操作

手工測試主要通過可見按鈕操作鸳劳,而自動化是通過元素進行交互操作。
元素的基本定位基于當前屏幕范圍內(nèi)展示的可見元素也搓。

5.1 Appium常用元素定位方式

name value
id id屬性值
class class屬性值
xpath xpath表達式

5.2 前置代碼

from appium import webdriver
# server 啟動參數(shù)
desired_caps = {}
# 設備信息
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'

# 聲明我們的driver對象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

5.3 通過id定位

  • 方法:find_element_by_id(id_value) # id_value:為元素的id屬性值

  • 業(yè)務場景:
    1. 進入設置頁面
    2. 通過ID定位方式點擊搜索按鈕

  • 代碼實現(xiàn):

    driver.find_element_by_id("com.android.settings:id/search").click()
    driver.quit()
    
    

5.4 通過class定位

  • 方法:find_element_by_class_name(class_value) # class_value:為元素的class屬性值
  • 業(yè)務場景:
    1. 進入設置頁面
    2. 點擊搜索按鈕
    3. 通過class定位方式點擊輸入框的返回按鈕
  • 代碼實現(xiàn):
# id 點擊搜索按鈕
driver.find_element_by_id("com.android.settings:id/search").click()
# class 點擊輸入框返回按鈕
driver.find_element_by_class_name('android.widget.ImageButton').click()
driver.quit()

5.5 通過xpath定位

  • 方法:find_element_by_xpath(xpath_value) # xpath_value:為可以定位到元素的xpath語句
    android端xptah常用屬性定位:

    1. id ://*contains(@resource-id,'[com.android.settings:id/search')]
    2. class ://*[contains(@class,'android.widget.ImageButton')]
    3. text ://*[contains(@text,'WLA')]

    模糊定位 contains(@key,value): value可以是部分值

  • 業(yè)務場景:
    1. 進入設置頁面
    2. 點擊WLAN菜單欄

  • 代碼實現(xiàn):

    # xpath 點擊WLAN按鈕
    driver.find_element_by_xpath("http://*[contains(@text,'WLA')]").click()
    
    

5.6 定位一組元素,注意element -> elements

應用場景為元素值重復赏廓,無法通過元素屬性直接定位到某個元素,只能通過elements方式來選擇傍妒,返回一個定位對象的列表.

5.7 通過id方式定位一組元素

  • 方法: find_elements_by_id(id_value) # id_value:為元素的id屬性值

  • 業(yè)務場景:
    1. 進入設置頁面
    2. 點擊WLAN菜單欄(id定位對象列表中第1個)

  • 代碼實現(xiàn):

    # 定位到一組元素
    title = driver.find_elements_by_id("com.android.settings:id/title")
    # 打印title類型幔摸,預期為list
    print(type(title))
    # 取title返回列表中的第一個定位對象,執(zhí)行點擊操作
    title[0].click()
    

5.8 通過class方式定位一組元素
方法:find_elements_by_class_name(class_value) # class_value:為元素的class屬性值
業(yè)務場景:
1.進入設置頁面
2.點擊WLAN菜單欄(class定位對象列表中第3個)
代碼實現(xiàn):
title = driver.find_elements_by_class_name("android.widget.TextView")

打印title類型颤练,預期為list

print(type(title))

取title返回列表中的第一個定位對象既忆,執(zhí)行點擊操作

title[3].click()
for index, item in enumerate(ele_list):
print(index, item.text) ```
5.9 通過xpath方式定位一組元素
方法:find_elements_by_xpath(xpath_value) # xpath_value:為可以定位到元素的xpath語句
業(yè)務場景:

  1. 進入設置頁面
  2. 點擊WLAN菜單欄(xpath中class屬性定位對象列表中第3個)
    代碼實現(xiàn):

定位到一組元素

title = driver.find_elements_by_xpath("http://*[contains(@class,'widget.TextView')]")

打印title類型,預期為list

print(type(title))

取title返回列表中的第一個定位對象嗦玖,執(zhí)行點擊操作

title[3].click()
六卷要、WebDriverWait 顯示等待操作
在一個超時時間范圍內(nèi)母债,每隔一段時間去搜索一次元素是否存在鳞上,如果存在返回定位對象萄凤,如果不存在直到超時時間到達扣典,報超時異常錯誤程梦。

方法:WebDriverWait(driver, timeout, poll_frequency).until(method)
參數(shù):
1.driver:手機驅(qū)動對象
2.timeout:搜索超時時間
3.poll_frequency:每次搜索間隔時間罩息,默認時間為0.5s
4.method:定位方法(匿名函數(shù))
匿名函數(shù):
lambda x: x
等價于python函數(shù):
def test(x):
return x
使用示例:
WebDriverWait(driver, timeout, poll_frequency).until(lambda x:x.find_elements_by_id(id_value))
解釋:
1.x傳入值為:driver荞胡,所以才可以使用定位方法。
函數(shù)運行過程:
1.實例化WebDriverWait類娱局,傳入driver對象彰亥,之后driver對象被賦值給WebDriverWait的一個類變量:self._driver
2.until為WebDriverWait類的方法,until傳入method方法(即匿名函數(shù))衰齐,之后method方法會被傳入self._driver
3.搜索到元素后until返回定位對象任斋,沒有搜索到函數(shù)until返回超時異常錯誤.
業(yè)務場景:
1.進入設置頁面
2.通過ID定位方式點擊搜索按鈕
代碼實現(xiàn):
from selenium.webdriver.support.wait import WebDriverWait # 導入WebDriverWait 類

超時時間為30s,每隔1秒搜索一次元素是否存在耻涛,如果元素存在返回定位對象并退出

search_button = WebDriverWait(driver, 30, 1).until(lambda driver:driver.find_element_by_id("com.android.settings:id/search"))
search_button.click()
driver.quit()
七废酷、APP元素信息操作API
本節(jié)講介紹手機端元素信息的獲取以及基本的輸入操作。

7.1. 點擊元素
ele.click()
7.2.發(fā)送數(shù)據(jù)到輸入框
方法:send_keys(vaue) # value:需要發(fā)送到輸入框內(nèi)的文本

業(yè)務場景:
1.打開設置
2.點擊搜索按鈕
3.輸入內(nèi)容abc

代碼實現(xiàn):

點擊搜索按鈕

driver.find_element_by_id("com.android.settings:id/search").click()

定位到輸入框并輸入abc

driver.find_element_by_id("android:id/search_src_text").send_keys("abc")
重點:大家可以將輸入的abc 改成 輸入中文抹缕,得到的結(jié)果:輸入框無任何值輸入且程序不會抱錯
解決輸入中文問題:

1.server 啟動參數(shù)增加兩個參數(shù)配置
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True

2.再次運行會發(fā)現(xiàn)運行成功
# 點擊搜索按鈕
driver.find_element_by_id("com.android.settings:id/search").click()
# 定位到輸入框并輸入abc
driver.find_element_by_id("android:id/search_src_text").send_keys("積云教育")
7.3. 清空輸入框內(nèi)容
方法:clear()
業(yè)務場景:
1.打開設置
2.點擊搜索按鈕
3.輸入內(nèi)容abc
4.刪除已輸入abc
代碼實現(xiàn):

點擊搜索按鈕

driver.find_element_by_id("com.android.settings:id/search").click()

定位到輸入框并輸入abc

input_text = driver.find_element_by_id("android:id/search_src_text")

輸入abc

input_text.send_keys("abc")
time.sleep(1)

刪除abc

input_text.clear()
7.4. 獲取元素的文本內(nèi)容
方法: text
業(yè)務場景:
1.進入設置
2.獲取所有元素class屬性為“android.widget.TextView”的文本內(nèi)容
代碼實現(xiàn):
ele_list = driver.find_elements_by_class_name("android.widget.TextView")
for e in ele_list:
print(e.text)
for index, item in enumerate(ele_list):
print(index, item.text)
執(zhí)行結(jié)果:
0 設置
1
2 移動數(shù)據(jù)網(wǎng)絡已關閉
3 無線和網(wǎng)絡
4 WLAN
5 "guest"
6 藍牙
7 已停用
8 流量使用情況
9 已使用 0 B 的數(shù)據(jù)
10 更多
11 設備
12 顯示
13 自動調(diào)節(jié)亮度功能已關閉
14 通知
15 已允許所有應用發(fā)送通知
7.5. 獲取元素的屬性值
方法: get_attribute(value) # value:元素的屬性
?? value='name' 返回content-desc / text屬性值
?? value='text' 返回text的屬性值
?? value='className' 返回 class屬性值澈蟆,只有 API=>18 才能支持
?? value='resourceId' 返回 resource-id屬性值,只有 API=>18 才能支持

業(yè)務場景:
1.進入設置
2.獲取搜索按鈕的content-desc屬性值

代碼實現(xiàn):

定位到搜索按鈕

get_value = driver.find_element_by_id("com.android.settings:id/search")
print(get_value.get_attribute("content-desc"))
執(zhí)行結(jié)果:
搜索
7.6. 獲取元素在屏幕上的坐標
方法:location
業(yè)務場景:
1.進入設置頁面
2.獲取搜索按鈕在屏幕的坐標位置
代碼實現(xiàn):

定位到搜索按鈕

get_value = driver.find_element_by_id("com.android.settings:id/search")

打印搜索按鈕在屏幕上的坐標

print(get_value.location)
{'y': 44, 'x': 408}
7.7. 獲取app包名和啟動名
獲取包名方法:current_package
獲取啟動名:current_activity
業(yè)務場景:
1.啟動設置
2.獲取包名和啟動名
代碼實現(xiàn):
print(driver.current_package)
print(driver.current_activity)
執(zhí)行結(jié)果:

com.tencent.news
.activity.SplashActivity

八卓研、APP元素事件操作API

8.1. 前置代碼

from appium import webdriver
# server 啟動參數(shù)
desired_caps = {}
# 設備信息
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'

# 聲明我們的driver對象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

8.2. swip滑動事件

??從一個坐標位置滑動到另一個坐標位置,只能是兩個點之間的滑動

  • 方法:swipe(start_x, start_y, end_x, end_y, duration=None)

  • 參數(shù):
    1.start_x:起點X軸坐標
    2.start_y:起點Y軸坐標
    3.end_x: 終點X軸坐標
    4.end_y,: 終點Y軸坐標
    5.duration: 滑動這個操作一共持續(xù)的時間長度趴俘,單位:ms

    • 業(yè)務場景:
      1.進入設置
      2.從坐標(148,659)滑動到坐標(148,248)
  • 代碼實現(xiàn):

    # 滑動沒有持續(xù)時間
    driver.swipe(188,659,148,248)
    # 滑動持續(xù)5秒的時間
    driver.swipe(188,659,148,248,5000)
    
    

8.3. scroll滑動事件

?? 從一個元素滑動到另一個元素,直到頁面自動停止

  • 方法:scroll(origin_el, destination_el)

  • 參數(shù):
    1.origin_el:滑動開始的元素
    2.destination_el:滑動結(jié)束的元素

  • 業(yè)務場景:
    1.進入設置頁
    2.模擬手指從存儲菜單位置 到 WLAN菜單位置的上滑操作

  • 代碼實現(xiàn):

    # 定位到存儲菜單欄
    el1 = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]")
    # 定位到WLAN菜單欄
    el2 = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")
    # 執(zhí)行滑動操作
    driver.scroll(el1,el2)
    
    

8.4. drag拖拽事件

?? 從一個元素滑動到另一個元素,第二個元素替代第一個元素原本屏幕上的位置

  • 方法:drag_and_drop(origin_el, destination_el)

  • 參數(shù):
    1.origin_el:滑動開始的元素
    2.destination_el:滑動結(jié)束的元素

  • 業(yè)務場景:
    1.進入設置頁
    2.模擬手指將存儲菜單 滑動到 WLAN菜單欄位置

  • 代碼實現(xiàn):

    # 定位到存儲菜單欄
    el1 = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]")
    # 定位到WLAN菜單欄
    el2 = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")
    # 執(zhí)行滑動操作
    driver.drag_and_drop(el1,el2)
    
    

8.5. 應用置于后臺事件

APP放置后臺奏赘,模擬熱啟動

  • 方法:background_app(seconds)

  • 參數(shù):
    1.seconds:停留在后臺的時間寥闪,單位:秒

  • 業(yè)務場景:
    1.進入設置頁
    2.將APP置于后臺5s

  • 代碼實現(xiàn):

    driver.background_app(5)
    
    
  • 效果:

    app置于后臺5s后,再次展示當前頁面
    
    

九磨淌、APP模擬手勢高級操作

TouchAction是AppiumDriver的輔助類疲憋,主要針對手勢操作,比如滑動梁只、長按缚柳、拖動等,原理是將一系列的動作放在一個鏈條中發(fā)送到服務器敛纲,服務器接受到該鏈條后喂击,解析各個動作,逐個執(zhí)行淤翔。

9.1. 前置代碼

from appium import webdriver
# server 啟動參數(shù)
desired_caps = {}
# 設備信息
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'

# 聲明我們的driver對象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

?? 所有手勢都要通過執(zhí)行函數(shù)才會運行.

9.2. 手指輕敲操作

模擬手指輕敲一下屏幕操作

  • 方法:tap(element=None, x=None, y=None)

  • 方法:perform() # 發(fā)送命令到服務器執(zhí)行操作

  • 參數(shù):
    1.element:被定位到的元素
    2.x:相對于元素左上角的坐標翰绊,通常會使用元素的X軸坐標
    3.y:通常會使用元素的Y軸坐標

  • 業(yè)務場景:
    1.進入設置
    2.點擊WLAN選項

  • 代碼實現(xiàn):

    # 通過元素定位方式敲擊屏幕
    el = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")
    TouchAction(driver).tap(el).perform()
    
    # 通過坐標方式敲擊屏幕,WLAN坐標:x=155,y=250
    # TouchAction(driver).tap(x=155,y=250).perform()
    
    

9.3. 手指按操作

模擬手指按下屏幕,按就要對應著離開.

  • 方法:press(el=None, x=None, y=None)

  • 方法:release() # 結(jié)束動作旁壮,手指離開屏幕

  • 參數(shù):
    1.element:被定位到的元素
    2.x:通常會使用元素的X軸坐標
    3.y:通常會使用元素的Y軸坐標

  • 業(yè)務場景:
    1.進入設置
    2.點擊WLAN選項

  • 代碼實現(xiàn):

    # 通過元素定位方式按下屏幕
    el = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")
    TouchAction(driver).press(el).release().perform()
    
    # 通過坐標方式按下屏幕监嗜,WLAN坐標:x=155,y=250
    # TouchAction(driver).press(x=155,y=250).release().perform()
    
    

9.4. 等待操作

  • 方法:wait(ms=0)

  • 參數(shù):
    ms:暫停的毫秒數(shù)

  • 業(yè)務場景:
    1.進入設置
    2.點擊WLAN選項
    3.長按WiredSSID選項5秒

  • 代碼實現(xiàn):

    # 點擊WLAN
    driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]").click()
    # 定位到WiredSSID
    el =driver.find_element_by_id("android:id/title")
    # 通過元素定位方式長按元素
    TouchAction(driver).press(el).wait(5000).perform()
    
    # 通過坐標方式模擬長按元素
    # 添加等待(有長按)/不添加等待(無長按效果)
    # TouchAction(driver).press(x=770,y=667).wait(5000).release().perform()
    
    

9.5. 手指長按操作

模擬手機按下屏幕一段時間,按就要對應著離開.

  • 方法:long_press(el=None, x=None, y=None, duration=1000)

  • 參數(shù):
    1.element:被定位到的元素
    2.x:通常會使用元素的X軸坐標
    3.y:通常會使用元素的Y軸坐標
    4.duration:持續(xù)時間,默認為1000ms

  • 業(yè)務場景:
    1.進入設置
    2.點擊WLAN選項
    3.長按WiredSSID選項5秒

  • 代碼實現(xiàn):

    # 點擊WLAN
    driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]").click()
    # 定位到WiredSSID
    el =driver.find_element_by_id("android:id/title")
    # 通過元素定位方式長按元素
    TouchAction(driver).long_press(el,duration=5000).release().perform()
    
    # 通過坐標方式長按元素抡谐,WiredSSID坐標:x=770,y=667
    # 添加等待(有長按)/不添加等待(無長按效果)
    # TouchAction(driver).long_press(x=770,y=667).perform()
    
    

9.6. 手指移動操作

模擬手機的滑動操作

  • 方法:move_to(el=None, x=None, y=None)

  • 參數(shù):
    1.el:定位的元素
    2.x:相對于前一個元素的X軸偏移量
    3.y:相對于前一個元素的Y軸偏移量

  • 業(yè)務場景1:
    1.進入設置
    2.向上滑動屏幕

  • 代碼實現(xiàn):

    # 定位到存儲
    el = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]")
    # 定位到更多
    el1 = driver.find_element_by_xpath("http://*[contains(@text,'更多')]")
    # 元素方式滑動
    TouchAction(driver).press(el).move_to(el1).release().perform()
    # 坐標的方式滑動
    # TouchAction(driver).press(x=240,y=600).wait(100).move_to(x=240,y=100).release().perform()
    # 注意press連接一個move_to實際調(diào)用的是swip方法裁奇,可在log中查詢,不要給相對坐標麦撵。
    
    
  • 業(yè)務場景2:
    1.進入設置
    2.向上滑動屏幕到可見"安全"選項
    3.進入到安全
    4.點擊屏幕鎖定方式
    5.點擊圖案
    6.繪制圖案

  • 代碼實現(xiàn):

    # 定位到WLAN
    el1 = driver.find_element_by_xpath("http://*[contains(@text,'WLAN')]")
    # 定位到存儲
    el2 = driver.find_element_by_xpath("http://*[contains(@text,'存儲')]")
    # 存儲上滑到WLAN
    driver.drag_and_drop(el2,el1)
    # 定位到用戶
    el3 = driver.find_element_by_xpath("http://*[contains(@text,'用戶')]")
    # 注意 這次使用drag_and_drop方法刽肠,傳入的"存儲定位"仍使用其原始在屏幕上的位置溃肪,所以是由存儲滑動到用戶才可以上滑,否則需要重新"定位存儲"
    # 存儲上滑倒用戶位置
    driver.drag_and_drop(el2,el3)
    # 點擊安全按鈕
    driver.find_element_by_xpath("http://*[contains(@text,'安全')]").click()
    # 點擊屏幕鎖定方式按鈕
    driver.find_element_by_xpath("http://*[contains(@text,'屏幕鎖定')]").click()
    # 點擊圖案按鈕
    driver.find_element_by_xpath("http://*[contains(@text,'圖案')]").click()
    # 繪制圖案四個坐標 1:(244,967) 2:(723,967) 3:(723,1442) 4:(244,1916)
    TouchAction(driver).press(x=244,y=967).wait(100).move_to(x=479,y=0).wait(100)\
              .move_to(x=0,y=475).wait(100).move_to(x=-479,y=474).release().perform()
    
    

十音五、手機操作API

針對手機的一些常用設置功能進行操作.

10.1. 前置代碼

from appium import webdriver
# server 啟動參數(shù)
desired_caps = {}
# 設備信息
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
# app的信息
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'

# 聲明我們的driver對象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

10.2. 獲取手機時間

  • 方法:device_time

  • 代碼實現(xiàn):

    # 獲取當前手機的時間
    print(driver.device_time)
    
    
  • 執(zhí)行結(jié)果:

    Wed Dec 27 08:52:45 EST 2017
    
    

10.3. 獲取手機的寬高

獲取手機的寬高惫撰,可以根據(jù)寬高做一些坐標的操作

  • 方法:get_window_size()
  • 代碼實現(xiàn):
print(driver.get_window_size())

  • 執(zhí)行結(jié)果:
{'height': 800, 'width': 480}

10.4. 發(fā)送鍵到設備

模擬系統(tǒng)鍵值的操作,比如操作home鍵躺涝,音量鍵,返回鍵等厨钻。

  • 參數(shù):
    keycode:發(fā)送給設備的關鍵代碼
    metastate:關于被發(fā)送的關鍵代碼的元信息,一般為默認值

  • 業(yè)務場景:
    1.打開設置
    2.按多次音量增加鍵

  • 代碼實現(xiàn):

    for i in range(3):
        driver.keyevent(24)
    
    

Appium---Android的keycode鍵值

adb命令使用
adb shell input keyevent XX(EventCode) #輸入對應的鍵值
adb shell input text "www.baidu.com"
#向瀏覽器發(fā)送文本

EventCode KeyEvent EventName
0 KEYCODE_UNKNOWN 未知鍵
1 KEYCODE_SOFT_LEFT 左鍵
2 KEYCODE_SOFT_RIGHT 右鍵
3 KEYCODE_HOME Home鍵
4 KEYCODE_BACK 返回鍵
5 KEYCODE_CALL 撥號鍵
6 KEYCODE_ENDCALL 掛機鍵
7 KEYCODE_0 按鍵“0”
8 KEYCODE_1 按鍵“1”
9 KEYCODE_2 按鍵“2”
10 KEYCODE_3 按鍵“3”
11 KEYCODE_4 按鍵“4”
12 KEYCODE_5 按鍵“5”
13 KEYCODE_6 按鍵“6”
14 KEYCODE_7 按鍵“7”
15 KEYCODE_8 按鍵“8”
16 KEYCODE_9 按鍵“9”
17 KEYCODE_STAR 按鍵“*”
18 KEYCODE_POUND 按鍵“#”
19 KEYCODE_DPAD_UP 導航鍵 向上
20 KEYCODE_DPAD_DOWN 導航鍵 向下
21 KEYCODE_DPAD_LEFT 導航鍵 向左
22 KEYCODE_DPAD_RIGHT 導航鍵 向右
23 KEYCODE_DPAD_CENTER 導航鍵 確定
24 KEYCODE_VOLUME_UP 音量鍵加
25 KEYCODE_VOLUME_DOWN 音量鍵減
26 KEYCODE_POWER 電源鍵
27 KEYCODE_CAMERA 相機鍵
28 KEYCODE_CLEAR 清除鍵
29 KEYCODE_A 按鍵“A”
30 KEYCODE_B 按鍵“B”
31 KEYCODE_C 按鍵“C”
32 KEYCODE_D 按鍵“D”
33 KEYCODE_E 按鍵“E”
34 KEYCODE_F 按鍵“F”
35 KEYCODE_G 按鍵“G”
36 KEYCODE_H 按鍵“H”
37 KEYCODE_I 按鍵“I”
38 KEYCODE_J 按鍵“J”
39 KEYCODE_K 按鍵“K”
40 KEYCODE_L 按鍵“L”
41 KEYCODE_M 按鍵“M”
42 KEYCODE_N 按鍵“N”
43 KEYCODE_O 按鍵“O”
44 KEYCODE_P 按鍵“P”
45 KEYCODE_Q 按鍵“Q”
46 KEYCODE_R 按鍵“R”
47 KEYCODE_S 按鍵“S”
48 KEYCODE_T 按鍵“T”
49 KEYCODE_U 按鍵“U”
50 KEYCODE_V 按鍵“V”
51 KEYCODE_W 按鍵“W”
52 KEYCODE_X 按鍵“X”
53 KEYCODE_Y 按鍵“Y”
54 KEYCODE_Z 按鍵“Z”
55 KEYCODE_COMMA 按鍵“,”
56 KEYCODE_PERIOD 按鍵‘.’
57 KEYCODE_ALT_LEFT 組合鍵 Alt+Left
58 KEYCODE_ALT_RIGHT 組合鍵 Alt+Right
59 KEYCODE_SHIFT_LEFT 組合鍵 Shift+Left
60 KEYCODE_SHIFT_RIGHT 組合鍵 Shift+Left
61 KEYCODE_TAB Tab鍵
62 KEYCODE_SPACE 空格鍵
63 KEYCODE_SYM 選擇輸入法
64 KEYCODE_EXPLORER 瀏覽器
65 KEYCODE_ENVELOPE 郵件
66 KEYCODE_ENTER 回車鍵
67 KEYCODE_DEL 退格鍵
68 KEYCODE_GRAVE 按鍵‘`’
69 KEYCODE_MINUS 按鍵‘-’
70 KEYCODE_EQUALS 按鍵‘=’
71 KEYCODE_LEFT_BRACKET 按鍵‘[’
72 KEYCODE_RIGHT_BRACKET 按鍵‘]’
73 KEYCODE_BACKSLASH 按鍵‘\’
74 KEYCODE_SEMICOLON 按鍵‘,’
75 KEYCODE_APOSTROPHE 按鍵‘'’(單引號)
76 KEYCODE_SLASH 按鍵‘/’
77 KEYCODE_AT 按鍵‘@’
78 KEYCODE_NUM 按鍵Number modifier
79 KEYCODE_HEADSETHOOK 按鍵Headset Hook
80 KEYCODE_FOCUS 拍照對焦鍵
81 KEYCODE_PLUS 按鍵‘+’
82 KEYCODE_MENU 菜單鍵
83 KEYCODE_NOTIFICATION 通知鍵
84 KEYCODE_SEARCH 搜索鍵
85 TAG_LAST_KEYCODE

10.5. 操作手機通知欄

打開手機的通知欄坚嗜,可以獲取通知欄的相關信息和元素操作

  • 方法:open_notifications()
  • 業(yè)務場景:
    1.啟動設置
    2.打開通知欄
  • 代碼實現(xiàn):
driver.open_notifications()

10.6. 獲取手機當前網(wǎng)絡

獲取手機當前連接的網(wǎng)絡

  • 方法:network_connection
  • 業(yè)務場景:獲取手機當前網(wǎng)絡模式
  • 代碼實現(xiàn):
print(driver.network_connection)

  • 執(zhí)行結(jié)果:
6

Value (Alias) Data Wifi Airplane Mode
0 (None) 0 0 0
1 (Airplane Mode) 0 0 1
2 (Wifi only) 0 1 0
4 (Data only) 1 0 0
6 (All network on) 1 1 0

10.7. 設置手機網(wǎng)絡

更改手機的網(wǎng)絡模式夯膀,模擬特殊網(wǎng)絡情況下的測試用例

  • 方法:set_network_connection(connectionType)
  • 參數(shù):
    connectionType:需要被設置成為的網(wǎng)絡類型
  • 業(yè)務場景:
    1.啟動設置
    2.設置手機網(wǎng)絡為飛行模式
  • 代碼實現(xiàn):
driver.set_network_connection(1)

10.8. 手機截圖

截取手機當前屏幕,保存指定格式圖片到設定位置

  • 方法:get_screenshot_as_file(filename)

  • 參數(shù):
    filename:指定路徑下苍蔬,指定格式的圖片.

  • 業(yè)務場景:
    1.打開設置頁面
    2.截圖當前頁面保存到當前目錄诱建,命名為screen.png

  • 代碼實現(xiàn):

    import os
    driver.get_screenshot_as_file(os.getcwd() + os.sep + './screen.png')
    
    
  • 執(zhí)行結(jié)果:
    當前目錄下會生成screen.png文件

十一、腳本錄制

11.1. 認識界面

image

11.2. 點擊開始錄制按鍵開始錄制腳本

  1. 點擊頂部導航欄左側(cè)第一個“選擇元素”按鍵選定搜索欄银室,然后點擊右邊點“點擊”按鍵進行操作(錄制過程就是先選擇錄制窗口左邊的APP元素涂佃,然后錄制窗口右邊的操作方式)。

  2. 錄制完成后點擊“停止錄制”按鍵蜈敢,錄制窗口右上角會同步顯示操作代碼辜荠,選擇代碼類型,將模板代碼轉(zhuǎn)換成正式代碼抓狭,復制代碼到Pycharm伯病。

  3. 代碼復制到pycharm后,最好是在每個操作或者頁面切換處加上等待時間否过,否則會因為網(wǎng)速午笛、APP設計問題或者其他原因,無法及時到達下一個頁面苗桂,導致APPIUM無法獲取頁面元素而定位元素失敗药磺,在pycharm運行時報錯煤伟。代碼編輯好后點擊pycharm的運行按鍵癌佩,APPium就會在手機上面自動運行腳本了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末便锨,一起剝皮案震驚了整個濱河市围辙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌放案,老刑警劉巖姚建,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吱殉,居然都是意外死亡掸冤,警方通過查閱死者的電腦和手機厘托,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贩虾,“玉大人催烘,你說我怎么就攤上這事沥阱《邪眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵考杉,是天一觀的道長策精。 經(jīng)常有香客問我,道長崇棠,這世上最難降的妖魔是什么咽袜? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮枕稀,結(jié)果婚禮上询刹,老公的妹妹穿的比我還像新娘。我一直安慰自己萎坷,他們只是感情好凹联,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哆档,像睡著了一般蔽挠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓜浸,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天澳淑,我揣著相機與錄音,去河邊找鬼插佛。 笑死杠巡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的雇寇。 我是一名探鬼主播氢拥,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谢床!你這毒婦竟也來了兄一?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤识腿,失蹤者是張志新(化名)和其女友劉穎出革,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渡讼,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡骂束,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年耳璧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片展箱。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡旨枯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出混驰,到底是詐尸還是另有隱情攀隔,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布栖榨,位于F島的核電站昆汹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏婴栽。R本人自食惡果不足惜满粗,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愚争。 院中可真熱鬧映皆,春花似錦、人聲如沸轰枝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狸膏。三九已至沟饥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湾戳,已是汗流浹背贤旷。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砾脑,地道東北人幼驶。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像韧衣,于是被迫代替她去往敵國和親盅藻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容