1. 滑動和拖拽
我們在做自動化測試的時候,有些按鈕是需要滑動幾次屏幕后才會出現,此時,我們需要使用代碼來模擬手指的滑動,也就是接下來要學的滑動和拖拽了。
1.1 swipe滑動事件
從一個坐標位置滑動到另一個坐標位置,只能是兩個點之間的滑動。
方法:
driver.swipe(start_x, start_y, end_x, end_y, duration=None):參數分別是起點坐標的x,y和終點坐標的x,y,以及滑動時間,滑動事件的單位是ms。
實例1:
模擬手指從(100,2000),滑動到(100,1000)的位置。
driver.swipe(100, 2000, 100, 1000)
實例2:
模擬手指從(100, 2000),滑動到(100, 100)的位置。
driver.swipe(100, 2000, 100, 100)
實例3:
模擬手指從(100, 2000),滑動到(100, 100)的位置,持續5秒。
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)