Appium(九):Appium API(三) 滑動和拖拽、高級手勢、手機操做

1. 滑動和拖拽

咱們在作自動化測試的時候,有些按鈕是須要滑動幾回屏幕後纔會出現,此時,咱們須要使用代碼來模擬手指的滑動,也就是接下來要學的滑動和拖拽了。android

1.1 swipe滑動事件

從一個座標位置滑動到另外一個座標位置,只能是兩個點之間的滑動。web

方法:api

driver.swipe(start_x, start_y, end_x, end_y, duration=None):參數分別是起點座標的x,y和終點座標的x,y,以及滑動時間,滑動事件的單位是ms。網絡

實例1:app

模擬手指從(100,2000),滑動到(100,1000)的位置。測試

driver.swipe(100, 2000, 100, 1000)

實例2:ui

模擬手指從(100, 2000),滑動到(100, 100)的位置。編碼

driver.swipe(100, 2000, 100, 100)

實例3:spa

模擬手指從(100, 2000),滑動到(100, 100)的位置,持續5秒。.net

driver.swipe(100, 2000, 100, 100, 5000)

距離相同時,持續時間越長,慣性越小。

持續時間相同時,手指滑動的距離越大,實際滑動的距離也就越大。

1.2 scroll滑動事件

從一個元素滑動到另外一個元素,直到頁面自動中止。

方法:

driver.scroll(origin_el, destination_el):參數分別是滑動開始的元素和滑動結束的元素。 

實例:

從「存儲」滑動到「更多」。

save_button = driver.find_element_by_xpath("//*[@text='存儲']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.scroll(save_button, more_button)

不能設置持續時間,慣性很大。

1.3 drag_and_drop拖拽事件

從一個元素滑動到另外一個元素,第二個元素代替第一個元素本來屏幕上的位置。

方法:

driver.drag_and_drop(origin_el, destination_el):參數分別是滑動開始的元素和滑動結束的元素。

將「存儲」拖拽到「更多」。

save_button = driver.find_element_by_xpath("//*[@text='存儲']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.drag_and_drop(save_button, more_button)

不能設置持續時間,沒有慣性

1.4 滑動和拖拽的選擇

滑動和拖拽無非就是考慮是否具備「慣性」,以及傳遞的參數是「元素」仍是「座標」。

能夠分爲四種狀況:

有 「慣性」 ,傳入 「元素」:scroll。

無 「慣性」 ,傳入 「元素」:drag_and_drop。

有 「慣性」 ,傳入 「座標」:swipe,而且設置較短的duration時間。

無 「慣性」 ,傳入 「座標」:swipe,而且設置較長的duration時間。

2. 高級手勢

高級手勢TouchAction能夠實現一些針對手勢的操做,好比滑動、長按、拖動等。咱們能夠將這些基本手勢組合成一個相對複雜的手勢。好比,咱們解鎖手機或者一些應用軟件都有手勢解鎖的這種方式。

想要使用TouchAction,必需要建立TouchAction對象,經過對象調用想要執行的手勢,經過perform()執行動做。

須要導入的模塊:

from appium.webdriver.common.touch_action import TouchAction

2.1 輕敲操做

模擬手指對某個元素或座標按下並快速擡起。好比,固定點擊(100, 100)的位置。

方法:

TouchAction(driver).tap(element=None, x=None, y=None).perform():參數能夠是元素,也能夠是x,y座標。

實例:

打開《設置》,輕敲「WLAN」。

# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction

# 初始化
desired_caps = {}
# 使用哪一種移動平臺
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查詢,當有多臺設備時,須要聲明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings'

# 啓動服務
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
TouchAction(driver).tap(el).perform()

sleep(5)

#退出driver
driver.quit()

2.2 按下和擡起操做

模擬手指一直按下,模擬手指擡起。能夠用來組合成輕敲或長按操做。

方法:

TouchAction(driver).press(el=None, x=None, y=None).perform():模擬手指按下,參數和輕敲操做同樣。

方法:

TouchAction(driver).release().perform():模擬手指對元素或座標的擡起操做。

實例1:

使用座標的形式按下 WLAN(650, 650),2 秒後,按下(650, 650)的位置。

# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction

# 初始化
desired_caps = {}
# 使用哪一種移動平臺
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查詢,當有多臺設備時,須要聲明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings'

# 啓動服務
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

TouchAction(driver).press(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).perform()

sleep(5)

#退出driver
driver.quit()

實例2:

使用座標的形式按下 WLAN (650, 650),2 秒後,按下(650, 650)的位置,並擡起。

# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction

# 初始化
desired_caps = {}
# 使用哪一種移動平臺
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查詢,當有多臺設備時,須要聲明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings'

# 啓動服務
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

TouchAction(driver).press(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).release().perform()

sleep(5)

#退出driver
driver.quit()

2.3 等待操做

模擬手指等待,好比按下後等待5秒以後再擡起。

方法:

TouchAction(driver).wait(ms=0).perform():參數是暫停的毫秒數。

實例:

使用座標的形式點擊 WLAN(650, 650),2 秒後,按下(650, 650)的位置,暫停2秒,並擡起。

# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction

# 初始化
desired_caps = {}
# 使用哪一種移動平臺
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查詢,當有多臺設備時,須要聲明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings'

# 啓動服務
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

TouchAction(driver).tap(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).wait(2000).release().perform()

sleep(5)

#退出driver
driver.quit()

2.4 長按操做

模擬手指移動操做,好比,手勢解鎖須要先按下,再移動。

方法:

TouchAction(driver).move_to(el=None, x=None, y=None).perform():參數同上。

實例:

在手勢解鎖中,畫一個以下圖的案例。

手勢解鎖的包名和界面名:

com.android.settings/.ChooseLockPattern

# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction

# 初始化
desired_caps = {}
# 使用哪一種移動平臺
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查詢,當有多臺設備時,須要聲明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.ChooseLockPattern'

# 啓動服務
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

TouchAction(driver).press(x=150, y=525).move_to(x=450, y=525).move_to(x=750,
y=525).move_to(x=750, y=825).move_to(x=450, y=825).move_to(x=150,
y=825).move_to(x=450, y=1125).release().perform()

sleep(5)

#退出driver
driver.quit()

3. 手機操做

3.1 獲取手機分辨率

自動化測試可能會須要根據當前設備的屏幕分辨率來計算一些點擊或者滑動的座標。

方法:

driver.get_window_size()

實例:

輸出當前設備的屏幕分辨率。

print(driver.get_window_size())

 

 

3.2 手機截圖

有些自動化的操做可能沒有反應,但並不報錯。此時咱們就能夠將操做事後的關鍵狀況,截圖留存。後 期也能夠根據圖片發現問題。 

方法:

get_screenshot_as_file(filename):參數是將截圖保存爲指定路徑下、指定格式的圖片。

實例:

打開《設置》界面,截圖當前頁面保存到當前目錄,命名爲screen.png。(也能夠修改成絕對路徑,將圖片保存在目標文件夾中。)

driver.get_screenshot_as_file("screen.png")

 

 

3.3 獲取和設置手機網絡

視頻應用在使用流量看視頻的時候,大部分都會提示用戶正在是否繼續播放。做爲測試人員,咱們可能須要用自動化的形式來判斷是否有對應的提示。即,用流量的時候應該有提示,使用WIFI的時候應該沒有提示。 

3.3.1 獲取手機網絡

方法:

driver.network_connection 

實例:

獲取當前網絡類型,並打印到控制檯。

print(driver.network_connection)

 

 

打印了一個6,這是什麼意思呢,咱們去查看下driver.network_connection的源碼。

 

 

能夠看到6表明的意思是全部網絡所有打開,即手機流量和WIFI都是開啓狀態的。 

3.3.2 設置手機網絡

方法:

driver.set_network_connection(connectionType):參數爲網絡類型。 

實例:

設置當前設備爲飛行模式。

driver.set_network_connection(1)

 

 

又將網絡設置爲所有打開

driver.set_network_connection(6)

 

 

3.4 發送鍵到設備

模擬按 「返回鍵」 「home鍵」 等等操做,好比,不少應用有按兩次返回鍵退出應用的功能,若是這個功能 須要咱們作自動化,那麼必定會用到這個方法。

方法:

driver.press_keycode(keycode, metastate=None):第一個參數是發送給設備的關鍵代碼,第二個是關鍵代碼的元信息,通常是默認值。 

按鍵對應的編碼,你們能夠看我找到的一個CSDN大佬總結的:https://blog.csdn.net/feizhixuan46789/article/details/16801429 

實例:

點擊三次音量加,再點擊返回,再點擊兩次音量減。(爲了讓效果明顯,我設置了暫停)

driver.press_keycode(24)
sleep(1)
driver.press_keycode(24)
sleep(1)
driver.press_keycode(24)
sleep(1)
driver.press_keycode(4)
sleep(1)
driver.press_keycode(25)
sleep(1)
driver.press_keycode(25)

3.5 操做手機通知欄

測試即時通訊類軟件的時候,若是A給B發送一條消息,B的通知欄確定會顯示對應的消息。咱們想經過通知欄來判斷B是否收到消息,必定要先操做手機的通知欄。

方法:

driver.open_notifications():打開手機通知欄。

appium官方並無爲咱們提供關閉通知的api,那麼現實生活中怎麼關閉,就怎樣操做就行,好比,手指從下往上滑動,或者,按返回鍵。

實例:

打開通知欄,兩秒後,關閉通知欄。

driver.open_notifications()
sleep(2)
driver.press_keycode(4)
相關文章
相關標籤/搜索