一、獲取手機信息
adb devices獲取手機或模擬器的設備名
aapt dump badging xxxx.apk獲取app的包名、入口等基本信息
如果想要知道手機原生攜帶的app的基本信息,首先是無法獲取到這個apk軟件包,也就無法用aapt的方法來獲取對應的信息。此時可以通過抓取日志的方法獲取基本信息。
舉例:想要獲取到手機功能---設置 的基本信息。最終可以通過代碼或appium客戶端鏈接手機,並自動啟動手機的設置功能
方法:
1、關閉手機后台運行的所有程序
2、打開手機日志
在cmd窗口輸入adb logcat | findstr /i start 查看日志並過濾出來start 類型日志,保持日志監控窗口不動
3、點擊手機中的---設置,查看cmd窗口日志文件
因為先前已經把所有后台運行日志關閉。所有此時打開設置,可以看到日志窗口發生了變化,可以確定這個日至就是設置功能的日志
從上面的日志信息中,可以看到有這樣以穿字符串:com.android.settings/.Settings
這個字符串中的 / 左側即為包名,右側是入口。然后可以把這個包名和程序入口,替換我們代碼中的對應qq的包名和程序入口。替換完成以后,運行程序,就會發現設置自動被啟動了
二、通過代碼鏈接模擬器/手機
from appium import webdriver#導入appium包 #連接手機app初始化的一些信息 desc={} desc['deviceName']='127.0.0.1:62001'#手機設備名稱,adb devices desc['platformVersion']='4.4.2'#手機版本,在手機中:設置--關於手機 desc['platformName']='Android' #手機類型,ios或android #輸入命令,獲取app信息:aapt dump badging C:\Users\83473\Desktop\mobileqq_android.apk desc['appPackage']='com.tencent.mobileqq'#包名 desc['appActivity']='com.tencent.mobileqq.activity.SplashActivity'#啟動入口 desc["unicodeKeyboard"] = "True"#appium提供的一種輸入法,可以傳中文。測試時直接用這個輸入法 desc["resetKeyboard"] = "True"#程序結束時重置原來的輸入法 desc["noReset"] = "True"#不初始化手機app信息(類似不清楚緩存) #啟動服務端,再cmd窗口輸入appium.如果appium沒有安裝好,可以打開appium-desktop.也相當於啟動了服務 driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desc)#訪問服務接口,並啟動手機app。url參數是當appium啟動后,默認訪問服務地址和接口
啟動服務如下圖:
至此,可以直接右鍵運行程序,可以看到模擬器中的qq就啟動了
三、用客戶端鏈接app
1、雙擊上面的圖標,打開appium-desktop,點擊start session
2、打開后,點擊屏幕右上角的搜索按鈕
3、然后會打開配置頁面,在本地服務配置信息同上面寫的代碼鏈接配置。填入正確的信息后,點擊startSession
成功啟動模擬器中的qq程序。如下圖。此時如果模擬器和appium-desktop中界面不同,可點擊刷新按鈕同步下。
四、定位方式
1、id定位
舉例:
點擊定位元素按鈕,點擊左側app界面中的登錄定位元素后,就會出現selected element界面。
此時,右側欄中可以看到,有個id,下拉滾動條會發現還有個resource-id。會發現他們兩個是一樣的。這就是說明,這個id是唯一的,登錄按鈕被唯一定位到,代碼中就可以通過id直接定位===》find_element_by_id('com.tencent.mobileqq:id/btn_login') #通過id定位
如果右側欄中只有resource-id,沒有id,說明resource-id不是唯一的,也就是不能通過id定位方式定位元素.
id一定要用雙引號括起來
2、xpath定位
用定位元素按鈕定位某個元素后,右側selected element欄目中找到xpath,復制其對應的內容。通過xpath方法就可以定位
driver.find_element_by_xpath('//android.widget.EditText[@content-desc="請輸入QQ號碼或手機或郵箱"]')
3、殘障人士提示信息進行定位,也就是content-desc:
先用定位元素按鈕定位某個元素后,右側selected element欄目中,找到content-desc。復制content-desc的值后。通過find_element_by_accessibility_id(),將對應的值作為參數傳入。
driver.find_element_by_accessibility_id('請輸入QQ號碼或手機或郵箱')
4、AndroidUiautomator定位
這個在運行時,調用的是Android自帶的UI框架UiAutomator的Api。格式固定,介紹幾個常用的格式如下
driver.find_element_by_android_uiautomator('new UiSelector().text("手機號")') # 包含text文字 driver.find_element_by_android_uiautomator('new UiSelector().textContains("機")') # 以text什么開始 driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("手")') # 正則匹配text driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^手.*")') # className driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")') # classNameMatches driver.find_elements_by_android_uiautomator('new UiSelector().classNameMatches("^android.widget.*")') # resource-id、resourceIdMatches driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.syqy.wecash:id/et_content")') # description driver.find_element_by_android_uiautomator('new UiSelector().description("S 日歷")') # descriptionStartsWith driver.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("日歷")') # descriptionMatches driver.find_element_by_android_uiautomator('new UiSelector().descriptionMatches(".*歷$")')
五、通過不同的定位方式查找元素
我們也可以通過appium-desktop的search for element功能。通過定位方式和對應的值來查找元素,從而驗證定位方式和值的正確性
可以看到定位方式就是我們第4借說的集中定位方式。選擇一個定位方式,填入對應的值,點擊search
選中找到的元素,可以看到左側對應手機界面中的元素被選中。從而也證明我們的這種定位方式和對應的值都是沒問題的。可以定位到元素的。
如果是按鈕,就點擊 tap element ,相當於代碼中的click()
如果是輸入框,就在‘enter keys' 中輸入內容,然后點擊sendkeys就可以往已選的元素中輸入內容,相當於代碼中的send_keys()
六、錄制
點擊小眼睛圖標的錄制按鈕,可以看到界面展現出來代碼模塊。可以選擇錄制語言=》python或其他
然后和右側selected element 欄目中的tap、send keys、clear 或者 search for element結合操作,根據search for element找到元素定位i,並tap或者sendkeys等操作。這些操作都會被錄制下來並生成python代碼。可直接使用