目錄
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熱啟動的時候,就會常用到該命令。