app自動化


簡歷,web自動化流程 app安裝
2018.10.27學習
1. 簡歷注意事項:
1> 個人技能需要在項目經驗里體現出用到的技能;熟練或掌握的技能是在項目實踐后才能達到的;
2> 簡歷格式工整,條理清晰;
3> 工作技能要從工作項目中體現每年都在增加,學習知識,技能;
4> 2,3年前的項目也需要寫清楚一點工作職責;
2. 項目經驗中:
1> 技能的遞增,隨着工作時間的增加,工作中應該用到測試技能也要越來越多,不要所有的項目經驗中都是千遍一律,看不到你工作中的成長;
2> 對項目有貢獻的地方一定要寫出來;
3> 工作職責一定要寫詳細,清楚,寫清楚你在這個項目中明明白白的做了什么事情,不要把個人技能的東西搬過來;
4> 不要寫負責了登錄,注冊,我的賬戶的自動化測試,這不是你系統的核心業務,這樣寫就是在告訴面試官你在打醬油;
5> 自動化至少1年半以上才算是正真的在搞自動化;
3. 關於自動化:
1> 項目經驗:寫清楚項目當中,做了哪些方案的自動化測試,怎么做的
2> 與jenkins的集成,集成之后需要優化和提升測試用例的通過率,需要對每次定時任務的測試 這個過程中涉及到了腳本的優化和bug的發現;
3> 在自動化測試的項目實踐的過程中,注意自動化帶來的整體效率和成果,不要注重於框架的編寫和框架在項目上的應用,需要考慮人力和時間的效率,所以框架的選擇不但要考慮項目本身,還要考慮其他人員的能力;
4. web自動化項目的流程:
1> 先做的功能測試;2個月,了解功能業務(哪些模塊比較穩定,哪些模塊bug比較多,目前完成了哪些模塊功能,正在開發哪些模塊功能,每個模塊的驗證點是什么),以便后面自動化用例的設計和實現,之后只是手工轉自動化的過程;
2> 自動化的計划:先小范圍的實現最需要自動化的一個功能模塊(選擇模塊的原則:模塊比較穩定,模塊經常出bug,模塊功能最核心的業務), 用例大概多少個,大概多久完成,且向領導匯報計划;
3> 選擇自動化框架的原則:
a> 依據項目的實際情況,整個項目的自動化過程由自己負責,而自己又善於寫代碼,那就選擇代碼的框架;
b> 如是多個人合作,而其他人不善於代碼,那就選擇RF工具;
4> 從功能用例中篩選適合自動化的核心業務功能用例,設計自動化用例;
5> 和測試團隊評審測試用例,和用例優化級,以及是否合理,用自動化來代替手工測試;
6> 搭建自動化框架(如安裝python,安裝selenium庫,測試框架庫pytest,郵件功能SMTPLib),實現自動化(PO模式);
7> 完成幾個用例后,接入jenkins上調試腳本,不斷優化;
8> 實現自動化的過程中,你可能需要項目對業務非常熟悉的人的協助;
9> 做自動化測試,就像功能測試一樣,也是需要向領導和團隊定期反饋進展和結果的,告訴團隊你做了哪些模塊哪些功能的自動化測試,用例通過率如何,有哪些bug,讓他們看到成果;
10> 演示自動化腳本執行過程,給大家展示測試報告,階段性的讓大家評審自動化測試用例;
**web自動化用例的用例率一般是80%以上,若是用例為50條以下,則通過率為90%以上,用例失敗的原因:測試環境,bug的存在,腳本中的等待不滿足,腳本的穩定性不高**
11> 某個模塊的自動化腳本完成后,可以結合版本迭代進行回歸驗證,在每個轉測版本中進行回歸,解放該模塊的手工測試;
12> jenkins晚上打包編譯最新版本后,執行一下自動化腳本,之后將測試執行發送測試團體和相關人員,以知會團體相關人員;若測試報告中有失敗的用例,需要分析根因,且在郵件中回復出來失敗的原因;
13> 優化腳本,提高執行效率,提高腳本通過率等等維護工作;
**web自動化前期是實現過程,后期是投入使用和調優維護腳本**

5. python代碼和driver驅動是怎么交互的?通過http協調。
6. app環境安裝
python程序和真機或模擬器(在PC電腦端)進行交互;通過adb命令進行數據傳輸;ADT工具解壓,之后配置環境變量; appinum server 真機/模擬器交互;
1> 安裝nodes.js;
2> 安裝appium server:即Appium.ext程序,python程序(python客戶端)通過http協議發送命令給appium server,之后appium server就去操作真機和模擬器; 需要nodes.js支撐
3> 真機開啟usb調試模式即可;
4> 安裝模塊器:需要genymotion或是葉神??
5> 安裝JDK:1.8版本以上,因為有些命令的執行需要JDK支持;
6> 安裝ADT:
7> 安裝appium python客戶端:pip3 install Appium-Python-Client

###adb命令
2018.10.30學習
1. adb常用命令:
1> **adb devices** 顯示當前運行的全部模擬器或真機;
2> adb start-server 啟動ADB
3> adb kill-server 停止ADB
PS: 當adb出現問題或adb啟動不起來時,先kill然后再start
4> **adb install -r [apk文件]** 安裝應用程序, -l 鎖定該程序; -r 重新安裝該程序,保存數據;
-s 安裝在SD卡內,而不是設備內部存儲,如adb install --r D:\mm.apk
5> 卸載應用程序 adb uninstall [packagename],如adb uninstall com.tencent.mm,-k 不刪除程序運行所產生的數據和緩存目錄(如軟件的數據庫文件)
6> **adb pull** 設備目錄 本地目錄:將手機設備中的文件copy到本地計算機,如adb pull /sdcard/mm.txt D:\ ,即為將內存卡根目錄的mm.txt文件copy到D盤根目錄
7> **adb push** 本地目錄 手機設備目錄,如 adb push D:\mm.txt /sdcard
8> adb shell screencap -p 截圖文件路徑 : 截屏
9> adb shell dumpsys dbinfo [packagename] : 查看指定包名應用的數據庫儲存信息(包括存儲的SQL語句)
10> adb shell dumpsys meminfo[packagename/pid] 可以查看進程當前的內存情況,如adb shell dumpsys meminfo com.tencent.mm
11> adb shell dumpsys [packagename]:查看指定包名應用的詳情信息,相當於AndroidMainfest.xml中內容,如adb shell dumpsys com.tencent.mm
12> adb shell dumpsys activity top:查看當前應用的activity信息;adb bugreport:查看bug報告;
13> adb shell pm list packages:列出手機安裝的所有apk包名;
a> adb shell pm list packages -s:系統應用;
b> adb sehll pm list packages -3:第三方應用;
c> adb shell pm list packages | grep qq;
14> adb shell pm clear [packagename] : 清除應用緩存信息;
15> adb shell am start -n [packagename] :通過adb啟動應用程序頁面;如adb shell am start -n com.tencent.mm/.ui.SplashActivity
PS: 強制停止應用有時會卡死,需要強制信息,則執行:adb shell am force-stop com.tencent.mm
16> adb shell logcat -b radio:記錄無線通訊日志;
PS:一般來說,無線通訊日志非常多,在運行時沒必要去記錄
17> adb get-product:獲取設備的ID ; adb get-serialnoL:獲取設備的序列號;
18> adb shell sqlite3 : 訪問數據庫SQLite3 ;
19> 導出設備信息:
a> adb get-serialno > 序列號.txt;
b> adb shell cat /sys/class/net/wlan0/address > MAC地址.txt ;
c> adb shell getprop ro.product.model > 設備型號.txt
d> adb shell getprop ro.build.version.release> 系統版本.txt
e> adb shell pm list packages -s > 系統應用的所有包名.txt
f> adb shell pm list packages -3 > 第三方應用包名.txt
g> adb shell wm size > 屏幕分辨率.txt
h> adb shell wm density > 屏幕密度.txt
i> adb shell cat /proc/cpuinfo > CPU信息.txt
k> adb shell pm list permissions -f > 權限.txt
l> adb shell pm list users -f > 用戶.txt
20> adb reboot 重啟
21> cd system/sd/data:進入系統內指定文件夾;rm -r XXX 刪除名字XXX的文件夾及其里面所有的文件; rm xxx 刪除文件xxx; rmdir xxx 刪除xxx的文件夾;
22> adb shell dumpsys activity | find "mFocusedActivity" 獲取當前正在前台使用的app包名;(有時不太准確)
23> adb shell : 登錄設備shell命令模式下
24> adb connect/disconnect 通過wifi進行遠程連接手機進行調試

2. appium可以用於安卓和IOS系統:
pc端 ---> appium -----> 模擬器/真機
python代碼 server

pc端 ----> ----> 模擬器/真機
3. adb(Android Debug Bridge) 是android sdk的一個工具
1> adb是用來連接安卓手機和PC端的橋梁,用戶通過在pc端使用adb命令操作安卓手機;
2> adb具有安裝卸載apk,拷貝推送文件,查看設備硬件信息,查看應用程序占用資源情況,讓設備執行shell命令等功能;
4. adb組成:
1> 客戶端client:運行在你的電腦上,可以通過shell來調用起一個客戶端; 其他android工具如ADT插件, DDMS都可以創建出一個客戶端;
2>服務器server:運行在你電腦后台,負責管理client和daemon進行通信;
3> 守護進程daemon:運行在模擬器或者android設備的后台;
驗證adb命令是否常:在windows的命令行,輸入adb -version
5. 真機准備:
1> 需要確認你的手機已通過usb線連接到電腦;
2> 通過驅動軟件,驅動精靈/驅動人生等,將你的android手機驅動安裝好;
3> 進入到手機,開啟手機的開發者模式;
4> 退出到上一級菜單,進入到開發者選項,找到USB調試模擬器將其打開;
5> 可能會彈出一個允許調試的對話框,勾選上同意,不然abd devices命令檢查不到設備;

6. app自動化時,需要獲取包名和入口頁面(登錄app時顯示的第一個頁面)
7. 能夠非常准確獲取應用包名和入口activity:
1> aapt命令執行目錄:F:\adt-bundle-windows-x86_64-20140702\sdk\build-tools\android-4.4W下有一個appt.ext
2> appt命令語法:**aapt dump badging apk應用包名**,如aapt dump badging D:\BaiduNetdiskDownload\Future-release.apk
aapt dump badging D:\worksoft_packs\huawei.w3.W3App.apk
執行結果如下:其中的name='com.xxzb.fenwoo'為應用包名;入口activity為:launchable-activity: name='com.xxzb.fenwoo.activity.addition.WelcomeActivity'

F:\adt-bundle-windows-x86_64-20140702\sdk\build-tools\android-4.4W>aapt dump badging D:\worksoft_packs\Future-release-2018.apk
package: name='com.xxzb.fenwoo' versionCode='8' versionName='1.0.8'
sdkVersion:'9'
targetSdkVersion:'22'
uses-permission:'android.permission.SYSTEM_ALERT_WINDOW'
uses-permission:'android.permission.INTERNET'
uses-permission:'android.permission.ACCESS_NETWORK_STATE'
uses-permission:'android.permission.ACCESS_WIFI_STATE'
uses-permission:'android.permission.READ_PHONE_STATE'
uses-permission:'android.permission.ACCESS_COARSE_LOCATION'
uses-permission:'android.permission.ACCESS_FINE_LOCATION'
uses-permission:'android.permission.CHANGE_WIFI_STATE'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.MOUNT_UNMOUNT_FILESYSTEMS'
uses-permission:'android.permission.READ_LOGS'
uses-permission:'android.permission.DISABLE_KEYGUARD'
uses-permission:'android.permission.DOWNLOAD_WITHOUT_NOTIFICATION'
uses-permission:'android.permission.ACCESS_DOWNLOAD_MANAGER'
uses-permission:'android.permission.VIBRATE'
uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission:'android.permission.WRITE_SETTINGS'
uses-permission:'android.permission.RECEIVE_SMS'
uses-permission:'android.permission.CAMERA'
uses-permission:'android.permission.WAKE_LOCK'
uses-permission:'android.permission.GET_TASKS'
uses-permission:'getui.permission.GetuiService.com.xxzb.fenwoo'
uses-permission:'android.permission.BLUETOOTH'
uses-permission:'android.permission.BLUETOOTH_ADMIN'
uses-feature:'android.hardware.camera'
uses-feature-not-required:'android.hardware.camera.autofocus'
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
application-label:'鍓嶇▼璐?
application-label-zh:'鍓嶇▼璐?
application-icon-120:'res/drawable-ldpi-v4/ic_launcher.png'
application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png'
application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png'
application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png'
application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png'
application: label='鍓嶇▼璐? icon='res/drawable-mdpi-v4/ic_launcher.png'
launchable-activity: name='com.xxzb.fenwoo.activity.addition.WelcomeActivity' label='' icon=''
uses-feature:'android.hardware.location'
uses-implied-feature:'android.hardware.location','requested a location access permission'
uses-feature:'android.hardware.location.gps'
uses-implied-feature:'android.hardware.location.gps','requested android.permission.ACCESS_FINE_LOCATION permission'
uses-feature:'android.hardware.location.network'
uses-implied-feature:'android.hardware.location.network','requested android.permission.ACCESS_COARSE_LOCATION permission'
uses-feature:'android.hardware.bluetooth'
uses-implied-feature:'android.hardware.bluetooth','requested android.permission.BLUETOOTH or android.permission.BLUETOOTH_ADMIN permission and targetSdkVersion > 4'
uses-feature:'android.hardware.wifi'
uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE_WIFI_MULTICAST_STATE permission'
uses-feature:'android.hardware.telephony'
uses-implied-feature:'android.hardware.telephony','requested a telephony-related permission or feature'
uses-feature:'android.hardware.touchscreen'
uses-implied-feature:'android.hardware.touchscreen','assumed you require a touch screen unless explicitly made optional'
uses-feature:'android.hardware.screen.portrait'
uses-implied-feature:'android.hardware.screen.portrait','one or more activities have specified a portrait orientation'
main
other-activities
other-receivers
other-services
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'zh'
densities: '120' '160' '240' '320' '480'

8. app使用的是android系統的控制,不再上html的元素,故定位方式不同
9. web-selenium運行原理:
(調用瀏覽器原生API)
PC端 -----> XXXDriver.exe -----> XXX瀏覽器
python
(http協議)

說明:python代碼通過http協議啟動driver.exe,且發送請求給它,之后它會調用瀏覽器原生API來實現讓瀏覽器自動化測試的目地

10. app-appium運行原理:

(Android/ios系統自帶自動化框架API)
PC端 -----> Appium -----> 模擬機/真機
python
(http協議)

說明:python代碼通過http協議發送請求給appium,之后appium調用Android/ios系統自帶的自動化框架API來實現讓app自動化測試的目地;

11. 為什么不直接使用Android/ios自帶的自動化框架?
1> 自帶的android框架是用java寫的,要會java;
2> 框架中有些功能未實現,或是不好處理,也是在更新完善中;
3> 現在都希望使用開源,跨平台,跨語言的軟件,而appium就支持這些,但appium不是直接調用系統自帶的自動化框架API,而是將adb命令發送到模擬器/真機的app程序當中,app程序接收命令后開始執行操作,之后返回結果,相當於一個監聽的結果;

12. 移動端自帶框架:
1> ios9.3及以上:蘋果的XCUITest
2> ios9.3以下:蘋果的UIAutomation
3> Android4.2+:谷歌的UiAutomator
4> Android2.3+:谷歌的Instrumentation

13. appium理念:appium旨在滿足移動端自動化測試的需求,有四個原則:
1> 你沒有必要為了自動化而重新編譯你的應用app或者以任何方式修改它;
Android/ios系統自動框架
2> 你不應該被限制在特定的語言或框架上來編寫運行測試;
WebDriver API
客戶端-服務器協議(稱為JSON Wire Protocol)
3> 移動端自動化框架在自動化接口方面不應該重造輪子;
WebDriver : web瀏覽器自動化的標准,即全部繼承了web自動化selenium的webdriver所有方法
附加可用於移動端自動化的API方法,即增加了一些移動端特殊的方法
4> 移動端自動化框架應該開源,不但在名義上而且在精神和實踐上都要實至名歸
appium開源

14. 通過查看from appium import webdriver原碼,會發現繼承了selenium的WebDriver所有方法
15. web自動化和app自動化的異同?
1> python代碼都是通過http協議發送請求,只是web是發送給瀏覽器的driver,而app是發送給appium sever;
2> web和app的自動化都是頁面的操作,只是一個在瀏覽器中操作,一個是在Android/ios系統中;
3> appium的webdriver全部繼承了web自動化selenium庫的webdriver方法,只是appium還增加一些app自動化特性有方法,如OPEN_NOTIFICATIONS,INSTALL_APP,IS_APP_INSTALLED,LOCK,UNLOCK,TOUCH_ACTION等;
4> web自動化框架是python的第三方庫unittest,pytest,而app自動化框架是python的第三方庫appium庫;
5> web自動化是通過webdriver調用瀏覽器原生API,而app自動化是通過appium發送adb命令給app,app再使用自帶的自動化框架執行操作;
6> web和app自動化的腳本可以多語言,因為都是通過http協議發送請求;

16. appium是開源,跨平台的自動化測試工具,支持本地,移動端app,點面app測試;
平台支持IOS模擬器(simulators),安卓模擬器(emulators),真機(ios,android,mac,windows);
17. appium概念:
1> 客戶端/服務器框架(C/S框架),appium的核心是一個web服務器,提供了一套rest api;
2> 它接受來自客戶端的連接,監聽命令,接着在移動設備上執行,將執行結果放在http響應中返還給客戶端
3> 自動化始終圍繞一個session進行,腳本發送一個post請求,包含一個json對象,即Desired Capabilities,此時服務器開啟一個自動化的session,然后返回一個session ID,session ID將會被用戶發送后續的命令;
4> Desired Capabilities是一些發送給apium服務器的鍵值對集合,告訴appium server要啟動什么類型的手機什么類型的app的自動化會話;

18. 模擬器的使用:
1> Oracle VM VirtualBox虛擬機上導入不同版本的安卓模擬設備;
2> Genymotion模擬器是運行在Oracle VM VirtualBox虛擬機上的,啟動模擬器;

19. appuim desktop(appium服務器)需要nodejs作為運行環境;ADT安裝包里有aapt和adb可執行文件,執行相關的命令,因為appuim執行模擬器或真機時需要一些小工具命令;

21. app的控件怎么獲取呢,即怎么獲取app的頁面元素?
答:UiAutomator View,在ADT()F:\adt-bundle-windows-x86_64-20140702\sdk\tools)的uiautomatorviewer.bat文件,雙擊打開工具Lazy Ui Automator Viewer;

22. Lazy Ui Automator Viewer本質就是一個截屏工具;

###appium會話+desired_caps
2018.11.1學習
1. 安卓常用的組件/控件:
1> TextView 文本框
2> EditView 編輯框
3> Button 按鈕
4> RadioButton 單選按鈕
5> CheckButton 復選框
6> ToggleButton 狀態開關按鈕
7> Switch 開關
8> SeekBar 拖動條
9> AnalogClock DigitalClock 時鍾
10> Chronometer 計時器
11> ListView 列表視圖
12> GridView 網格視圖
13> ProgressBar 進度條
14> RatingBar 星際評分條
15> Toast 提示信息框
16> ScrollView 滾動視圖

2. 組件的屬性如下:
屬性值 值類型 說明
1> index int 索引,同級組件的下標,從0開始計,代表第1個組件,第2個組件..
2> instance int 界面中同一類View的所有實例的下標,從0開始計
3> class String 組件的類名,同html中的標簽同意,如android.widget.TextView
4> package String 包名,即應用包名
5> Content-desc String 內容描述,大部分時無值
6> Checkable boolean 是否可選,一般只對單選或復選框有用
7> checked boolean 是否單選或復選被選中
8> clickabel boolean 是否可點擊
9> enabled boolean 是否可操作,如按鈕置灰不可操作狀態
10> focusable boolean 是否可獲取焦點
11> focused boolean 是否獲取到焦點
12> Scrollable boolean 是否可滾動,一般是list
13> Long-clickabe boolean 是否可長按
14> password boolean 是否隱藏明文
15> selected boolean 是否具有背景選擇屬性,如按鈕點擊后背景色變化
16> bounds Rect 坐標,如[366,892]|[708,1192]表示控件的矩形區域左上和右下坐標點
17> text String 文本內容
18> xpath String 元素的xpath定位表達式
18> resource-id String 資源ID,不一定唯一,如果xpath定位表達式使用的是resource-id,則說明resource-id是唯一,如//android.widget.TextView[@resource-id=\"com.lemon.lemonban:id/fragment_main_public_class_title\"],否則不是唯一,如//android.widget.TextView[@text=\"全程班\"]

3. appium server怎么知道要操作哪個手機,啟動哪個app應用?
答:python代碼中提供相關的信息:手機版本,app包名,注意一個aapium server只能對應一個模擬器/真機

4. Desired Capabilities的參數說明:用於啟動session(會話)必須的
1> 作用:
a> 本次測試是啟動瀏覽器還是啟動移動設備?
b> 是啟動android還是啟動ios?
c> 啟動android時,app的package是什么?
d> 啟動android時,app的activity是什么?
2> 常用參數:見D:\檸檬班培訓\VIP培訓課程\1101_appium會話+desired_caps\appium_caps
鍵 描述 值
a> automationName 自動化測試的引擎 Appium(默認)或者Selendroid
**platformName** 使用的手機操作系統 iOS, Android, 或者 FirefoxOS
**platformVersion** 手機操作系統的版本 例如 6.0, 7.1
**deviceName** 使用的手機或模擬器類型 在Andorid上這個參數已被忽略,但仍需添加上
Android Emulator(安卓模擬器)
app 如果您指定了appPackage 和 appActivity 參數(見下文),Android 則不需要此參數了,因為說明你已經安裝了這個app應用,否則設置的值如/abs/path/to/my.apk 或 http://myapp.com/app.ipa,代表會安裝app應用;該參數也與 browserName 不兼容

browserName 做自動化時使用的瀏覽器名字。如果是一個應用則只需填寫個空的字符串 'Safari' 對應 iOS,'Chrome', 'Chromium', 或 'Browser' 則對應 Android

**noReset** 在當前session下不會重置應用的狀態。默認值為 false,代表會重置應用,即清除用戶使用app產生的數據,相關於第一次從app市場下載該應用 true(常用),false
**appPackage** 運行的 Android 應用的包名
**appActivity** app應用的入口activity

5. Python客戶端發送設備信息給到appium server,appium server讓手機自帶的自動化框架啟動應用
```python
from appium import webdriver

#代碼提供信息:什么平台,什么版本,什么app
#將操作的信息,發送給appium server,讓它去打開app
#appium server將執行命令發送給手機自帶的自動化框架,讓它啟動app或操作app

desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "6.0"
desired_caps["deviceName"] = "Android Emulator"
desired_caps["noReset"] = True
desired_caps["appPackage"] = "com.lemon.lemonban"
desired_caps["appActivity"] = "com.lemon.lemonban.activity.WelcomeActivity"

#1.代碼寫好,准備發送以上信息 2. 啟動appium server 3. 啟動模擬機,或連接真機,能夠讓adb識別到
#代碼 === appium server === 模擬器/真機

#連接appium server,並發送給它設備信息
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

```
6. appium server監聽手機自帶的自動化框架執行命令的日志信息解說:
1> 發送了一個post /wd/hub/sessioin請求,且請求體包含了設備信息的json對象;
2> 新建一個會話,依據傳遞的設備信息,且會得到一個sessionid,如9ff6b587-60ce-4093-8afe-a51c04d57be0
3> 獲取java版本,檢查是否有安裝adb,會獲取adb的sdk路徑;
4> 通過adb命令連接android device;
5> 開始查詢android 6.0的設備;
5> 返回結果,查找到了android 6.0,device id為192.168.56.101:5555,device api level為23;
6> 運行adb命令查找對應app應用,推送設備的apk到手機上安裝該app應用;
7> 返回結果為沒有安裝app;
8> 推送unlock幫忙設備解瑣;
9> 啟動UiAutomator,通過adb命令將PC端的AppiumBootstrap.jar推送到手機的data/local/tmp目錄,通過Bootstrap來調來UiAutomator API,Bootstrap也會開啟一個監聽端口,接受appium server的命令,之后Bootstrap去調用UiAutomator API,然后將執行結果反饋給appium server;
10> android bootstrap socket連接成功,且屏幕已經解瑣;
11> 開始啟動app應用,之后w3c會返回啟動成功 POST /wd/hub/session 200;
12> **注意:一段時間未操作app(1分鍾),session會話將會關閉,且app也會退出**
13> 手機回到主頁面;Pressing the HOME button

7. 歪歪老師的博客:
https://www.cnblogs.com/yyoba
8. 怎么通過代碼啟動appium server?
答:

###uiautomator+元素定位+元素操作之swipe
2018.11.4學習
1.UiAutomator框架的主要特點:
1> 元素定位:UiAutomator Viewer掃描,分析待測試應用的UI組件的圖像工具 -- UiSelector;
2> 元素操作:Accessing device state 在目標設備和app上的各種操作 -- UiDevice;
3> 元素識別:UiAutomator APIs 在多個應用程充中捕獲和操作UI組件 -- UiObject;

2. 元素定位 === 類UiSelect; 元素(webelemnt)操作 ==== 類UiObject; 設備操作 === 類UiDevice; 1> UiSelector類:通過組件的各種屬性與節點關系定位組件;
2> UiObject類:安卓組件對象;

3. UiSelector:是一個元素定位表達式的類,它的絕大部分方法返回結果都是自身,java創建對象的方法:a = new UiSelector()
1> a.resourceId(String id) :通過resourced-id屬性定位;
2> a.text(String text) : 通過text文本屬性定位,如new UiSelector().text("全程班")
3> a.textContains(String text):包含文件體定位,如 new UiSelector().textContains("全程")
4> a.textMatches(String regex):通過正則匹配定位;
5> a.textStartsWith(String text):通過文本內容開頭定位;
6> a.description(String desc):通過content-des屬性值定位;
7> a.descriptionContains(String desc):
8> a.descriptionMatches(String regex) :
9> a.descriptionStartsWith(String desc):
10> a.className(String className);通過class屬性定位;
11> a.classNameMatches(String regex):通過正則匹配class屬性定位;
12> a.childSelector(UiSelector selector):通過子元素selector定位;
13> a.clickable(boolean val) :通過是否可點擊屬性定位;
14> a.enabled(boolean val):通過是否可操作屬性定位;
15> a.focusable(boolean val):通過是否可聚集屬性定位;
16> a.focused(boolean val):能過是否聚集屬性定位;
17> a.index(int index):通過索引定位;
18> a.longClickable(boolean val):通過是否可長按定位;
19> a.packageName(String name):通過包名定位;
20> a.scrollable(boolean val):通過是否可滾動定位;
**若想通過組件的二個屬性來定位該組件,應該是new UiSelector().resourceId(\"com.lemon.lemonban:id/fragment_main_public_class_title\").text("全程班"),因為方法返回的就是UiSelector自身,故只要連續點**

4. UiObject 是對元素操作的類:它的公共構建方法(初始化方法)為UiObject(UiSelector selector)
UO = new UiObject(new UiSelector().text("全程班"))實例化了一個webelement對象,之后調用它的各種方法:
a> UO.exists() 元素對象是否存在;
b> UO.click() 元素點擊;
c> UO.clearTextField() 清除文本內容;
d> UO.clickAndWaitForNewWindow() 點擊並且等待新的窗口;
e> UO.getContentDescription() 獲取content-des屬性內容;
f> UO.getClassName() 獲取class屬性;
g> UO.getPackagename() 獲取應用包名;
h> UO.getText() 獲取text屬性;
i> UO.isCheckable() 獲取checkable屬性;
j> UO.longClick() 長按;
k> UO.pinchIn() 頁面縮小;
l> UO.pinchOut() 頁面放大;
m> UO.setText() 設備文件內容;
n> UO.swipeDown() 向下滑;
o> UO.swipUp() 向上滑;
p> UO.swipeLeft() 向左滑;
q> UO.swipeRight() 向右滑;

5. UiDevice 是對設備操作的類,提供了一系列方法和屬性來模擬在手機上的實際操作:
1> 獲取設備信息:屏幕分辨率,選擇狀態,亮滅屏等;
2> 操作:按鍵(home鍵,音量鍵),坐標操作,滑動,拖拽,截圖等;
3> 常用方法:
a> click()
b> drag() 拖拽
c> findObject(UiSelector selector) 查找元素,返回自身UiDevice
d> freezeRotation() 固定屏幕,不讓其旋轉
e> getCurrentActivityName() 獲取當前活動的頁面名稱
f> getCurrentPackageName() 獲取當前活動的包名
g> isScreenOn() 屏幕是否亮着
h> openNotfication() 打開通知欄
i> pressBack() 回退按鍵
j> pressHome() 主鍵
k> pressMenu() 菜單鍵
l> pressSearch() 搜索鍵
m> sleep() 休眠
n> swipe() 滑屏
o> takeScreenshot() 截屏
p> unfreezeRotation() 不固定屏幕
q> wait() 等待
r> wakeUp() 換醒


6. Appium - app頁面元素定位方式:
1> 通過id定位:resource-id
2> 通過ClassName定位:class
3> 通過AccessibilityId定位:content-desc
4> 通過AndroidUiAutomator定位(UiSelector,UiObject,UiDevice)
5> 通過xpath定位
**使用優先級從高到低**

7. app頁面元素定位實例腳本
```python
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy

#代碼提供信息:什么平台,什么版本,什么app
#將操作的信息,發送給appium server,讓它去打開app
#appium server將執行命令發送給手機自帶的自動化框架,讓它啟動app或操作app

desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "6.0"
desired_caps["deviceName"] = "Android Emulator"
desired_caps["noReset"] = True
desired_caps["appPackage"] = "com.lemon.lemonban"
desired_caps["appActivity"] = "com.lemon.lemonban.activity.WelcomeActivity"

#1.代碼寫好,准備發送以上信息 2. 啟動appium server 3. 啟動模擬機,或連接真機,能夠讓adb識別到
#代碼 === appium server === 模擬器/真機

#連接appium server,並發送給它設備信息
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

#app元素定位,不用自己寫,以檸檬班app為例
#等待元素可見
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,"com.lemon.lemonban:id/navigation_tiku")))

#2. classname元素定位,會獲取到多個
eles = driver.find_elements_by_class_name("android.widget.TextView")
print(eles)
#1. id元素定位 == 題庫
driver.find_element_by_id("com.lemon.lemonban:id/navigation_tiku").click()
#3. AccessibilityId(content-desc)元素定位
driver.find_element_by_accessibility_id("")
#4. UiAutomator定位 == 主頁 -- 全程班 ,注意元素定位表達式只能用雙引號,不能用單引號,java與python不同
driver.find_element_by_android_uiautomator('new UiSelector().className(\"android.widget.TextView\").textContains(\"全程班\").resourceId(\"com.lemon.lemonban:id/category_title\")')
#5. xpath定位 == 主頁 -- 全程班
driver.find_element_by_xpath('//android.widget.TextView[@text=\"全程班\"]')

```

8. appium工具的深入用法
1> 高級設置:Advanced
a> Logfile Path:日志輸出到指定目錄,如E:\app_auto_test\appium_sever_log.log
b> Log Level:日志級別
c> Local Timezone/Log Timestamps:勾選這二個,讓日志打印時間;
d> Allow Session Override:會話覆蓋,重新創建會話,一般都勾選它
e> Bootstrap Port:Bootstrap端口號
f> Selendroid Port
將以上配置保存為base,會在Presets頁面查看到
2> Appium server啟動后,點擊Start Inspector Session,即打開元素定位功能

9. Appium---Inspector功能:
1> 可以在該界面上直接操作手機;
2> 有select Element功能

10. uiautomatorviewer工具和appium-desktop自帶的Inspector區別:
1> uiautomatorviewer只能支持android,如果是android平台,推薦使用uiautomatorviewer
2> Inspector可以同時支持android和IOS
11. 元素操作:點擊,輸入,滑動
1> 啟動入口的Activity:driver.activity()
2> 安裝應用:driver.install_app('path/to/my.apk')
3> 卸載應用:driver.remove_app('com.lemon.lemonban')
4> 關閉應用:driver.close_app()
5> 應用是否已安裝:driver.is_app_installed('com.lemon.lemonban')
6> 拉取(pull)文件:從設備上拉取文件,driver.pull_file(path),path為設備上的文件路徑
7> 推送(push)文件:推送文件到設備,driver.push_file(path),path為設備上的文件路徑
8> 瑣屏:driver.lock()
9> 解屏:driver.unlock()

12. appium -- 滑動屏幕
1> 滑動接口: swipe(起始X,起始Y,結束X,結束Y)
結束X-起始X:X軸滑動的距離
結束Y-起始Y:Y軸滑動的距離
Q:手機的屏幕尺寸有很多,如何兼容?
答:依據手機屏幕大小,通過設置屏幕橫/縱軸的百分比來實現滑屏,如橫軸X滑動屏幕的90%即可;
```python
import time
from appium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy

#代碼提供信息:什么平台,什么版本,什么app
#將操作的信息,發送給appium server,讓它去打開app
#appium server將執行命令發送給手機自帶的自動化框架,讓它啟動app或操作app

desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "6.0"
desired_caps["deviceName"] = "Android Emulator" #該參數無實際作用意義,但是仍需配置
desired_caps["noReset"] = True
desired_caps["app"] = r"D:\檸檬班培訓\VIP培訓課程\1027_簡歷輔導+項目流程講解+app安裝\appium+模擬器\Future-release-2018.apk"
desired_caps["appPackage"] = "com.xxzb.fenwoo" #前途貸app
desired_caps["appActivity"] = "com.xxzb.fenwoo.activity.addition.WelcomeActivity"

#1.代碼寫好,准備發送以上信息 2. 啟動appium server 3. 啟動模擬機,或連接真機,能夠讓adb識別到
#代碼 === appium server === 模擬器/真機

#連接appium server,並發送給它設備信息
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

#driver.install_app(r'D:\檸檬班培訓\VIP培訓課程\1027_簡歷輔導+項目流程講解+app安裝\appium+模擬器\Future-release-2018.apk')
time.sleep(5)

#獲取屏幕大小,通過設置屏幕橫/縱軸的百分比來實現滑屏
size = driver.get_window_size()
#向左滑
driver.swipe(size["width"]*0.9,size["height"]*0.5,size["width"]*0.1,size["height"]*0.5)
time.sleep(1)
#向右滑
driver.swipe(size["width"]*0.1,size["height"]*0.5,size["width"]*0.9,size["height"]*0.5)
time.sleep(1)
#向上滑
driver.swipe(size["width"]*0.5,size["height"]*0.9,size["width"]*0.5,size["height"]*0.1)
time.sleep(1)
#向下滑
driver.swipe(size["width"]*0.5,size["height"]*0.1,size["width"]*0.5,size["height"]*0.9)

```


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM