手机测试相关
appium環(huán)境安裝包百度網(wǎng)盤地址
鏈接:https://pan.baidu.com/s/1pvNb5AzYVzIq5tWjoJJhLg
提取碼:ghaj
文章目錄
- monkey、monkeyRuner、Appium、UIAutomator、對比
- 附錄:快捷鍵
- 在線數(shù)據(jù)生成datagenerator
- cmd命令
- adb命令
- 查看端口號占用
- Linux
- window
- web日志
- andriod日志
- Log信息級別
- appium腳本生成步驟
- 模板腳本
- uiautomotor輔助定位
- Monkey
- 陌匠測試步驟:
- Monkeyrunner
- **運行方式**
- **示例腳本**
- MonkeyDevice 方法
- waitForConnection()
- MonkeyIamge
- 一、ADB調(diào)試橋作用
- ADB子命令參考
- 查看日志
- 向模擬器傳送.apk文件并安裝
- 根據(jù)包名卸載APP
- 查看包名和主活動
- 1.有apk
- a, aapt dump badging 路徑
- b, 文件夾內(nèi)找
- 2.無apk
- 單開設(shè)備
- a.查看log,Displayed
- b.命令行
- linux命令
- window10
- 或者
- 或者(不推薦)
- 或者(無效)
- 多開設(shè)備
- 僅獲取包名 Monkey
- 二、Monkey和MonkeyRunner
- Android自動化測試三種模式
- 1.基于隨機(jī)事件
- 2.基于坐標(biāo)點
- 3.基于控件
- 三、Monkeyrunner3大組件API:
- **首先導(dǎo)入工具包**
- 1)MonkeyRunner 工具類,提供工具方法
- 2)MonkeyDevice 表示某設(shè)備對象
- 3)MonkeyImage
- Appium安裝總體步驟 :
- 一、JDK安裝并設(shè)置
- 二、SDK安裝設(shè)置
- SDK重要目錄
- 必裝:Tools=>Options
- 配置環(huán)境變量
- 三、安裝ui測試工具
- AppiumDesktop
- 啟動Inspector
- 真機(jī)報錯解決
- UiAutomatorViewer
- UI測試工具概述
- 操作步驟
- 1.確認(rèn)安裝有adb
- 2.下載安裝模擬器
- 3.uiautomatorviewer.bat
- 常見問題解決
- adb連接夜神模擬器
- adb server version (31) doesn't match this client (36)
- 華為打開USB調(diào)試
- adb找不到真機(jī)
- 無法獲取真機(jī)截圖
- 四、安裝Appium-Python-Client
- 五、Pycharm配置
- 測試模板代碼
- Original error: Could not find 'adb.exe' in PATH.
- You are using pip version 9.0.1, however version 18.0 is available.
- Could not find a version that satisfies the requirement openpyxl (from versions: )
- 附錄:Genymotion模擬器
- 安裝Genymotion模擬器 (實測無效)
- VirtualBox問題總結(jié)
- 1.Virtualbox啟動報cannot access the kernel driver
- 2.安裝VirtualBox回滾
- 3.Your PC/Device needs to be repaired
- Genymotion問題總結(jié)
- 1.在線下載虛擬設(shè)備失敗
- 2.aapt: command not found
monkey、monkeyRuner、Appium、UIAutomator、對比
Monkey (壓力測試)
這個是Android提供的系統(tǒng)工具。它向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現(xiàn)對正在開發(fā)的應(yīng)用程序進(jìn)行壓力測試。Monkey測試是一種為了測試軟件的穩(wěn)定性、健壯性的快速有效的方法。
測試的對象僅為應(yīng)用程序包,有一定的局限性。 Monky測試使用的事件流數(shù)據(jù)流是隨機(jī)的,不能進(jìn)行自定義。 可對MonkeyTest的對象,事件數(shù)量,類型,頻率等進(jìn)行設(shè)置。monkeyRuner (功能測試,用戶接受度測試,黑盒測試),提供按鍵或觸摸事件的輸入數(shù)值,通過截屏對比是否是正常的運行。
UIAutomator - 官方 (黑盒測試,功能測試) ,可以測試需要在不同app之間切換的情況。找到UI控件然后進(jìn)行操作。 UiAutomator對外提供了UiAutomatorTestCase、 UiDevice、UiSelector、UiObject、UiCollection、 UiScrollable等重要的類
Appium是基于UIAutomator框架實現(xiàn)的一個開源、跨平臺的測試框架。Appium測試 (功能測試,用戶接受度測試,黑盒測試),findElements**(**)方法獲取到UI元素,獲取信息為主。沒有uiautomator的執(zhí)行速度快。
附錄:快捷鍵
在線數(shù)據(jù)生成datagenerator
需要全英文狀態(tài)下操作
https://www.onlinedatagenerator.com/
cmd命令
轉(zhuǎn)到指定盤:D:
回退到根目錄:cd\
adb命令
結(jié)束adb命令 :ctrl +C
退出adb shell:exit
退出monkeyrunner:ctrl+D
查看端口號占用
Linux
su
netstat -anlp | grep “631”
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 6184/cupsd
-a列出所有端口;-n使用數(shù)字,代替主機(jī)、端口和用戶名顯示;-l只顯示監(jiān)聽端口;-p顯示 PID 和進(jìn)程名稱;kill -9 6184 殺死進(jìn)程
window
netstat -ano | findstr “4723”
TCP 0.0.0.0:4723 0.0.0.0:0 LISTENING 11128
監(jiān)聽到pid 11128–ctrl+alt+delete任務(wù)管理器–詳細(xì)信息,找到PID11128,右鍵結(jié)束任務(wù),可以關(guān)閉已占用端口號
web日志
1.作用:取代print()方法,并且可以在日志文件中回溯。
2.日志類需要配置或者注意:
2.1.項目路徑和日志文件路徑
這里我配置了項目的路徑base_url,并且準(zhǔn)備新建一個log文件夾,用來放置log日志文件。
為了不用再手動去創(chuàng)建log文件夾和log日志文件,這里我進(jìn)行了判斷文件夾和日志文件是否存在,如果不存在則創(chuàng)建日志文件夾和文件。
2.2默認(rèn)level值
默認(rèn)入?yún)⒅杏心J(rèn):clevel、Flevel,如果有等級需要可以進(jìn)行更改
clevel:cmd輸出日志界面的日志等級
Flevel:日志文件的日志等級
在創(chuàng)建logger時,也對總的日志等級設(shè)置,這里我設(shè)置為了debug最低等級。
3.log類代碼
# -*-coding:utf-8 -*- import os import logging# 定義了blog_ui項目的絕對路徑 base_url = "E:/111test/blog_ui/"class Logger:def __init__(self, path=base_url + "/log/autotest.log", clevel=logging.DEBUG, Flevel=logging.INFO):# 判斷l(xiāng)og文件夾是否存在,不存在的話創(chuàng)建文件夾以及日志文件project_dir = os.listdir(base_url)dir_name = 'log' # log文件夾if dir_name not in project_dir:create_path = base_url + '/' + dir_nameos.makedirs(create_path)file = open(create_path + '/autotest.log', 'w', encoding='gb18030')file.close()# 創(chuàng)建loggerself.logger = logging.getLogger(path)self.logger.setLevel(logging.DEBUG)# 防止創(chuàng)建多個logger對象if not self.logger.handlers:# 設(shè)置日志格式fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')# 設(shè)置CMD日志sh = logging.StreamHandler()sh.setFormatter(fmt)sh.setLevel(clevel)# 設(shè)置文件日志fh = logging.FileHandler(path)fh.setFormatter(fmt)fh.setLevel(Flevel)self.logger.addHandler(sh)self.logger.addHandler(fh)def debug(self, message):self.logger.debug(message)def info(self, message):self.logger.info(message)def war(self, message):self.logger.warn(message)def error(self, message):self.logger.error(message)def cri(self, message):self.logger.critical(message)4.日志類的調(diào)用 demo.py
# 導(dǎo)入自定義的log類 from common.log import Logger# 實例化一個log對象 test_log = Logger()# 調(diào)用log類的方法: test_log.war("警告信息") test_log.info("普通信息") test_log.debug("詳細(xì)信息") test_log.error("錯誤信息") test_log.cri("嚴(yán)重錯誤")接下來加入日志后,就需要將之前的print方法逐個替換為log方法,并且在關(guān)鍵位置,例如:網(wǎng)址、元素定位地址、輸入值、斷言結(jié)果等信息,使用log日志來打印。
andriod日志
1.清理之前的日志緩存,從當(dāng)前開始顯示
adb logcat -c && adb logcat
2.日志加時間
adb logcat time //顯示日期,調(diào)用時間,優(yōu)先級/標(biāo)記,PID
3.logcat命令
adb logcat //顯示全部日志
adb logcat > D:\test.log //將日志保存到文件test.log
adb logcat 標(biāo)記1:I 標(biāo)記2:D *:S //根據(jù)tag標(biāo)記和級別過濾日志輸出
adb logcat *:W //顯示所有優(yōu)先級大于等于“warning”的日志
adb logcat -s 標(biāo)記1 //顯示標(biāo)記1的日志信息
grep匹配
adb logcat | grep “^E.MyApp”
adb logcat | grep “…MyApp|…MyActivity”
adb logcat | grep -E “…MyApp|…MyActivity” #使用 egrep 無須轉(zhuǎn)義符
Log信息級別
V — 明細(xì) verbose(最低優(yōu)先級)
D — 調(diào)試 debug
I — 信息 info
W — 警告 warn
E — 錯誤 error
F — 嚴(yán)重錯誤 fatal
S — 無記載 silent
從上而下級別逐次增加
appium腳本生成步驟
第一步:打開app
第二步:cmd命令行輸入,獲取包名和主活動,設(shè)備端口號
adb shell dumpsys window | findstr mCurrentFocus
mCurrentFocus=Window{3bc2728b u0 com.example.tarena.myappdemo2/com.example.tarena.myappdemo2.MainActivity2}
adb devices
List of devices attached
127.0.0.1:62001 device
第三步:
1.右鍵–以管理員身份運行appium(如失敗,退出再次以管理員運行appium即可),當(dāng)前l(fā)og獲取appium端口號:4723。
2.Start Inspector Session–Desired Capabilities–編輯并save as,方便下次直接使用
{
“platformName”: “Android”,
“platformVersion”: “5.1.1”,
“deviceName”: “YeShen”,
“appPackage”: “com.example.tarena.myappdemo2”,
“appActivity”: “com.example.tarena.myappdemo2.MainActivity2”
}
3.Start Session,點擊眼睛圖標(biāo)開始錄制頁面操作,完成操作后再次點擊眼睛圖標(biāo),結(jié)束。-- 頁面中間Recorder 選擇python,–copy code–粘貼到模板代碼【錄屏代碼】部分,放到pycham運行即可。
模板腳本
# -*- coding: utf-8 -* from appium import webdriver from appium.webdriver.common.touch_action import TouchAction from time import sleepdesired_caps={"automationName":"UiAutomator2","platformName": "Android","platformVersion": "5.1.1", # 1.設(shè)備版本號 模擬器--設(shè)置--關(guān)于電腦--android版本"deviceName": "127.0.0.1:62001", # 2.設(shè)備端口號 cmd--adb devices獲取"appPackage": "com.example.myappdemo3", #3.被測包名"appActivity": "com.example.myappdemo3.MainActivity", #4.被測主活動"unicodeKeyboard":True,# 支持中文輸入,默認(rèn)false"resetKeyboard":True,# 重置輸入法為系統(tǒng)默認(rèn),將鍵盤給隱藏起來"noReset": True, # 不重新安裝apk"noSign": True # 不重新簽名apk } driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)# 5.錄屏代碼sleep(3) driver.quit()uiautomotor輔助定位
# -*- coding: utf-8 -* from appium.webdriver.common.mobileby import MobileBy# text示例代碼: driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("確定")').click() driver.find_element_by_android_uiautomator('new UiSelector().text("擅長體育")').click() driver.find_element_by_android_uiautomator('new UiSelector().textContains("e")').click() driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("de")').click() driver.find_element_by_android_uiautomator('new UiSelector().textMatches(".*e.*")').click()# new UiSelector(). 可以省略 driver.find_element_by_android_uiautomator('text("擅長音樂" )').click()# description示例代碼 driver.find_element(MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().description("刪除")').click() driver.find_element_by_android_uiautomator('description("刪除")').click() driver.find_element_by_android_uiautomator('descriptionContains("除")').click() driver.find_element_by_android_uiautomator('descriptionStartsWith("刪")').click() driver.find_element_by_android_uiautomator('descriptionMatches(".*刪.*")').click()# resourceId例代碼: #find_element_by_android_uiautomator,與find_element_by_id功能基本一樣,但不能使用簡寫的id屬性值 driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,'resourceId("com.android.calculator2:id/d el")').click() driver.find_element_by_android_uiautomator('resourceId("com.android.calculator2:id/d el")').click() driver.find_element_by_android_uiautomator('resourceIdMatches(".*e.*")').click()# 在UI Selector中如果resource-id屬性值是 “com.android.calculator2:id/del”,不能簡寫為del。 driver.find_element_by_id("com.android.calculator2:id /del").click() driver.find_element_by_id("del").click() driver.find_element_by_android_uiautomator('resourceId("com.android.calculator2:id/d el")').click()# className # 頁面上的class屬性一般不唯一, 一般用于定位多個元素,用下標(biāo)(index或instance)獲得指定編號的那一個來操作。 driver.find_element_by_android_uiautomator('className("android.widget.Button")').click() driver.find_element_by_android_uiautomator('classNameMatches(".*Button")').click()# id與text屬性組合定位 driver.find_element_by_android_uiautomator('resourceId("com.android.calculator2:id/d el").text("del")').click()# index:在同一級中的編號,在兄弟類中組件的編號, index從0開始。 driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button").inde x(3)').click()# instance:同一個布局中同一類組件的編號,instance 從0開始 driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button").inst ance(12)').click()# 父子定位childSelector driver.find_element_by_android_uiautomator('resourc eId("android:id/content").childSelector(className("a ndroid.widget.LinearLayout").childSelector(text("Sho w Invisible Contacts (Only)")))').click()# 兄弟定位fromParent driver.find_element_by_android_uiautomator('text("S how Invisible Contacts (Only)").fromParent(className("android.widget.Butt on"))').click()# 逐級查找,先定位到某個祖先節(jié)點,再定位其后代節(jié)點 driver.find_element(MobileBy.XPATH,"//android.supp ort.v4.view.ViewPager")\.find_element(MobileBy.XPATH,"//android.widget.Lin earLayout")\.find_element(MobileBy.XPATH,"//android.view.ViewG roup[1]")\.find_element(MobileBy.XPATH,"//android.widget.But ton[3]").click()# 跳級查找 driver.find_element(MobileBy.XPATH,"//android.supp ort.v4.view.ViewPager").find_element(MobileBy.XPATH,"//android.widget.Button[3]").click()Monkey
1、cmd中輸入:
adb shell monkey
獲得monkey的運行幫助信息
注意:必須連接到設(shè)備才可獲得幫助信息
陌匠測試步驟:
1、準(zhǔn)備測試環(huán)境:adb驅(qū)動+手機(jī)驅(qū)動+數(shù)據(jù)線+手機(jī)真機(jī)+usb開啟調(diào)試模式
2、設(shè)計monkey命令
adb shell monkey -p cn.idcby.jiajubang -s 10 --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v - v -v 100 >D:\test.log
3、執(zhí)行命令跟蹤日志D:\test.log
4、日志分析:
crash(崩潰)/ANR(未響應(yīng))/exception(異常)/Force_closed(強(qiáng)制退出)/GC(內(nèi)存異常)
陌匠異常:crash–空指針異常造成的
// CRASH: cn.idcby.jiajubang (pid 1907)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException: Unable to create application cn.idcby.jiajubang.application.MyApplication: java.lang.NullPointerException
application cn.idcby.jiajubang.application.MyApplication: java.lang.NullPointerException
// at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4394)
Monkeyrunner
monkeyrunner
正常情況會進(jìn)入jython的環(huán)境,并且顯示其版本號,其次有>>>命令提示符
運行方式
1.cmd命令窗口–monkeyrunner–腳步逐行運行–回車 true
2.編寫批量python腳本并生成.py文件,cmd命令窗口–monkeyrunner D:\monkeyrunnertest.py
提示:實測無法在pycham中直接運行
示例腳本
# -*- coding: utf-8 -* from com.android.monkeyrunner import MonkeyRunner from com.android.monkeyrunner import MonkeyDevice from com.android.monkeyrunner import MonkeyImage device=MonkeyRunner.waitForConnection() #連接設(shè)備device.touch(438,750,"DOWN_AND_UP") # 操作設(shè)備 # device.type("123456") # 輸入文本 img1 = device.takeSnapshot() # 獲取快照/截圖 img1.writeToFile("D:\p1.png", "PNG")MonkeyDevice 方法
案例:device.wake()
形式:void type(String 文本內(nèi)容)
案例:device.type(‘1234’)
形式:void touch(坐標(biāo)位置,操作邏輯)
案例:device.touch(125,365,’DOWN_AND_UP’)
4)drag():滑屏
形式:void drag(開始坐標(biāo),結(jié)束坐標(biāo),持續(xù)時間,步驟插值)
案例:device.drag((225,150),(225,165),2,10)
思考:長按?–在同一坐標(biāo)位置持續(xù)一段時間滑屏,即長按
Device.drag((245,345),(245,345),2,10)
5)press():系統(tǒng)級操作
形式:press(按鍵名稱,操作邏輯)
案例:press(‘KEYCODE_HOME’,’DOWN_AND_UP’)
常用按鍵:KEYCODE_HOME,
KEYCODE_BACK,KEYCODE_MENU等
補充:takeSnapShot()—截取當(dāng)前停留界面的截圖
形式:參數(shù)–空參 ,返回值類型:MonkeyIamge
常用常量
1)DOWN-- 按下—String類型
2)UP–抬起—String類型
3)DOWN_AND_UP:按下后抬起–String類型
waitForConnection()
作用:連接手機(jī)設(shè)備:真機(jī)/模擬器
形式:waitForConnection(參數(shù)1,參數(shù))
返回值類型:MonkeyDevice
參數(shù)1:float 超時時間 單位S
參數(shù)2:String設(shè)備ID,’十六進(jìn)制ID’(真機(jī));’Emulator-5554’(模擬器)
案例:MonkeyRunner.waitForConnection()
2、sleep()
作用:程序運行過程中步驟間的等待時間,單位:s
形式:sleep(float 時間)
返回值類型:void–無需返回值
參數(shù):具體等待時間
案例:device.sleep(5)===錯誤
MonkeyRunner.sleep(5)==正確
419,382 97,382
device.drag((419,382),(97,382),2,10)
MonkeyIamge
1、writeToFile()–保存文件
形式:void writeToFile(String 保存位置,String 保存文件格式)
案例:
image=device.takeSnapshot()
image.writeToFile(‘D:\testimage.png’,’png’)
2、sameAs():對比預(yù)期截圖和實際截圖
形式:booleansameAs(MonkeyImage 預(yù)期圖片,float百分比)
案例:result.sameAs(‘D:\test1.png’, 0.9)
返回值:對比結(jié)果不一致:false–有缺陷或者有異常情況
? 對比結(jié)果通過:true–正常符合需求
3、坐標(biāo)獲取
1)開發(fā)工具–pointer location 選擇后通過工具條獲取坐標(biāo)
2)通過monkeyrunner提供錄制功能實現(xiàn)坐標(biāo)的獲取
一、ADB調(diào)試橋作用
能夠讓PC機(jī)和手機(jī)、模擬器進(jìn)行通信,以便調(diào)試的工具
– 命令位置: sdk\platform-tools
– adb可以同時管理多個Android設(shè)備
ADB子命令參考
adb devices 列出所有運行的Android模擬器實例和已連接的Android 設(shè)備
adb shell 通過PC連接手機(jī)或打開Android模擬器
adb push 1.txt /data/ 將PC中的文件傳輸給Android設(shè)備,供安裝等操作
adb pull /data/1.txt D:\ 經(jīng)常從Android設(shè)備中獲取日志文件,在PC中記錄并分析
查看日志
adb logcat > app1.log
-d選項表示讀完所有l(wèi)og后返回
adb logcat -d > app2.log
向模擬器傳送.apk文件并安裝
adb install D:\Mobile_Test\hehe_v1.2.apk
根據(jù)包名卸載APP
adb uninstall com.zmhj.hehe
adb start-server 啟動adb服務(wù)器進(jìn)程
adb kill-server 結(jié)束adb服務(wù)器進(jìn)程
查看包名和主活動
1.有apk
a, aapt dump badging 路徑
aapt dump badging I:\test\手機(jī)appium\Apks\app2-debug.apk
package: name=‘com.example.tarena.myappdemo2’ versionCode=‘1’ versionName=‘1.0’
launchable-activity: name=‘com.example.tarena.myappdemo2.MainActivity2’ label=’’
b, 文件夾內(nèi)找
(實測無效)
查看.apk配置文件 – 解壓縮為一個文件夾
– 該文件夾內(nèi)找到 AndroidManifest.xml – 使用記事本打開-ctrl+F,搜索:找到manifest 對應(yīng)的就是appPackage, 搜索:activity對應(yīng)的就是appActivity。
(activity關(guān)鍵 字很多,你要注意辨別。)
2.無apk
(計算器、通訊錄、短信…)
單開設(shè)備
a.查看log,Displayed
1.打開APP,命令行執(zhí)行
adb devices
adb logcat>I:\log.txt
2.對APP做任意一些操作
Ctrl+c 結(jié)束adb命令
3.打開I:\log.txt文件,搜索:Displayed,找到I/ActivityManager( 1688): Displayed com.example.myappdemo3/.MainActivity: +491ms
b.命令行
執(zhí)行結(jié)果-{}中信息找包名:包名形式-com.xxx.xxx
1.打開APP,命令行執(zhí)行
linux命令
adb shell dumpsys window |grep mCurrent
window10
adb shell dumpsys window | findstr mCurrentFocus
mCurrentFocus=Window{2bcb203d u0 com.tencent.mm/com.tencent.mm.plugin.webview.ui.tools.WebViewUI}
或者
adb shell dumpsys window w | findstr / | findstr name=
mSurface=Surface(name=com.tencent.mm/com.tencent.mm.plugin.webview.ui.tools.WebViewUI)
或者(不推薦)
adb shell dumpsys activity activities
– 命令行結(jié)果查看:
【last屏】?mFocusedActivity: ActivityRecord{18ff6fef u0 com.tencent.mm/.plugin.webview.ui.tools.WebViewUI t4}
【first屏】?realActivity=com.tencent.mm/.ui.LauncherUI
或者(無效)
adb shell “dumpsys window w|grep /|grep name=|sed ‘s/mSurface=Surface(name=//g’|sed ‘s/)//g’|sed ‘s/ //g’”
使用這條命令,結(jié)果看起來會更清晰
多開設(shè)備
查看設(shè)備號:adb devices
adb -s 127.0.0.1:62026 shell
dumpsys activity | grep mFocusedActivity
查看 mFocusedActivity: ActivityRecord{18ff6fef u0 com.tencent.mm/.plugin.webview.ui.tools.WebViewUI t4}
僅獲取包名 Monkey
1.獲取所有程序包名
adb shell pm list packages
2.獲取自己安裝的程序包名
adb shell pm list packages -3
3.獲取與hello相關(guān)程序包名
adb shell pm list packages hello
二、Monkey和MonkeyRunner
Android自動化測試三種模式
1.基于隨機(jī)事件
crash閃退–Monkey壓力測式(穩(wěn)定性測試)
2.基于坐標(biāo)點
MonkeyRunner功能自動化測試
3.基于控件
Appium基于 Webdriver驅(qū)動
Selenium作為web自動化
Instrumentation測試框架
三、Monkeyrunner3大組件API:
首先導(dǎo)入工具包
from com.android.monkeyrunner import MonkeyRunner
from com.android.monkeyrunner import MonkeyDevice
from com.android.monkeyrunner import MonkeyImage
1)MonkeyRunner 工具類,提供工具方法
device = MonkeyRunner.waitForConnection() 連接
嘗試連接設(shè)備,如果連接成功,會返回MonkeyDevice類型的對象的引用,賦值給device變量(聲明不用寫類型)
如果連接不上,默認(rèn)一直試圖連接下去,如果使用重載的參數(shù),比如超時時間,就可以控制時間。
2)MonkeyDevice 表示某設(shè)備對象
device.touch(200, 300, “DOWN_AND_UP”) 觸摸
device.type(“123456”) 輸入文本
img1 = device.takeSnapshot() 獲取快照/截圖
3)MonkeyImage
通過img1.writeToFile(String path, String format)
產(chǎn)生截圖文件 “D:\p1.png”, “PNG”
關(guān)系:mr 產(chǎn)生 md 產(chǎn)生 mi
Appium安裝總體步驟 :
一、JDK安裝并設(shè)置
版本建議1.7以上
1.搜索:環(huán)境變量
2.在系統(tǒng)變量中點擊“新建”,輸入變量名JAVA_HOME, 變量值中輸入jdk安裝路徑
3.在系統(tǒng)變量中找到Path,點擊“編輯”,在末尾加入 – %JAVA_HOME%\jre\bin; – %JAVA_HOME%\bin;
4.檢查Java環(huán)境: – 打開命令行窗口 – 輸入java –version查看java版本
二、SDK安裝設(shè)置
1.搜索:環(huán)境變量
2.在系統(tǒng)變量中點擊“新建”,輸 入變量名ANDROID_HOME,變量值中輸入SDK下的 sdk文件夾路徑,點擊“確定”
3.Android SDK文件夾下,雙擊SDK Manager,選裝工具。
SDK重要目錄
包括【build-tools】【platforms 】【platform-tools】【tools】
– 【build-tools】里面是丌同版本(例如21.1.1)的build工具, 這些工具包括了aapt打包工具、dx.bat、aidl.exe等等
– 【platform】是存放丌同API-level版本SDK目錄的地方
– 【platform-tools】是一些android平臺相關(guān)的工具,adb 、fastboot等
– 【tools】是指的安卓開發(fā)相關(guān)的工具,例如android.bat 、ddms.bat(Dalvik debug Monitor Service)、 draw9patch.bat等等
必裝:Tools=>Options
設(shè)置代理提升速度,我們使用鄭州大學(xué)開源鏡像站mirrors.zzu.edu.cn,端口80
配置環(huán)境變量
在系統(tǒng)變量中找到Path,點擊 “編輯”,在末尾加入
– %ANDROID_HOME%\platform-tools;
– %ANDROID_HOME%\tools;
– %ANDROID_HOME%\build-tools;
檢查Android環(huán)境: – 打開命令行窗口 – 輸入adb
三、安裝ui測試工具
AppiumDesktop
啟動Inspector
要配置一些Desired Capabilities信息:
{
“platformName”: “Android”,
“platformVersion”: “5.1.1”,
“deviceName”: “YeShen”,
“appPackage”: “com.example.myappdemo3”,
“appActivity”: “com.example.myappdemo3.MainActivity”
}
真機(jī)報錯解決
啟動Inspector時一直報下面的錯誤:
An unknown server-side error occurred while processing the command. Original error: Unable to find an active device or emulator with OS 23. The following are available: M************O (10).
這時候?qū)⑵脚_版本"platformVersion" 改為 “10” 后再次運行,結(jié)果正常.
UiAutomatorViewer
uiautomator 是自動化UI測試工具。創(chuàng)建測試代碼來執(zhí)行測試任務(wù),各種測試任務(wù)分別覆蓋不同的使用場景,然后使用測試框架來運行這些測試任務(wù)。
UI測試工具概述
Android SDK在4.1中提供了如下工具來支持UI自動化測試:
- uiautomatorviewer – 一個圖形界面工具來掃描和分析應(yīng)用的UI控件。
- uiautomator – 一個測試的Java庫,包含了創(chuàng)建UI測試的各種API和執(zhí)行自動化測試的引擎。
要使用該工具,需要滿足如下條件:
- Android SDK Tools, Revision 21 or higher
- Android SDK Platform, API 16 or higher
操作步驟
1.確認(rèn)安裝有adb
首先確認(rèn)環(huán)境是否安裝有adb工具,首先通過快捷鍵 win+R鍵進(jìn)入cmd環(huán)境,輸入"adb version",如果可以正常查看adb版本,說明安裝成功。如果報錯了,請檢查是否有配置adb的環(huán)境變量。
2.下載安裝模擬器
設(shè)置-關(guān)于手機(jī)–版本號連點7下打開開發(fā)者模式–點擊進(jìn)入"開發(fā)者選項",選擇"允許USB調(diào)試",確認(rèn)安卓模擬器與電腦環(huán)境切換至同一網(wǎng)絡(luò)環(huán)境下。百度查看夜神模擬器默認(rèn)adb端口:adb connect 127.0.0.1:62001,連接adb調(diào)試工具,adb devices確保連接成功。
3.uiautomatorviewer.bat
找到電腦C:\Program Files (x86)\Android\android-sdk\tools位置,打開uiautomatorviewer.bat,點擊左上角第二個圖標(biāo)Device Screenshot (uiautomator dump)設(shè)備截屏,選擇控件,右側(cè)即可查看控件屬性。
常見問題解決
adb連接夜神模擬器
一、(單開)夜神模擬器
adb connect 127.0.0.1:62001二、(多開)夜神模擬器
前提:2個新開模擬器,已開啟usb調(diào)試模式1.夜神模擬器中默認(rèn)的端口是62001,多開的模擬器端口應(yīng)該也是62xxx之類的。cmd中輸入命令:netstat -ano |findstr "62" (查看當(dāng)前機(jī)器中所有62相關(guān)程序的IP地址)2.果然在IP地址列表中看到這2個IP地址127.0.0.1:62025/62026協(xié)議 本地地址 外部地址 狀態(tài) PIDTCP 127.0.0.1:62001 0.0.0.0:0 LISTENING 2812TCP 127.0.0.1:62001 127.0.0.1:23533 ESTABLISHED 2812 --ESTABLISHED提示已連接上TCP 127.0.0.1:62025 0.0.0.0:0 LISTENING 18760TCP 127.0.0.1:62026 0.0.0.0:0 LISTENING 13120嘗試命令:> adb connect 127.0.0.1:62025,運行程序,果然建立了連接再次查看連接設(shè)備列表C:\Users\yy>adb devicesList of devices attached127.0.0.1:62001 device127.0.0.1:62025 device127.0.0.1:62026 deviceadb server version (31) doesn’t match this client (36)
原因:sdk的adb版本和夜神或逍遙模擬器自帶的adb版本不匹配。
解決:在C:\Program Files (x86)\Android\android-sdk\platform-tools中復(fù)制adb.exe,粘貼替換掉第三方模擬器D:\Program Files\Nox\bin的adb.exe。
注意:夜神的是以nox_adb.exe命名的,所以要把從sdk里拷貝過來的adb.exe改名為nox_adb.exe。
華為打開USB調(diào)試
1、進(jìn)入手機(jī)點擊【設(shè)置】圖標(biāo)。
2、往下滑動屏幕,找到并且點擊【關(guān)于手機(jī)】選項。
3、連續(xù)點擊【版本號】七次,直到出現(xiàn)提示“您已處于開發(fā)者模式”。
4、返回上一級,在設(shè)置里面點開【系統(tǒng)和更新】就能看見【開發(fā)者選項】,點擊進(jìn)入。
5、在【開發(fā)者選項】里面可以看到【USB調(diào)試】選項,打開就可以了。
adb找不到真機(jī)
1.首先找到手機(jī)的安裝完之后的“設(shè)備的硬件id”,控制面板,找到設(shè)備管理器打開。
2.在設(shè)備管理器中,找到ADB driver(android phone)然后點開。
3.然后在詳細(xì)信息中,屬性選擇硬件ID點開,查看到我的ID是12D1
4.找到你的模擬器存放的目錄,C:\Users\yy.android,找到或新建adb_usb.ini文件,把VID的數(shù)值寫入到adb_usb.ini 里面。就是0xVID(0x12D1)這6個字符即可。
5.在cmd上輸入adb kill-server 然后重新拔插usb線之后,就可以連接adb 了
無法獲取真機(jī)截圖
本來想使用UIAutomatorView定位app頁面元素的,最開始我使用的是夜神模擬器,打開UIAutomatorView連接模擬器沒有問題,但是后來我使用真機(jī)時發(fā)現(xiàn)無法連接到真機(jī)獲取真機(jī)的截圖,具體報錯信息如下
步驟:
\1. 在任意盤的根目錄(不是根目錄也沒問題)新鍵app.png 與app.uix 兩個文件(我這里放在的E盤下面)
\2. 打開CMD按照順序執(zhí)行下面的命令
adb shell uiautomator dump /sdcard/app.uix # 把當(dāng)前窗口的UI布局信息輸出到/sdcard/app.uix文件
adb pull /sdcard/app.uix E:/app.uix # 把手機(jī)里面的app.uix文件寫到本地E盤的app.uix文件
adb shell screencap -p /sdcard/app.png # 截取當(dāng)前的屏幕圖片,并保存到/sdcard/app.png
adb pull /sdcard/app.png E:/app.png # 把上面的截圖文件從手機(jī)中傳遞到電腦的E:/app.png中
\3. 導(dǎo)入UIAutomatorViewer
啟動UiautomatorViewer, 按照下圖導(dǎo)入兩個app文件
由于這種方法,每次切換手機(jī)的頁面時都需要要重新執(zhí)行上述命令,所以可以把命令寫到一個bat腳本里面
@echo on
adb shell uiautomator dump /sdcard/app.uix
adb pull /sdcard/app.uix E:/app.uix
adb shell screencap -p /sdcard/app.png
adb pull /sdcard/app.png E:/app.png
導(dǎo)入后再次連接真機(jī),成功
四、安裝Appium-Python-Client
Appium Python Client通過Python安裝等待安裝完成:
– 進(jìn)入cmd
- 更新pip: python -m pip install --upgrade pip
– 輸入:pip install Appium-Python-Client或者 pip3install Appium-Python-Client
五、Pycharm配置
1.使用管理員權(quán)限啟動Appium
2.啟動模擬器
3.啟動pycharm
測試模板代碼
from appium import webdriver from appium.webdriver.common.touch_action import TouchAction from appium.webdriver import WebElement from appium.webdriver.common.mobileby import MobileBy from time import sleep import randomdesired_caps={"automationName":"UiAutomator2","platformName": "Android","platformVersion": "5.1.1","deviceName": "127.0.0.1:62001","appPackage": "com.example.myappdemo3","appActivity": "com.example.myappdemo3.MainActivity","unicodeKeyboard":True,# 支持中文輸入,默認(rèn)false"resetKeyboard":True,# 重置輸入法為系統(tǒng)默認(rèn),將鍵盤給隱藏起來"noReset": True, # 不重新安裝apk"noSign": True # 不重新簽名apk } driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)el2 = driver.find_element_by_accessibility_id("手機(jī)號輸入框") el2.send_keys("456") TouchAction(driver).tap(x=350, y=392).perform() el3 = driver.find_element_by_id("com.example.myappdemo3:id/editText5") el3.send_keys("456") el4 = driver.find_element_by_id("com.example.myappdemo3:id/editText6") el4.send_keys("零零") el5 = driver.find_element_by_id("com.example.myappdemo3:id/female") el5.click() el6 = driver.find_element_by_accessibility_id("請選擇是否擅長音樂") el6.click() el7 = driver.find_element_by_id("com.example.myappdemo3:id/sports") el7.click() el8 = driver.find_element_by_accessibility_id("提交按鈕") el8.click()sleep(3) driver.quit()Original error: Could not find ‘a(chǎn)db.exe’ in PATH.
最終解決辦法:使用管理員權(quán)限啟動Appium,問題解決
You are using pip version 9.0.1, however version 18.0 is available.
解決辦法:
python -m pip install -U pip
time out 的話多執(zhí)行幾次即可
Could not find a version that satisfies the requirement openpyxl (from versions: )
解決方案
按照提示所示是其中一個原因是pip版本過低,需要更新pip:
python -m pip install --upgrade pip
由于python國內(nèi)網(wǎng)絡(luò)不穩(wěn)定,一直報錯,升級了很多次才成功。
然后繼續(xù)還是報錯:
可能考慮到是python國內(nèi)網(wǎng)絡(luò)的問題,這時我們用國內(nèi)的鏡像源來加速。
pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
這個是豆瓣源
–trusted-host pypi.douban.com 這是為了獲得ssl證書的認(rèn)證,要不然會報錯
然而還是報錯,可能是我電腦網(wǎng)絡(luò)原因,常理來說都可以安裝成功的,大家到這一步可能應(yīng)該已經(jīng)解決問題了。
我最后還是用pip3 install openpyxl嘗試很多次后才安裝成功。
附錄:Genymotion模擬器
安裝Genymotion模擬器 (實測無效)
直接安裝genymotion-2.11.0-vbox
或:
第一步:下載cn_windows_10_multiple_editions_x64_dvd_6848463.iso
第二步:下載安裝VirtualBox-4.3.12-93733-Win.exe,必須右鍵以管理員的身份運行,新建虛擬電腦,類型:microsoft windows,版本:windows8.1(64 bit),內(nèi)存大小:2333mb,顯存大小:14mb),設(shè)置存儲,添加vdi,iso文件。啟動。進(jìn)入系統(tǒng)安裝。
第三步:下載安裝genymotion-2.9.0.exe,右鍵以管理員的身份運行
登錄后選中settings,選擇ADB,選擇Use custom Android SDK tools,設(shè)置Android SDK為本地SDK路徑,如下:…\android-sdk
VirtualBox問題總結(jié)
1.Virtualbox啟動報cannot access the kernel driver
操作步驟:關(guān)閉電腦防火墻,進(jìn)入{VitualBox按照目錄}\drivers\vboxdrv文件夾,找到vboxdrv.inf這個文件,鼠標(biāo)右鍵點,然后選擇安裝;以管理員的身份重新啟動虛擬機(jī),就能運行了。
2.安裝VirtualBox回滾
這個不屬于virtual box的問題,而是本機(jī)系統(tǒng)的相應(yīng)安裝服務(wù)未開啟。解決方案很簡單。
電腦搜索–服務(wù)–在服務(wù)里啟動:
Device Install Service.
Device Setup Manager.
開啟這兩個服務(wù)就好了(一般情況下是默認(rèn)啟動的)
這個問題可以通過查看安裝時打印的log發(fā)現(xiàn),比較隱蔽,具體查看log的做法請參閱https://www.cnblogs.com/lonelyxmas/p/7549927.html
或者走投無路的情況下,可以直接嘗試在安裝過程中取消usb驅(qū)動的安裝(相應(yīng)的,這個功能也就沒有了,不過先能裝上再說)
大致就是因為上次安裝終止,導(dǎo)致安裝信息殘留在msi上。因此后面每次在安裝或者卸載其它軟件的時候,注冊表的鍵值提示msi安裝系統(tǒng),有個未完成安裝的軟件,于是執(zhí)行回滾,虛擬機(jī)因此被刪除。
定位到C:\Windows\Installer,定位到目錄下,按照時間排序,發(fā)現(xiàn)該文件的日期果然在今天,恰好在我安裝VirtualBox的時候,同樣的還有幾個最新文件,可以推測出確實是記錄了VirtualBox的正在安裝信息。現(xiàn)在刪除掉這個鍵值之后,進(jìn)行其它軟件的安裝以及卸載測試,發(fā)現(xiàn)沒有回滾虛擬機(jī)了,成功解決該問題。
3.Your PC/Device needs to be repaired
如果安裝過程中,提示“Your PC/Device needs to be repaired,this opearating system uses the Physical Address Extension feature to support system …”錯誤。請關(guān)閉虛擬機(jī),請按下面的方法操作:
在vm virtualBox管理器中,依次點擊:設(shè)置——系統(tǒng)——處理器,選中"啟用PAE/NX"前的復(fù)選框,點擊“確定”退出。
Genymotion問題總結(jié)
1.在線下載虛擬設(shè)備失敗
1.比如要下載Custom Phone-5.0.0-API21-768*1280,點擊過后下載失敗
2.在C:\Users\yy\AppData\Local\Genymobile中找到genymotion.log文件
3.點開該文件找到http://.genymotion.com/dists//ova/genymotion_vbox86p_**.ova
4.復(fù)制URL至迅雷下載,下載完成后將genymotion_vbox86p_5.0_151117_231324.ova文件copy至C:\Users\yy\AppData\Local\Genymobile\Genymotion\ova中
5.最后在virtualbox–管理–導(dǎo)入虛擬電腦–選擇.ova文件–下一步選擇導(dǎo)入。
6.重新Add virtual Device,添加成功
2.aapt: command not found
可將…\android-sdk\build-tools目錄中的aapt.exe 文件拷貝至 …\android-sdk
目錄中,然后再重復(fù)步驟即可
總結(jié)
- 上一篇: 井盖为什么是圆的?
- 下一篇: SEO关键词策略——新站如何抗衡老站…