Python + Appium 自動化操作微信入門看這一篇就夠了
阿新 • • 發佈:2020-11-04
## 簡介
Appium 是一個開源的自動化測試工具,支援 Android、iOS 平臺上的原生應用,支援 Java、Python、PHP 等多種語言。
Appium 封裝了 Selenium,能夠為使用者提供所有常見的 JSON 格式的 Selenium 命令以及額外的移動裝置相關的控制命令,比如:多點觸控手勢、螢幕朝向等。
## 環境
本文主要環境如下:
+ Win7
+ JDK1.8
+ Appium
+ Python3.7
+ android-sdk
+ mumu 模擬器
### JDK
下載地址:`https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html`,也可在文末直接獲取
配置環境變數:
* 計算機(右鍵)->屬性->高階系統設定->高階->環境變數->新建環境變數 `JAVA_HOME`,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202048842-190799949.png)
* 系統變數->找到 `Path` 變數->編輯->在變數值的末尾新增`;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;`
* 新建 `CLASSPATH` 變數,變數值為:`.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar`
### android-sdk
下載地址:`https://www.androiddevtools.cn/`,也可在文末直接獲取
配置環境變數:
* 與 JDK 配置類似,新建環境變數 `ANDROID_HOME`,變數值為 `android-sdk` 位置,比如:`D:\android-sdk-windows`
* 在 `Path` 變數值的末尾新增 `;%ANDROID_HOME%\tools;%ANDROID_HOME%\build-tools\30.0.0-preview;%ANDROID_HOME%\platform-tools`
### Appium
下載地址:`https://github.com/appium/appium-desktop/releases/tag/v1.18.3`,也可在文末直接獲取
安裝 Python 庫:`pip install appium-python-client`
Appium 安裝完成啟動後,點選編輯配置,配置 JDK 和 android-sdk,如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202103416-304964754.png)
### mumu
下載地址:`http://www.51xiazai.cn/soft/584481.htm`,也可在文末直接獲取
mumu 模擬器下載完後,除了根據自己需要更改一下安裝路徑,其他選項預設即可安裝,裝完後開啟點選`應用中心`,搜一下微信,搜到之後安裝一下,微信安裝完成後再用自己的微訊號登入一下。
因為我們是通過安卓的 `adb` 連線虛擬機器的,因此需要在控制檯執行 `adb connect 127.0.0.1:7555` 命令,讓 `adb` 連線上虛擬機器。
執行了上面連線模擬器的命令後,我們可以在 `cmd` 控制檯輸入 `adb devices` 檢視當前連線的虛擬機器。
## 使用
首先啟動 Appium 和 mumu,因為之前我們已經配置了 Appium,此時我們直接點選 Appium 的`啟動伺服器`按鈕即可,如下圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202116413-1758267038.png)
啟動之後如圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202128074-1894379158.png)
現在我們可以先通過 Python 來啟動一下微信,程式碼實現如下:
```
desired_caps = {
"platformName": "Android", # 作業系統
"deviceName": "emulator-5554", # 裝置 ID
"platformVersion": "6.0.1", # 裝置版本號
"appPackage": "com.tencent.mm", # app 包名
"appActivity": "com.tencent.mm.ui.LauncherUI", # app 啟動時主 Activity
'noReset': True, # 是否保留 session 資訊,可以避免重新登入
'unicodeKeyboard': True, # 使用 unicodeKeyboard 的編碼方式來發送字串
'resetKeyboard': True # 將鍵盤給隱藏起來
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
```
執行上述程式碼之後,如果發現 mumu 模擬器中的微信已經啟動了,就說明基本環境已經調通了;如果執行程式碼後發現調不到 mumu 模擬器中的微信,先在 `cmd` 中執行一下 `adb connect 127.0.0.1:7555` 命令,再執行程式即可。
### 新增好友
我們先來使用 Appium 實現新增好友的操作,基本過程為:開啟微信->點選⊕->選擇新增朋友->在搜尋框輸入微訊號->點選搜尋->點選新增到通訊錄,功能的程式碼實現如下:
```
desired_caps = {
"platformName": "Android", # 作業系統
"deviceName": "emulator-5554", # 裝置 ID
"platformVersion": "6.0.1", # 裝置版本號
"appPackage": "com.tencent.mm", # app 包名
"appActivity": "com.tencent.mm.ui.LauncherUI", # app 啟動時主 Activity
'noReset': True, # 是否保留 session 資訊,可以避免重新登入
'unicodeKeyboard': True, # 使用 unicodeKeyboard 的編碼方式來發送字串
'resetKeyboard': True # 將鍵盤給隱藏起來
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(10)
print('點選+號')
driver.find_element_by_id('com.tencent.mm:id/ef9').click()
time.sleep(5)
print('選擇新增朋友')
driver.find_elements_by_id('com.tencent.mm:id/gam')[1].click()
time.sleep(5)
print('點選搜尋框')
driver.find_element_by_id('com.tencent.mm:id/fcn').click()
time.sleep(5)
print('在搜尋框輸入微訊號')
driver.find_element_by_id('com.tencent.mm:id/bhn').send_keys('ityard')
time.sleep(3)
print('點選搜尋')
driver.find_element_by_id('com.tencent.mm:id/ga1').click()
time.sleep(3)
print('點選新增到通訊錄')
driver.find_element_by_id('com.tencent.mm:id/g6f').click()
```
簡單說一下,在程式碼中我們通過 `driver.find_element_by_id('com.tencent.mm:id/xx')` 來獲取微信上的元素,如果有重複的,則可以使用 `driver.find_elements_by_id('com.tencent.mm:id/xx')[n]` 來取,通過 `send_keys('xx')` 實現資訊的輸入,通過 `click()` 實現點選操作。
上面我們說了通過 `find_element(s)_by_id('com.tencent.mm:id/xx')` 來獲取元素,那麼如何來確定 `xx` 呢?下面來一起看一下。
首先我們點選 Appium 中的放大鏡位置,如下圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202143232-1684553235.png)
點選之後會進到如下介面:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202154273-1578964666.png)
我們在圖中`所需功能`下方將程式碼中的 `desired_caps` 資訊配置進去,配置好後點擊`啟動會話`按鈕,啟動之後我們會發現 Appium 中與 mumu 中的微信效果不一致,如下圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202205334-119776773.png)
此時只需點選一下上圖中紅框圈起來的重新整理按鈕即可,現在我們就可以確定元素的值了(也就是上面說的 `xx`),比如:我們來確定微信中新增位置 `⊕` 的值,用滑鼠點選 `⊕` 即可檢視,如下圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202215682-1653597752.png)
我們接著點選 `⊕`,操作步驟為:先到 mumu 模擬器中點選微信中的 `⊕`,如下圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202226884-1118317961.png)
點選之後再到 Appium 中點選重新整理按鈕,如下圖所示:
![](https://img2020.cnblogs.com/blog/1497257/202011/1497257-20201104202236873-1484534303.png)
從圖中我們可以看列表中每個選項的值都是 `com.tencent.mm:id/gam`,此時程式碼中我們就是用的 `driver.find_elements_by_id('com.tencent.mm:id/gam')[1]` 來取的,通過上面的介紹相信大家對 Appium 的使用已經基本瞭解了。
### 傳送訊息
傳送訊息我們模擬的基本流程是:開啟微信->點選搜尋的放大鏡->在搜尋框輸入好友暱稱->點選搜尋到的好友->傳送文字+表情,程式碼實現如下:
```
desired_caps = {
"platformName": "Android", # 作業系統
"deviceName": "emulator-5554", # 裝置 ID
"platformVersion": "6.0.1", # 裝置版本號
"appPackage": "com.tencent.mm", # app 包名
"appActivity": "com.tencent.mm.ui.LauncherUI", # app 啟動時主 Activity
'noReset': True, # 是否保留 session 資訊,可以避免重新登入
'unicodeKeyboard': True, # 使用 unicodeKeyboard 的編碼方式來發送字串
'resetKeyboard': True # 將鍵盤給隱藏起來
}
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(10)
print('點選微信搜尋框')
driver.find_element_by_id('com.tencent.mm:id/f8y').click()
time.sleep(10)
print('在搜尋框輸入搜尋資訊')
driver.find_element_by_id('com.tencent.mm:id/bhn').send_keys('Python小二')
time.sleep(3)
print('點選搜尋到的好友')
driver.find_element_by_id('com.tencent.mm:id/tm').click()
time.sleep(3)
# 輸入文字
driver.find_element_by_id('com.tencent.mm:id/al_').send_keys('hello')
time.sleep(3)
# 輸入表情
driver.find_element_by_id('com.tencent.mm:id/anz').click()
time.sleep(3)
driver.find_element_by_id('com.tencent.mm:id/rv').click()
# 點擊發送按鈕傳送資訊
driver.find_element_by_id('com.tencent.mm:id/anv').click()
# 退出
driver.quit()
```
最後說一點,因模擬器反應可能會慢一些,如果程式執行時出錯,可以將中間的等待時間 `time.sleep(x)` 設定大一些。
軟體及程式碼在公號 **Python小二** 後臺回覆 **201104**