Appium經常使用操做之「元素定位、swipe 滑屏操做」

堅持原創輸出,點擊藍字關注我吧

做者:清菡

博客:oschina、雲+社區、知乎等各大平臺都有。ios

目錄

  • 1、打開 uiautomatorviewer
  • 2、Appium 經常使用操做
    • 1.用 layui 作 app 元素定位的時候會報錯怎麼辦?
    • 2.不等待,直接去找這個元素會報錯嗎?
    • 3.若是是 Web 自動化,會 import By,在 Appium 中 MobileBy 有 8 種定位方式。若是如今還用 By,就沒辦法用到 uiautomator 以及 accessibility_id。
    • 4.若是是歡迎頁面,沒有這種元素的怎麼辦?
  • 3、打開 app 並登陸
  • 4、移動端特有的操做
    • 1.swipe 滑屏操做
    • 2.若是寫一個操做,全部的手機都能適用,是否是應該考慮屏幕的尺寸呢?
    • 3.有沒有什麼辦法能夠獲取整個設備的尺寸大小?
    • 4.屏幕的 size 怎麼獲取呢?
    • 5.這個東西想一口氣把它滑過來,不能出現滑動到半路上又回去了。若是我要從右邊滑到左邊,起點和終點怎麼選?
    • 6.準備花多長時間去滑動呢?

1、打開 uiautomatorviewer

用這個工具來給你們定位:web

實現一個截屏(一般狀況下這樣用,能夠截屏成功)。app

2、Appium 經常使用操做

1.用 layui 作 app 元素定位的時候會報錯怎麼辦?

建議不用 layuilayui 在有些狀況下定位元素是有問題的。在環境基本上是正確的狀況下,它截圖截不到。因此能夠捨棄 layui,直接用自帶的 uiautomatorviewer(如今擁有的定位方式,它所有都支持)。函數

2.不等待,直接去找這個元素會報錯嗎?

和 Web 自動化同樣,Appium 執行這個命令也是須要時間的。這一行代碼,是進入到 app 當中,app 在這個過程當中作一件事(一堆的東西),因此即使你運行的這隻有這一行代碼,它作的事比較多。工具

感受上比 Web 等待的時間要長,可是若是你是用真機的話比用模擬器快。測試

因此這個以前須要等待一下。在 Web 自動化等待的時候用的是這個WebDriverWait以及EC條件表達。在這裏也是同樣,由於都是要頁面等待元素出現,等待元素可見。ui

3.若是是 Web 自動化,會 import By,在 Appium 中 MobileBy 有 8 種定位方式。若是如今還用 By,就沒辦法用到 uiautomator 以及 accessibility_id。

因此在移動端當中代碼:

from selenium.webdriver.common.by import Bycode

要改爲:

from appium.webdriver.common.mobileby import MobileByorm

不再須要用By了,By有的id、class,它都有的。因此,在這個地方要等到這個id出現,那就是:server

WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,'com.huyu.yuncaidian:id/id_text')))

這個是打開 app 以後必定要作的等待工做。

4.若是是歡迎頁面,沒有這種元素怎麼辦?

若是默認進入的就是歡迎界面,要咱們左滑右滑的這種,那就sleep由於你沒有可識別的元素。

經過 Activity 的名字來識別沒有用,由於它也叫 Activity。

能夠找到,可是不表明這個東西出來了。

若是有明確元素的時候,就不要用time.sleep了。就等到元素出現,再去操做元素。

這個元素定位和 Web 元素定位同樣的,有多種方式。

安卓和 ios 的手機屏幕有大小的限制,因此一個頁面當中元素不會太多,也不會很密密麻麻。由於它須要你不但要能看得清楚還能用手點得着。因此它會作的格局上面內容偏少,間距也會比較大。

點擊「個人」後,頁面內容切換。頁面內容切換,你就要等,它也是要加載時間的。

3、打開 app 並登陸

#  某app 2.9.0準環境
from appium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.mobileby import MobileBy

desired_caps={}
# 平臺類型
desired_caps["platformName"]="Android"
# 平臺版本號
desired_caps["platformVersion"]="7.0"
# 設備名稱
desired_caps["deviceName"]="XPUDU17713003790"
# app 包名
desired_caps["appPackage"]="保密"
# app 入口 acitivity
desired_caps["appActivity"]="保密"

# 鏈接Appium server。前提:appium desktop要啓動。有監聽端口。
# 將desired_caps發送給appium server。打開app
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

# 運行代碼以前:
#1.appium server啓動成功。處於監聽狀態
#2.模擬器/真機必須可以被電腦識別。即adb devices可以識別到要操做的設備。


# 點擊「個人」
time.sleep(5)
# 元素定位-組合定位方式
driver.find_element_by_xpath("//*[@resource-id='com.tfffc.cf:id/id_text' and @text='個人']").click()

#點擊手機密碼登陸
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,'com.tfffc.cf:id/tv_phone_passwad')))
driver.find_element_by_id('com.tfffc.cf:id/tv_phone_passwad').click()

#輸入用戶名、密碼、點擊登陸按鈕
WebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ID,'com.tfffc.cf:id/editview_phone')))
driver.find_element_by_id('com.tfffc.cf:id/editview_phone').send_keys('輸入手機號')
driver.find_element_by_id('com.tfffc.cf:id/editview_phone_password').send_keys('輸入密碼')
driver.find_element_by_id('com.tfffc.cf:id/phone_password_login').click()

4、移動端特有的操做

1.swipe 滑屏操做

Appium 的swipe函數是針對屏幕上的座標來滑動的。
swipe函數是安卓和 IOS 兩種設備同時通用。

從一個點滑到另一個點,那麼每一個點都有 x 值和 y 值。swipe有 4 個參數。因此起始 x,起始 y,結束 x,結束 y。

2.若是寫一個操做,全部的手機都能適用,是否是應該考慮屏幕的尺寸呢?

手機有 5 寸、4.4 寸、5.7 寸的。分辨率是 1280x700,因此它最大的座標點就是 1280x700。不一樣的安卓廠商、不一樣的大小,它的分辨率都不同,它的座標值是絕對不同的。

這個怎麼辦?怎麼兼容下這個特徵比較好?

不須要針對每一個版型的手機寫一段代碼,所有通用。

用座標有個缺陷:可能適用於某一種手機,換個手機就不行了,由於座標值對不上。

3.有沒有什麼辦法能夠獲取整個設備的尺寸大小?

直接獲取下它的寬和高是多少。針對屏幕上的某個座標點來滑動的,又不是針對某一個元素。整屏滑動就是左滑右滑,上滑下滑。

設置下滑動的百分比,若是滑動40%-50%,感受根本滑動不過去。若是可以獲取到整屏的大小,按百分比來滑動,滑動的距離在70%-90%,那確定就能滑過去了。

根據每一個手機的 x 軸和 y 軸,肯定它的滑屏百分比,那隨便什麼樣的手機都是能夠滑屏的。因此在實現這個滑屏的時候,首先獲取屏幕的size

4.屏幕的 size 怎麼獲取呢?

有個專門的函數:

get_window_size 返回窗口的寬和高。

get_window_size()這個函數的返回值:

返回的是個字典。

5.這個東西想一口氣把它滑過來,不能出現滑動到半路上又回去了。若是我要從右邊滑到左邊,起點和終點怎麼選?

swipe有 2 個座標點,首先要獲得start_x

x 軸是widthsize['width']是 x 軸的最大值。

全部人的使用習慣: 滑屏都是在正中間滑屏或者稍微偏下一點。從一個頁面滑動到另一個頁面,y 軸沒有變化。

因此 y 值是固定的,就取箇中間值 0.5:

#height、width
size= driver.get_window_size()
start_x=size['width']*0.9
start_y=size['height']*0.5

滑動的間距最好是達到 80%以上,這樣寫,間距就是 0.8 了:

#height、width
size= driver.get_window_size()
start_x=size['width']*0.9
start_y=size['height']*0.5

end_x=size["width"]*0.1

swipe還有個參數叫作duration(時長),這個單位是毫秒

6.準備花多長時間去滑動呢?

看過手機的操做,若是滑動的太快了,根本沒有效果。有的時候滑動的太快了,它還沒來得及響應就結束了。因此能夠設置下duration(時長),放緩一點呢,相對來講更穩定些。

向上向下滑動的時候,start_x 是?

上下滑動,x 軸不變,x 軸一樣取中間值。可是 y 軸從下往上,值愈來愈小。

這個能夠把它封裝起來,之後須要的時候直接調用就行了,隨便什麼設備都是同樣的。若是webdriver中有些方法標明瞭僅僅是 ios 或者安卓,那就只能在對應的平臺上使用。

若是一個函數並無說明,那麼就是你們一塊兒用的,不分彼此。

#height、width
size= driver.get_window_size()
start_x=size['width']*0.9
start_y=size['height']*0.5

end_x=size["width"]*0.1
end_y=size['height']*0.5
#從右向左滑
driver.swipe(start_x,start_y,end_x,end_y,200)
#從左向右滑
driver.swipe(end_x,end_y,start_x,start_y,200)

#向下滑動
#向上滑動:x軸不變,y從大到小
driver.swipe(size["width"]*0.5,size["heigth"]*0.9,size["width"]*0.5,size["heigth"]*0.1)
#向上滑動:x軸不變,y從小到大
driver.swipe(size["width"]*0.5,size["heigth"]*0.1,size["width"]*0.5,size["heigth"]*0.9)

公衆號清菡軟件測試首發,更多原創文章:清菡軟件測試 94+原創文章,歡迎關注、交流,禁止第三方擅自轉載。

感謝支持清菡原創,歡迎點擊在看和轉發!

相關文章
相關標籤/搜索