前言
測試APP時,有時候會遇到上下左右滑動的界面、遇到native 和 webview 切換的界面、彈框界面、元素坐標定位等等情況。下面將分別對這幾個難點做主要解析:
一、滑動界面的元素定位
1.查看APPIUM API源碼語法,起點和終點四個坐標參數(shù),duration是滑動屏幕持續(xù)的時間,時間越短速度越快。默認為None可不填,一般設置500-1000毫秒比較合適。
swipe(self, start_x, start_y, end_x, end_y, duration=None)
? ? Swipe from one point to another point, for an optional duration.
? ? 從一個點滑動到另外一個點,duration是持續(xù)時間
? ? :Args:? ? - start_x - 開始滑動的x坐標
? ? - start_y - 開始滑動的y坐標
? ? - end_x - 結束點x坐標
? ? - end_y - 結束點y坐標
? ? - duration - 持續(xù)時間,單位毫秒
? ? :Usage:? ? driver.swipe(100, 100, 100, 400)
2.手機從左上角開始為0,橫著的是x軸,豎著的是y軸

3.由于不同手機屏幕的分辨率不一樣,所以同一個元素在不同手機上的坐標也是不一樣的,滑動的時候坐標不能寫死了??梢韵全@取屏幕的寬和高,再通過比例去計算

4.為了后續(xù)方便調用滑動封裝函數(shù),下面示例代碼就把滑動進行封裝
>swipe函數(shù)參數(shù)說明:
參數(shù)1:driver設備
參數(shù)2:t是持續(xù)時間
參數(shù)3:n滑動次數(shù)

二、native與webview的切換
現(xiàn)在大部分app都是混合式的native+webview,對應native上的元素通過uiautomatorviewer很容易定位到,webview上的元素就無法識別了。
1.認識識webview
>用uiautomatorviewer定位工具查看app頁面,發(fā)現(xiàn)頁面上有些區(qū)域無法定位到,如下圖左邊紅色區(qū)域,只能定位到這個大框框,紅色框里面的元素是無法識別的。
>這時候可以查看元素屬性,如右圖它的class屬性,上面寫著WebView,那毫無疑問這種頁面就是webview了。

2.、接觸contexts
>.context的中文翻譯是上下文環(huán)境,學過selenium的同學,也可以理解為句柄(handle),其實是一回事,反正知道是兩個不同的環(huán)境就行了。
>.先獲取頁面是contexts環(huán)境,如下圖紅色區(qū)域,獲取的是一個list列表:
NATIVE_APP:這個就是native,也就是原生的
WEBVIEW_com.xxxx :這個就是webview
>.當看到打印出來有下圖兩個,就說明獲取到webview的context了(當然也有的app有坑,可能明明有webview,卻通過contexts獲取不到,這種需要特殊處理了)

3.換到webview
>要想操作webview上的元素,第一步需要切換環(huán)境(跟selenium的切換iframe,切換handle思路是一樣)
>切換方法:switch_to.context(參數(shù)是webview的context)
>由于第二步已經獲取到contexts是一個list對象,取這個list的第二個參數(shù)就行,也就是contexts[1]

4.切回native
>webview上操作完后,想回到native上操作,這時候需要先切回來,切回native有兩個方法:
方法1:driver.switch_to.context("NATIVE_APP")?? # 這個NATIVE_APP是固定的參數(shù)
方法2:driver.switch_to.context(contexts[0])????? # 從contexts里取第一個參數(shù)

5.示例代碼

三、彈框界面的定位
appium腳本在拿到大量安卓手機執(zhí)行的時候,app在很多手機上會跳出請求權限的彈框,彈框無法點掉,導致腳本定位元素失敗。APP里的彈框一般提示有兩種,一種是彈出需要點擊確定的提示框,這種直接獲取元素定位即可;另一種是toast,安卓頁面上彈出的提示框,這種提示框出現(xiàn)在屏幕上大概3秒左右就會消失。用uiautomatorviewer根本定位不到。查了下iOS端定位APP彈框資料,可以通過在 desirede_capabilities 設置 autoAcceptAlerts = true。Android端卻找不到好版本定位,為此,特總結Android端APP彈框定位方法,如下:
1.切換成真機之后,用automatorviewer定位工具去定位(很多情況下真機環(huán)境比模擬環(huán)境定位要好)
2.系統(tǒng)彈框是返回的event是null,可以通過AccessibilityServer?獲取到系統(tǒng)權限彈框的event?
3.可以嘗試用 driver.switch_to_alert().text[0:] 語句定位 ? ?#會顯示alert上的信息

相關資料:
1.彈窗處理
四、元素坐標定位
面試問題:有時候在定位元素的時候,你使出了十八班武藝還是定位不到,怎么辦呢?現(xiàn)在你就可以回答:定位元素所在位置的坐標即可
1.tap 是模擬手指點擊,一般頁面上元素的語法有兩個參數(shù),第一個是 positions,是 list 類型最多五個點,duration是持續(xù)時間,單位毫秒
tap(self, positions, duration=None):
Taps on an particular place with up to five fingers, holding for a certain time
模擬手指點擊(最多五個手指),可設置按住時間長度(毫秒)
:Args:
- positions - list 類型,里面對象是元組,最多五個。如:[(100, 20),(100, 60)]
- duration - 持續(xù)時間,單位毫秒,如:500
:Usage:
driver.tap([(100, 20), (100, 60), (100, 100)], 500)
2.坐標定位方法
>如下圖定位"去看看"這個按鈕的坐標,可以看到右側bonds屬性:[374,831][654,906]

>點右上角"搜索"按鈕,查看bonds屬性:[615,52][690,146]

3.示例代碼

歡迎關注公眾號
