第七單元 APP移動端測試高級 Appium---Android的keycode鍵值

一、Appium介紹

Appium是一個移動端的自動化框架,可用於測試原生應用、移動網頁應用和混合型應用,且是跨平臺的。可用於IOS和Android以及firefox的操作系統。

原生的應用是指用android或ios的sdk編寫的應用;移動網頁應用是指網頁應用,類似於ios中safari應用或者Chrome應用或者類瀏覽器的應用;混合應用是指一種包裹webview的應用,原生應用於網頁內容交互性的應用。

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

二、環境搭建

主要幾個點如下:


1. appium安裝

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



啓動成功展示如下:


2. Appium庫安裝

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

三、Appium使用

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

①打開手機應用
②打開Appium
③創建一個python項目,並創建一個文件
④將下面代碼複製到文件中
⑤獲取當前應用包名和啓動activity並修改文件

from appium import webdriver
# server 啓動參數
desired_caps = dict()
# 設備信息
# 平臺信息,不區分大小寫
desired_caps['platformName'] = 'Android'
# 系統版本,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. 腳本內啓動其他app

driver.start_activity(appPackage,appActivity)

3. 關閉app

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

4. 關閉驅動對象

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

三、App基礎操作API

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

3.1前置代碼

# server 啓動參數

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) 

參數:app_path:腳本機器中APK文件路徑

3.3 手機中移除APP

driver.remove_app(app_id) 

參數:app_id:需要卸載的app包名

3.4 判斷APP是否已安裝

driver.is_app_installed(bundle_id) 

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

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

path:手機設備上的路徑(例如:/sdcard/a.txt)
data:文件內數據,要求base64編碼
Python3.x中字符都爲unicode編碼,而b64encode函數的參數爲byte類型,需要先轉碼;
生成的數據爲byte類型,需要將byte轉換回去。

3.6 從手機中拉取文件

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

參數: path: 手機設備上的路徑

3.7獲取當前屏幕內元素結構

driver.page_source  

作用:返回當前頁面的文檔結構,判斷特定的元素是否存在

四、手機控件查看工具uiautomatorviewer

4.1 工具簡介

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

4.1 如何使用

  1. 進入SDK目錄下的tools目錄,打開uiautomatorviewer
  2. 電腦連接真機或打開android模擬器
  3. 啓動待測試app
  4. 點擊uiautomatorviewer的左上角Device Screenshot,會生成app當前頁面的UI控件截圖


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


五、APP元素定位操作

手工測試主要通過可見按鈕操作,而自動化是通過元素進行交互操作。
元素的基本定位基於當前屏幕範圍內展示的可見元素。

5.1 Appium常用元素定位方式

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

5.2 前置代碼

from appium import webdriver
# server 啓動參數
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屬性值
  • 業務場景:
    1. 進入設置頁面
    2. 通過ID定位方式點擊搜索按鈕
  • 代碼實現:
    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屬性值
  • 業務場景:
    1. 進入設置頁面
    2. 點擊搜索按鈕
    3. 通過class定位方式點擊輸入框的返回按鈕
  • 代碼實現:
# 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可以是部分值
  • 業務場景:
    1. 進入設置頁面
    2. 點擊WLAN菜單欄
  • 代碼實現:
    # xpath 點擊WLAN按鈕
    driver.find_element_by_xpath("//*[contains(@text,'WLA')]").click()
    

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

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

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

  • 方法: find_elements_by_id(id_value) # id_value:爲元素的id屬性值
  • 業務場景:
    1. 進入設置頁面
    2. 點擊WLAN菜單欄(id定位對象列表中第1個)
  • 代碼實現:
    # 定位到一組元素
    title = driver.find_elements_by_id("com.android.settings:id/title")
    # 打印title類型,預期爲list
    print(type(title))
    # 取title返回列表中的第一個定位對象,執行點擊操作
    title[0].click()
    

5.8 通過class方式定位一組元素

  • 方法:find_elements_by_class_name(class_value) # class_value:爲元素的class屬性值
  • 業務場景:
    1.進入設置頁面
    2.點擊WLAN菜單欄(class定位對象列表中第3個)
  • 代碼實現:
    title = driver.find_elements_by_class_name("android.widget.TextView")
    # 打印title類型,預期爲list
    print(type(title))
    # 取title返回列表中的第一個定位對象,執行點擊操作
    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語句
  • 業務場景:
    1. 進入設置頁面
    2. 點擊WLAN菜單欄(xpath中class屬性定位對象列表中第3個)
  • 代碼實現:
    # 定位到一組元素
    title = driver.find_elements_by_xpath("//*[contains(@class,'widget.TextView')]")
    # 打印title類型,預期爲list
    print(type(title))
    # 取title返回列表中的第一個定位對象,執行點擊操作
    title[3].click()
    

六、WebDriverWait 顯示等待操作

在一個超時時間範圍內,每隔一段時間去搜索一次元素是否存在,如果存在返回定位對象,如果不存在直到超時時間到達,報超時異常錯誤。

  • 方法:WebDriverWait(driver, timeout, poll_frequency).until(method)
    參數:
    1.driver:手機驅動對象
    2.timeout:搜索超時時間
    3.poll_frequency:每次搜索間隔時間,默認時間爲0.5s
    4.method:定位方法(匿名函數)
  • 匿名函數:
    lambda x: x
    等價於python函數:
    def test(x):
    return x
  • 使用示例:
    WebDriverWait(driver, timeout, poll_frequency).until(lambda x:x.find_elements_by_id(id_value))
    
  • 解釋:
    1.x傳入值爲:driver,所以纔可以使用定位方法。
  • 函數運行過程:
    1.實例化WebDriverWait類,傳入driver對象,之後driver對象被賦值給WebDriverWait的一個類變量:self._driver
    2.until爲WebDriverWait類的方法,until傳入method方法(即匿名函數),之後method方法會被傳入self._driver
    3.搜索到元素後until返回定位對象,沒有搜索到函數until返回超時異常錯誤.
  • 業務場景:
    1.進入設置頁面
    2.通過ID定位方式點擊搜索按鈕
  • 代碼實現:
    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

本節講介紹手機端元素信息的獲取以及基本的輸入操作。

7.1. 點擊元素

ele.click()

7.2.發送數據到輸入框

  • 方法:send_keys(vaue) # value:需要發送到輸入框內的文本

  • 業務場景:
    1.打開設置
    2.點擊搜索按鈕
    3.輸入內容abc

  • 代碼實現:

    # 點擊搜索按鈕
    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 改成 輸入中文,得到的結果:輸入框無任何值輸入且程序不會抱錯
    解決輸入中文問題:

      1.server 啓動參數增加兩個參數配置
          desired_caps['unicodeKeyboard'] = True
          desired_caps['resetKeyboard'] = True
    
      2.再次運行會發現運行成功
          # 點擊搜索按鈕
          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. 清空輸入框內容

  • 方法:clear()
  • 業務場景:
    1.打開設置
    2.點擊搜索按鈕
    3.輸入內容abc
    4.刪除已輸入abc
  • 代碼實現:
    # 點擊搜索按鈕
    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. 獲取元素的文本內容

  • 方法: text
  • 業務場景:
    1.進入設置
    2.獲取所有元素class屬性爲“android.widget.TextView”的文本內容
  • 代碼實現:
    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)
    
  • 執行結果:
      0 設置
      1
      2 移動數據網絡已關閉
      3 無線和網絡
      4 WLAN
      5 "guest"
      6 藍牙
      7 已停用
      8 流量使用情況
      9 已使用 0 B 的數據
      10 更多
      11 設備
      12 顯示
      13 自動調節亮度功能已關閉
      14 通知
      15 已允許所有應用發送通知
    

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 才能支持

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

  • 代碼實現:

    # 定位到搜索按鈕
    get_value = driver.find_element_by_id("com.android.settings:id/search")
    print(get_value.get_attribute("content-desc"))
    執行結果:
            搜索
    

7.6. 獲取元素在屏幕上的座標

  • 方法:location
  • 業務場景:
    1.進入設置頁面
    2.獲取搜索按鈕在屏幕的座標位置
  • 代碼實現:
          # 定位到搜索按鈕
          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
  • 業務場景:
    1.啓動設置
    2.獲取包名和啓動名
  • 代碼實現:
    print(driver.current_package)
    print(driver.current_activity)
    
  • 執行結果:
    com.tencent.news
    .activity.SplashActivity
    

八、APP元素事件操作API

8.1. 前置代碼

    from appium import webdriver
    # server 啓動參數
    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)
  • 參數:
    1.start_x:起點X軸座標
    2.start_y:起點Y軸座標
    3.end_x: 終點X軸座標
    4.end_y,: 終點Y軸座標
    5.duration: 滑動這個操作一共持續的時間長度,單位:ms
    • 業務場景:
      1.進入設置
      2.從座標(148,659)滑動到座標(148,248)
  • 代碼實現:
    # 滑動沒有持續時間
    driver.swipe(188,659,148,248)
    # 滑動持續5秒的時間
    driver.swipe(188,659,148,248,5000)
    

8.3. scroll滑動事件

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

  • 方法:scroll(origin_el, destination_el)
  • 參數:
    1.origin_el:滑動開始的元素
    2.destination_el:滑動結束的元素
  • 業務場景:
    1.進入設置頁
    2.模擬手指從存儲菜單位置 到 WLAN菜單位置的上滑操作
  • 代碼實現:
    # 定位到存儲菜單欄
    el1 = driver.find_element_by_xpath("//*[contains(@text,'存儲')]")
    # 定位到WLAN菜單欄
    el2 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
    # 執行滑動操作
    driver.scroll(el1,el2)
    

8.4. drag拖拽事件

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

  • 方法:drag_and_drop(origin_el, destination_el)
  • 參數:
    1.origin_el:滑動開始的元素
    2.destination_el:滑動結束的元素
  • 業務場景:
    1.進入設置頁
    2.模擬手指將存儲菜單 滑動到 WLAN菜單欄位置
  • 代碼實現:
    # 定位到存儲菜單欄
    el1 = driver.find_element_by_xpath("//*[contains(@text,'存儲')]")
    # 定位到WLAN菜單欄
    el2 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
    # 執行滑動操作
    driver.drag_and_drop(el1,el2)
    

8.5. 應用置於後臺事件

APP放置後臺,模擬熱啓動

  • 方法:background_app(seconds)
  • 參數:
    1.seconds:停留在後臺的時間,單位:秒
  • 業務場景:
    1.進入設置頁
    2.將APP置於後臺5s
  • 代碼實現:
    driver.background_app(5)
    
  • 效果:
    app置於後臺5s後,再次展示當前頁面
    

九、APP模擬手勢高級操作

TouchAction是AppiumDriver的輔助類,主要針對手勢操作,比如滑動、長按、拖動等,原理是將一系列的動作放在一個鏈條中發送到服務器,服務器接受到該鏈條後,解析各個動作,逐個執行。

9.1. 前置代碼

from appium import webdriver
# server 啓動參數
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)

⚠️ 所有手勢都要通過執行函數纔會運行.

9.2. 手指輕敲操作

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

  • 方法:tap(element=None, x=None, y=None)
  • 方法:perform() # 發送命令到服務器執行操作
  • 參數:
    1.element:被定位到的元素
    2.x:相對於元素左上角的座標,通常會使用元素的X軸座標
    3.y:通常會使用元素的Y軸座標
  • 業務場景:
    1.進入設置
    2.點擊WLAN選項
  • 代碼實現:
    # 通過元素定位方式敲擊屏幕
    el = driver.find_element_by_xpath("//*[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() # 結束動作,手指離開屏幕
  • 參數:
    1.element:被定位到的元素
    2.x:通常會使用元素的X軸座標
    3.y:通常會使用元素的Y軸座標
  • 業務場景:
    1.進入設置
    2.點擊WLAN選項
  • 代碼實現:
    # 通過元素定位方式按下屏幕
    el = driver.find_element_by_xpath("//*[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)
  • 參數:
    ms:暫停的毫秒數
  • 業務場景:
    1.進入設置
    2.點擊WLAN選項
    3.長按WiredSSID選項5秒
  • 代碼實現:
    # 點擊WLAN
    driver.find_element_by_xpath("//*[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)
  • 參數:
    1.element:被定位到的元素
    2.x:通常會使用元素的X軸座標
    3.y:通常會使用元素的Y軸座標
    4.duration:持續時間,默認爲1000ms
  • 業務場景:
    1.進入設置
    2.點擊WLAN選項
    3.長按WiredSSID選項5秒
  • 代碼實現:
    # 點擊WLAN
    driver.find_element_by_xpath("//*[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)
  • 參數:
    1.el:定位的元素
    2.x:相對於前一個元素的X軸偏移量
    3.y:相對於前一個元素的Y軸偏移量
  • 業務場景1:
    1.進入設置
    2.向上滑動屏幕
  • 代碼實現:
    # 定位到存儲
    el = driver.find_element_by_xpath("//*[contains(@text,'存儲')]")
    # 定位到更多
    el1 = driver.find_element_by_xpath("//*[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實際調用的是swip方法,可在log中查詢,不要給相對座標。
    
  • 業務場景2:
    1.進入設置
    2.向上滑動屏幕到可見"安全"選項
    3.進入到安全
    4.點擊屏幕鎖定方式
    5.點擊圖案
    6.繪製圖案
  • 代碼實現:
    # 定位到WLAN
    el1 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
    # 定位到存儲
    el2 = driver.find_element_by_xpath("//*[contains(@text,'存儲')]")
    # 存儲上滑到WLAN
    driver.drag_and_drop(el2,el1)
    # 定位到用戶
    el3 = driver.find_element_by_xpath("//*[contains(@text,'用戶')]")
    # 注意 這次使用drag_and_drop方法,傳入的"存儲定位"仍使用其原始在屏幕上的位置,所以是由存儲滑動到用戶纔可以上滑,否則需要重新"定位存儲"
    # 存儲上滑倒用戶位置
    driver.drag_and_drop(el2,el3)
    # 點擊安全按鈕
    driver.find_element_by_xpath("//*[contains(@text,'安全')]").click()
    # 點擊屏幕鎖定方式按鈕
    driver.find_element_by_xpath("//*[contains(@text,'屏幕鎖定')]").click()
    # 點擊圖案按鈕
    driver.find_element_by_xpath("//*[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 啓動參數
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
  • 代碼實現:
    # 獲取當前手機的時間
    print(driver.device_time)
    
  • 執行結果:
    Wed Dec 27 08:52:45 EST 2017
    

10.3. 獲取手機的寬高

獲取手機的寬高,可以根據寬高做一些座標的操作

  • 方法:get_window_size()
  • 代碼實現:
print(driver.get_window_size())
  • 執行結果:
{'height': 800, 'width': 480}

10.4. 發送鍵到設備

模擬系統鍵值的操作,比如操作home鍵,音量鍵,返回鍵等。

  • 參數:
    keycode:發送給設備的關鍵代碼
    metastate:關於被髮送的關鍵代碼的元信息,一般爲默認值
  • 業務場景:
    1.打開設置
    2.按多次音量增加鍵
  • 代碼實現:
    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"
#向瀏覽器發送文本

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()
  • 業務場景:
    1.啓動設置
    2.打開通知欄
  • 代碼實現:
driver.open_notifications()

10.6. 獲取手機當前網絡

獲取手機當前連接的網絡

  • 方法:network_connection
  • 業務場景:獲取手機當前網絡模式
  • 代碼實現:
print(driver.network_connection)
  • 執行結果:
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. 設置手機網絡

更改手機的網絡模式,模擬特殊網絡情況下的測試用例

  • 方法:set_network_connection(connectionType)
  • 參數:
    connectionType:需要被設置成爲的網絡類型
  • 業務場景:
    1.啓動設置
    2.設置手機網絡爲飛行模式
  • 代碼實現:
driver.set_network_connection(1)

10.8. 手機截圖

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

  • 方法:get_screenshot_as_file(filename)
  • 參數:
    filename:指定路徑下,指定格式的圖片.
  • 業務場景:
    1.打開設置頁面
    2.截圖當前頁面保存到當前目錄,命名爲screen.png
  • 代碼實現:
    import os
    driver.get_screenshot_as_file(os.getcwd() + os.sep + './screen.png')
    
  • 執行結果:
    當前目錄下會生成screen.png文件

十一、腳本錄製

11.1. 認識界面

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

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

  2. 錄製完成後點擊“停止錄製”按鍵,錄製窗口右上角會同步顯示操作代碼,選擇代碼類型,將模板代碼轉換成正式代碼,複製代碼到Pycharm。

  3. 代碼複製到pycharm後,最好是在每個操作或者頁面切換處加上等待時間,否則會因爲網速、APP設計問題或者其他原因,無法及時到達下一個頁面,導致APPIUM無法獲取頁面元素而定位元素失敗,在pycharm運行時報錯。代碼編輯好後點擊pycharm的運行按鍵,APPium就會在手機上面自動運行腳本了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章