[TOC]
# appium基本使用
* 夜神模擬器win7系統下的連接方法:**`adb connect 127.0.0.1:62001`**
* 夜神模擬器win10系統下的連接方法:**`adb connect 127.0.0.1:62025`**
* deviceName型號 **`adb devices -l`**
* 查看當前運行的APP的包名和打開的Activity
**`adb shell "dumpsys window | grep mCurrentFocus"`**
~~~
遇坑排查:
上述 adb shell "dumpsys window | grep mCurrentFocus" 得到的數據不對(也不能說不對,APP首次啟動,啟動的不是首頁)
獲取首次應用的活動名稱可以通過 啟動一次隨機 monkey命令來獲取
adb shell
monkey -p com.XXXX.XXX -vvv 1
·adb devices 有多個設備時,連接其中一個設備
adb -s 設備名 shell
adb -s 8BN******413 shell
獲取到的數據正確,app啟動成功
~~~

配置Python連接手機app
~~~
desired = {
"platformName": "Android",
"platformVersion": "設備版本",
"deviceName": "設備名稱",
"appPackage": "包名",
"appActivity": "activity名稱",
"unicodeKeyboard": "True",
"restKeyboard": "True"
}
~~~
首先需要現在appium中開啟服務

點擊后如下

在appium中配置json文件
~~~
{
"platformName": "Android",
"platformVersion": "設備版本",
"deviceName": "設備名稱",
"appPackage": "包名",
"appActivity": "activity名稱",
"unicodeKeyboard": "True",
"restKeyboard": "True"
}
~~~
然后點擊

填寫json內容

填寫完成后,點擊保存

當然你也可以保存該配置至電腦中


> ### 定位元素
`start_session`就可以開始定位元素了

基本使用

判斷屬性是否唯一



> ### 基本定位
~~~
from appium import webdriver
from time import sleep
# 配置需要操作的手機以及app
desired = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.mymoney",
"appActivity": "com.mymoney.biz.splash.newguide.NewGuideActivity",
"unicodeKeyboard": "True",
"restKeyboard": "True"
}
# 連接appium,打開app
d = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired)
sleep(5)
# 點擊下一步,使用id定位
d.find_element_by_id('com.mymoney:id/next_btn').click()
sleep(3)
# 再次點擊下一步,使用class定位
d.find_element_by_class_name('android.widget.Button').click()
sleep(3)
# 點擊開始隨手記
d.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.LinearLayout[2]/android.widget.LinearLayout[2]/android.widget.Button[1]').click()
sleep(10)
# 關閉app
d.close_app()
~~~
> ### UIAutomator定位
使用方法 find\_element\_by\_android\_uiautomator() 可以運用UiAutomator元素定位。
UiAutomator提供一下三種方式來定位:
?id定位`d.find_element_by_android_uiautomator('new UiSelector().resourceId("id的值")')`
?text定位`d.find_element_by_android_uiautomator('new UiSelector().text("text的內容")')`
?class name定位`d.find_element_by_android_uiautomator('new UiSelector().className("className的值")')`
> ### 定位一組元素
> ### Swipe 兩點之間的滑動操作
我們在使用App的過程中,經常會在屏幕上進行滑動的操作,如,刷新新聞,刷朋友圈等,會做上下滑動的動作;如果是看圖片,就會左右移動。在Appium里面,我們是用swipe()這個方法來實現這個操作。

語法:
`swipe(起始橫坐標,起始縱坐標,目標橫坐標,目標縱坐標)`
獲取屏幕尺寸`d.get_window_size()`獲取屏幕大小,以**詞典**的方式返回
想右滑動,y軸不變,x軸由小到大即可
~~~
# 獲取屏幕大小,以詞典的方式返回
size = d.get_window_size()
width = size['width']
height = size['height']
x1 = 0.2 * width
x2 = 0.9 * width
y = 0.5*height
d.swipe(x1,y,x2,y)
~~~
> ### 連續滑動
swipe滑動操作,一般是兩點之間的滑動,而實際使用過程中用戶可能要進行一些多點連續滑動操作。如手勢密碼操作,切西瓜等場景。那么在Appium中該如何模擬這類操作呢?
TouchAction
TouchAction包含一些列操作,比如按壓、長按、點擊、移動、暫停。由這些不同操作可以組成一套動作。使用TochAction需要先導入對應的模塊:
`from appium.webdriver.common.touch_action import TouchAction`
連續滑動需要導入`from appium.webdriver.common.touch_action import TouchAction`
* 按壓
方法:press() 按壓一個元素或坐標點(x,y)。
~~~
press(element)
press(x,y)
~~~
* 長按
方法:相比press()方法,long\_press()多了一個入參,就是長按的時間。duration以毫秒為單位。1000表示按一秒鐘。其用法與press()方法相同。
~~~
long_press(element,duration=1000)
long_press(x,y,duration=1000)
~~~
* 點擊
方法:tap() 對一個元素或控件執行點擊操作。用法參考press()。
~~~
tap(element)
tap(x,y)
~~~
* 移動
方法:move\_to() 將指針從上一個點移動到指定的元素或點。
~~~
move_to(element)
move_to(x,y)
~~~
* 暫停
方法:wait()暫停腳本的執行,單位為毫秒。
~~~
wait(ms)
~~~
* 釋放
方法release() ,我們滑動總要停止吧?怎么停止?就是用這個方法停止。
~~~
release()
~~~
* 執行
方法:perform() 把要執行的操作發送到Appium服務器,即讓要執行的操作生效。
~~~
perform()
~~~
**示例代碼**
~~~
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction
# 配置需要操作的手機以及app
desired = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.mymoney",
"appActivity": "com.mymoney.biz.splash.newguide.NewGuideActivity",
"unicodeKeyboard": True,
"restKeyboard": True
}
# 連接appium,打開app
d = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired)
sleep(5)
# UIAutomator定位之id定位
d.find_element_by_android_uiautomator('new UiSelector().resourceId("com.mymoney:id/next_btn")').click()
sleep(2)
# 再次點擊下一步,使用class定位
d.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button")').click()
sleep(2)
# 通過text定位,進入首頁
d.find_element_by_android_uiautomator('new UiSelector().text("開始隨手記")').click()
sleep(10)
# 點擊更多
d.find_element_by_id('com.mymoney:id/nav_setting_btn').click()
sleep(2)
# 往上滑動
# # 獲取屏幕大小,以詞典的方式返回
size = d.get_window_size()
width = size['width']
height = size['height']
x = 0.5 * width
y1 = 0.2 * height
y2 = 0.9 * height
d.swipe(x,y2,x,y1)
sleep(2)
# 點擊高級
d.find_element_by_android_uiautomator('new UiSelector().text("高級")').click()
sleep(2)
d.find_element_by_android_uiautomator('new UiSelector().text("密碼與手勢密碼")').click()
sleep(2)
d.find_element_by_android_uiautomator('new UiSelector().text("手勢密碼保護")').click()
sleep(2)
print('連續滑動')
TouchAction(d).press(x=169,y=190).wait(1000).move_to(x=274,y=190).move_to(x=270,y=293).move_to(x=170,y=382).release().perform()
sleep(3)
d.close_app()
~~~
> ### H5元素的定位
在混合開發的App中,經常會有內嵌的H5頁面。針對這種場景直接使用前面所講的方法來進行定位是行不通的,因為前面的都是基于Andriod原生控件進行元素定位,而Web網頁是單獨的B/S架構,兩者的運行環境不同因此需要進行上下文(context)切換,然后對H5頁面元素進行定位操作。
什么是context呢?在程序中context我們可以理解為當前對象在程序中所處的一個環境。 比如前面提到的App一個界面是屬于Activity類型,也就是Android界面環境,但是當訪問內嵌的網頁是屬于另外一個環境(網頁環境),兩者處于不同的一個環境。
* 獲取所有的上下文`contexts`,以列表的形式返回
~~~
all_context = d.contexts
print(all_context)
~~~
* 切換上下文`switch_to.context()`
~~~
all_context = d.contexts
d.switch_to.context(all_context[1])
~~~
* H5操作的環境搭建
1. 手機與電腦連接,通過adb devices可查看到此設備。
2. 電腦端必須安裝chrome瀏覽器(selenium環境搭建好即可)。
3. App Webview[開啟debug模式](https://www.jianshu.com/p/ebd9736ad274)(注:此步驟,一般需要App開發人員開啟。)
4. 在電腦端Chrome瀏覽器地址欄輸入`chrome://inspect/#devices`,進入調試模式
5. 打開app對應的h5頁面,在`chrome://inspect/#devices`地址中,檢查是否顯示對應的webview,如沒有,則當前未開啟調試模式。

上圖App已經開啟了開啟調試模式。
6. 下載與手機系統瀏覽器的版本相對應的驅動
比如我的版本是`74.0.3729.136`,我就需要下載相對應版本的谷歌瀏覽器驅動
下載下來之后創建一個文件夾存放該驅動,并且解壓
比如,我在**D**盤創建了一個`app_chromederiver`目錄,將驅動移動進去并解壓

另外在腳本中的`desired`中增加一項`chromedriverExecutable`指定驅動位置即可
比如我的:
~~~
# 配置需要操作的手機以及app
desired = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.wondershare.drfone",
"appActivity": "com.wondershare.drfone.ui.activity.Main2Activity",
"unicodeKeyboard": True,
"restKeyboard": True
}
# 由于appium自帶了一個chromedriver,所以我們需要指定appium使用我們下載下來的對應版本的驅動
# 在desired中,增加一個key>>> chromedriverExecutable,它的值就是指定的驅動位置
desired['chromedriverExecutable'] = R"D:\app_chromederiver\chromedriver.exe"
~~~
- 總章
- Oracle數據庫
- 常見的Linux命令
- 理論內容整理
- 給你如下功能怎么測試
- 支付怎么測試
- 購物車怎么測試?
- 搜索功能怎么測試?
- 文件上傳功能怎么測試?
- 登錄功能怎么測試?
- 還款功能怎么測試?
- 訂單功能怎么測試?
- 自動化測試篇
- 必記代碼
- 接口測試篇
- 性能測試篇
- app測試篇
- 面試篇
- 項目篇
- 職業素養篇
- 真實案列分析
- 如何預防冷場
- redis
- 琪琪
- 禪道搭建手冊
- 禪道搭建手冊1
- 禪道的基本使用
- 基于Python3_Selenium的自動化
- Python3安裝
- Python3基礎
- 列表_元組_集合
- 函數_模塊_類
- Python代碼
- selenium環境
- selenium定位方式
- Selenium常見操作
- toast讀取代碼
- 添加用戶代碼
- 隱式等待與顯式等待
- 循環添加用戶
- 測試用例練習
- 測試用例優化
- Fiddler抓包工具
- 安裝
- Fiddler使用
- 接口測試
- Jmeter的安裝
- Jmeter使用
- jmeter+ant+jenkins接口自動化測試框架
- 接口安全測試
- 性能測試
- Nmon監控LInux系統
- Jmeter分布式
- 性能測試-具體案例
- Monkey
- 安裝1
- Monkey使用
- appium自動化
- appium的安裝
- appium基本使用
- 真機USB連接
- 問題排查
- Jenkins持續集成
- Jenkins安裝
- Jenkins配置任務
- Python擴展內容
- Python連接數據庫
- Python進行接口測試
- 開啟服務