『與善仁』Appium基礎 — 16、APPium基礎操作API

繁華似錦Fighting發表於2021-12-04

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'

# 宣告driver物件
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

2、安裝和解除安裝APP

(1)把電腦中的APK安裝包,安裝到手機上。

安裝方法:

driver.install_app(app_path)

引數:
  app_path:指令碼機器中APK檔案路徑

(2)解除安裝手機上已安裝的APP。

解除安裝方法:

driver.remove_app(app_id)

引數:
  app_id:需要解除安裝的app包名

(3)演示練習

# 1.匯入appium
import time
from appium import webdriver

# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
    "platformName": "Android",  # 系統名稱
    "platformVersion": "7.1.2",  # 系統版本
    "deviceName": "127.0.0.1:21503",  # 裝置名稱
    "appPackage": "com.microvirt.launcher2",  # APP包名
    "appActivity": "com.microvirt.launcher.Launcher"  # APP啟動名
}

# 3.啟動APP
# 宣告手機驅動物件(例項化webdriver)
# 第一個引數為appium服務的地址,需要啟動appium服務。
# 第二個引數為Desired capabilities物件
# 我們就先傳入這兩個引數就可以了。
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)


# 4.操作APP
# 指令碼機器中APK檔案路徑,注意前邊要加一個r,不然解析地址時可能會報錯。
app_path = r'C:\Users\L\Desktop\com.taobao.taobao_V9.15.0.apk'
# 安裝apk
driver.install_app(app_path)
time.sleep(5)

# 要知道即將解除安裝的app的包名
app_id = "com.taobao.taobao"
# 解除安裝APP
driver.remove_app(app_id)

# 5.關閉APP
time.sleep(3)
driver.quit()

說明:

  • 一般這兩個命令很少使用,即使用命令安裝apk軟體,一般我們也推薦使用adb命令。就不用把安裝APP的程式碼寫入指令碼中,即使寫入指令碼,最終執行也是adb命令。如果公司的測試機充裕,我們就把APP的安裝包放入手機,直接手動安裝了。

  • 一般用到這兩個命令是在一個指令碼要去測試多個APP的時候,會用到這兩個命令,在測試時把這幾個APP先安裝上,測試完成之後在解除安裝APP。但是這種情況也基本上不多,一般情況APP都單獨測試。

3、判斷APP是否已安裝

使用的API:

driver.is_app_installed(bundle_id)

引數:
  bundle_id: 傳⼊app包名,返回結果為True(已安裝) / False(未安裝)

示例:

# 1.匯入appium
import time
from appium import webdriver

# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
    "platformName": "Android",  # 系統名稱
    "platformVersion": "7.1.2",  # 系統版本
    "deviceName": "127.0.0.1:21503",  # 裝置名稱
    "appPackage": "com.microvirt.launcher2",  # APP包名
    "appActivity": "com.microvirt.launcher.Launcher"  # APP啟動名
}

# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)


# 4.操作APP
# 指令碼機器中APK⽂件路徑
app_path = r'C:\Users\L\Desktop\com.taobao.taobao_V9.15.0.apk'
# 安裝apk
driver.install_app(app_path)
time.sleep(5)

# 要知道即將解除安裝的APP的包名
bundle_id = "com.taobao.taobao"
result = driver.is_app_installed(bundle_id)
# 結果是result=true
print(result)

# 5.關閉APP
time.sleep(3)
driver.quit()

提示:一般我們用眼看APP是否安裝就可以了,指令碼中明確需要的時候再寫。

4、關閉APP軟體和關閉驅動物件

關閉APP軟體和關閉驅動物件的區別:

  • driver.close_app()

    閉當前操作的APP,不會關閉驅動物件。

  • driver.quit()

    關閉驅動物件,同時關閉所有關聯的APP。

5、傳送檔案到手機和獲取手機中的檔案

(1)傳送檔案到手機

程式碼片段:

# 匯入base64庫
import base64

# 將檔案轉換成二進位制檔案
with open(file_path,'rb') as fp:
    data = str(base64.b64encode(fp.read()),'utf-8')
	# print(data)

# 將轉換格式的檔案傳送到手機
driver.push_file(path, data)

引數說明:

  • file_path:需要上傳的檔案路徑。
  • path:手機裝置上的路徑(例如:/sdcard/a.txt)
  • data:檔案內資料,要求base64編碼。

說明:

Python3.x中字元都為unicode編碼,需要先匯入base64庫進行編碼和解碼,先把檔案轉成base64格式的二進位制檔案,然後進行檔案傳遞到手機,因為裝置之間傳遞是二進位制的。

(2)從手機中拉取檔案

程式碼片段:

import base64

# 返回資料為base64編碼的資料
data = driver.pull_file(path) 

# base64解碼
with open('a.txt','wb') as fp:
	fp.write(base64.b64decode(data)) 

引數:

path:手機裝置上的路徑例如: /sdcard/a.txt

(3)示例:

# 1.匯入appium
import time
from appium import webdriver
import base64

# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
    "platformName": "Android",  # 系統名稱
    "platformVersion": "7.1.2",  # 系統版本
    "deviceName": "127.0.0.1:21503",  # 裝置名稱
    "appPackage": "com.cyanogenmod.filemanager",  # APP包名
    "appActivity": ".activities.NavigationActivity"  # APP啟動名
}

# 3.啟動APP
# 宣告手機驅動物件(例項化webdriver)
# 第一個引數為appium服務的地址,需要啟動appium服務。
# 第二個引數為Desired capabilities物件
# 我們就先傳入這兩個引數就可以了。
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)

# 4.操作APP

# 4.1 傳送檔案到手機
file_path = r'C:\Users\L\Desktop\test.txt'

# 將檔案轉換成二進位制檔案
with open(file_path, 'rb') as fp:
    data = str(base64.b64encode(fp.read()), 'utf-8')
    # print(data)

# 將轉換格式的檔案傳送到手機
path = r'/sdcard/test.txt'
driver.push_file(path, data)

# 4.2 從手機中拉取檔案到電腦上
# 手機中檔案的路徑
path_app = '/sdcard/test.txt'
# 返回資料為base64編碼的資料
data = driver.pull_file(path_app)

print(data)

# base64解碼
with open('test.txt', 'wb') as fp:
    fp.write(base64.b64decode(data))

# 提示:該檔案會拉取到指令碼檔案所在的目錄中

# 5.關閉APP
time.sleep(5)
driver.quit()

6、獲取當前螢幕內元素結構(重點)

(也就是獲取當前螢幕的原始碼)

使用的API:

driver.page_source

作用:
  返回當前頁面的文件結構,可以為後續判斷特定的元素是否存在提供前提。

示例:

# 1.匯入appium
import time
from appium import webdriver

# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
    "platformName": "Android",  # 系統名稱
    "platformVersion": "7.1.2",  # 系統版本
    "deviceName": "127.0.0.1:21503",  # 裝置名稱
    "appPackage": "com.android.settings",  # APP包名
    "appActivity": ".Settings"  # APP啟動名
}

# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)

# 4.操作APP
# 獲取當前頁面原始碼
# 只是設定首頁中的頁面原始碼
source = driver.page_source
# # print(source)

# 將APP的頁面原始碼儲存到一個檔案中
with open("source.txt", "w", encoding="UTF-8") as fp:
    fp.write(source)

# 5.關閉APP
time.sleep(3)
driver.quit()

7、指令碼內啟動其他APP

使用的API:

driver.start_activity(appPackage,appActivity)

# 提示:appPackage,appActivity為所要啟動APP的包名和啟動名

示例:

# 從管理app頁面中開啟檔案管理器app

# 1.匯入appium
import time
from appium import webdriver

# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
    "platformName": "Android",  # 系統名稱
    "platformVersion": "7.1.2",  # 系統版本
    "deviceName": "127.0.0.1:21503",  # 裝置名稱
    "appPackage": "com.android.settings",  # APP包名
    "appActivity": ".Settings"  # APP啟動名
}

# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)

# 4.操作APP
# 從設定APP頁面啟動檔案管理器APP
time.sleep(3)

# 先用adb命令獲取檔案管理器的包名和啟動名
# com.cyanogenmod.filemanager/.activities.NavigationActivity
driver.start_activity("com.cyanogenmod.filemanager", ".activities.NavigationActivity")

# 5.關閉APP
time.sleep(3)
driver.quit()

8、將應用程式置於後臺執行(重點)

使用的API:

# 將應用置於後臺執行(秒)
driver.background_app()

示例:

# 1.匯入appium
import time
from appium import webdriver

# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
    "platformName": "Android",  # 系統名稱
    "platformVersion": "7.1.2",  # 系統版本
    "deviceName": "127.0.0.1:21503",  # 裝置名稱
    "appPackage": "com.android.settings",  # APP包名
    "appActivity": ".Settings"  # APP啟動名
}

# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)

# 4.操作APP
time.sleep(3)
# 將設定APP置於後臺執行
# 將應用在後臺執行5秒,返回前臺
driver.background_app(5)

# 提示:測試前最好把裝置中所有後臺執行的APP都關閉掉。

# 5.關閉APP
time.sleep(3)
driver.quit()

提示:在測試APP熱啟動的時候,就會常用到該命令。

相關文章