1.說明
前提:app自動化環境搭建----Windows系統搭建 已搭建完成
appium官方文檔:https://appium.io/docs/en/about-appium/getting-started/?lang=zh
2.創建項目(連接手機)
python appium 官方地址:https://pypi.org/project/Appium-Python-Client/
# 安裝 python appium 包 pip install Appium-Python-Client # windows系統執行命令 pip install Appium-Python-Client # mac系統執行命令
項目結果:
# main.py 文件 import os from appium import webdriver # 獲取apk在項目中的存放地址 apk = os.path.join(os.path.dirname(os.path.abspath(__file__)),'apk/app-release-fanmao-cnode.apk') desired_caps = { 'platformName':'Android', # 測試Android系統 'platformVersion':'7.1.2', # Android版本 可以在已連接手機 設置->關於手機 中查看 'deviceName':'127.0.0.1:62001', # cmd中使用 adb devices 命令查看已連接的設備 'automationName':'UiAutomator2', # 自動化引擎(默認UiAutomator2即可) 'app':apk # app 文件路徑(當前方式,每次運行項目,app都會重新安裝一次) } # 創建 webdriver 實例 連接手機 driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_capabilities=desired_caps)
第一步:啟動 appium server
需要注意的是:使用手機測試的話,啟動appium 的時候需要在手機上安裝 appium setting 有些手機有安全選項 需要手動去確認一下。
第二步:在pycharm中執行代碼
如果是在模擬器中執行,會先安裝appium setting(有,則跳過這一步),再安裝我們測試的apk,然后打開apk(打開成功,則連接手機通過,才可以繼續編寫我們的代碼)
執行完成后,可以關閉appiu(Ctrl+c 即可以關閉)
3.自動化登錄app
(1)找到自己的adb安裝路徑
找到 app 定位工具
(2)在模擬器或者連接的真機中,打開app里面我們需要定位的頁面,再打開uiautomatorviewer.bat
(3)元素定位----xpath 定位
//class的值[@屬性及其對應的值] /下面的元素class值
//android.view.ViewGroup[@resource-id="org.cnodejs.android.md:id/toolbar"]/android.widget.ImageButton
# main.py 文件 import os import time from appium import webdriver # 獲取apk在項目中的存放地址 apk = os.path.join(os.path.dirname(os.path.abspath(__file__)),'apk/app-release-fanmao-cnode.apk') desired_caps = { 'platformName':'Android', # 測試Android系統 'platformVersion':'7.1.2', # Android版本 可以在已連接手機 設置->關於手機 中查看 'deviceName':'127.0.0.1:62001', # cmd中使用 adb devices 命令查看已連接的設備 'automationName':'UiAutomator2', # 自動化引擎(默認UiAutomator2即可) 'app':apk # app 文件路徑(當前方式,每次運行項目,app都會重新安裝一次)
}
# 創建 webdriver 實例 連接手機
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",desired_capabilities=desired_caps) time.sleep(5)
# 點擊登錄
login_image_btn = '//android.view.ViewGroup[@resource-id="org.cnodejs.android.md:id/toolbar"]/android.widget.ImageButton' driver.find_element_by_xpath(login_image_btn).click()
time.sleep(1)
click_login_name = 'org.cnodejs.android.md:id/tv_login_name'
driver.find_element_by_id(click_login_name).click() time.sleep(1)
# 輸入登錄的token http://47.100.175.62:3000/
driver.find_element_by_id('org.cnodejs.android.md:id/edt_access_token').send_keys("83dc9ad3-f0e1-4cf3-a0de-d82a3508f79d")
# 點擊登錄
driver.find_element_by_id('org.cnodejs.android.md:id/btn_login').click()
第一步:啟動 appium server
需要注意的是:使用手機測試的話,啟動appium 的時候需要在手機上安裝 appium setting 有些手機有安全選項 需要手動去確認一下。
第二步:關閉 uiautomatorviewer.bat 元素定位工具
第二步:在pycharm中執行代碼
4.元素定位
(1)Xpath定位
//class的值[@屬性及其對應的值] /下面的元素class值
//android.view.ViewGroup[@resource-id="org.cnodejs.android.md:id/toolbar"]/android.widget.ImageButton
(2)and 並且多個屬性來定位
//*[@text="登錄" and @resource-id="org.cnodejs.android.md:id/btn_login"]
(3)子元素定位,先找到父元素,再找到子元素,[2] 表示第二個子元素
//*[@resource-id="org.cnodejs.android.md:id/recycler_view"]/android.widget.LinearLayout[2]
(4)xpath text 文本值定位
//*[@text="點擊頭像登錄"]
5.自動化發微博
5.1 先在模擬器上面下載並安裝 微博App (使用模擬器/真機都可以),安裝完成並登陸后,獲取包名,啟動頁名稱
打開cmd,運行命令
打開模擬器中的微博,查看日志
packageName:com.sina.weibo activityName:.SplashActivity
5.2 連接模擬器獲取自動化代碼
啟動 appium桌面客戶端
在新的窗口中添加連接配置
{ "platformName":"Android", # 測試Android系統 "platformVersion":"7.1.2", # Android版本 可以在已連接手機 設置->關於手機 中查看 "deviceName":"127.0.0.1:62001", # cmd中使用 adb devices 命令查看已連接的設備 "automationName":"UiAutomator2" # 自動化引擎(默認UiAutomator2即可) } # 可直接復制到JSON Representation { "platformName": "Android", "platformVersion": "7.1.2", "deviceName": "127.0.0.1:62001", "automationName": "UiAutomator2" }
ps:上傳圖片好麻煩啊~~~(注意,需要先下載幾張圖片在手機相冊中)
from appium import webdriver import time from appium.webdriver.common.touch_action import TouchAction desired_caps = { 'platformName':'Android', # 測試Android系統 'platformVersion':'7.1.2', # Android版本 可以在已連接手機 設置->關於手機 中查看 'deviceName':'127.0.0.1:62001', # cmd中使用 adb devices 命令查看已連接的設備 'automationName':'UiAutomator2', # 自動化引擎(默認UiAutomator2即可) 'noReset': True, # 不要重置app的狀態(比如,已經登陸的app,我們運行項目的時候保留之前的狀態) 'fullReset': False, # 不要清理app的緩存數據(比如,已經登陸的app,我們運行項目的時候保留之前的狀態) 'appPackage':"com.sina.weibo", # 應用的包名(打開對應包名的app) 'appActivity': ".SplashActivity" # 應用的活動頁名稱 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_caps) time.sleep(15) el1 = driver.find_element_by_id("com.sina.weibo:id/rightBtn_wrapper") el1.click() time.sleep(2) el2 = driver.find_element_by_accessibility_id("寫微博") el2.click() # 等待發微博頁面加載成功 time.sleep(3) el3 = driver.find_element_by_id("com.sina.weibo:id/edit_view") el3.send_keys("Hi 今天天氣真好啊") driver.find_element_by_accessibility_id("插入圖片").click() time.sleep(3) # 選擇圖片(抓取不到,所以需要自己去寫) xpath_img1 = '//*[@resource-id="com.sina.weibo:id/photo_album_gridview"]/android.widget.RelativeLayout[2]' xpath_img2 = '//*[@resource-id="com.sina.weibo:id/photo_album_gridview"]/android.widget.RelativeLayout[3]' driver.find_element_by_xpath(xpath_img1).click() time.sleep(2) # 選中 driver.find_element_by_id('com.sina.weibo:id/btn_num_check').click() # 返回上一層 driver.back() time.sleep(2) driver.find_element_by_xpath(xpath_img2).click() time.sleep(1) driver.find_element_by_id('com.sina.weibo:id/btn_num_check').click() # 點擊下一步 driver.find_element_by_id('com.sina.weibo:id/btn_confirm_edit').click() time.sleep(1) driver.find_element_by_id('com.sina.weibo:id/btn_confirm_edit').click() time.sleep(1) el4 = driver.find_element_by_accessibility_id("發送") el4.click() # 刷新微博 time.sleep(3) TouchAction(driver).press(x=390, y=200).move_to(x=390, y=1323).release().perform() # driver.quit()