前言
Appium 是一個開源、跨平臺的自動化測試工具,用于測試原生和輕量移動應用,支持 iOS, Android 和 FirefoxOS 平臺。此工具在測試工作中也較長用到,接下來給大家介紹日常中的操作。
1、應用操作
1.1獲取應用的包名和界面名
當我們從一個應用跳轉到另外一個應用的時候,想輸出其包名、界面名或者想在報告中展現對應信息, 我們就可以調用這個屬性來進行獲取。
# 打印當前包名
print(driver.current_package)
# 打印當前界面名
print(driver.current_activity)
1.2 安裝和卸載以及檢查應用是否安裝
安裝應用:
driver.install_app(app_path)?:安裝應用到設備,需要apk包的路徑
卸載應用:
driver.remove_app(app_id) :從設備中刪除一個應用
檢查應用是否安裝:
driver.is_app_installed(app_id) :檢查應用是否已經安裝。需要傳入
應用包的名字。返回結果為True或False
案例:
# 如果計算器已經安裝,就會卸載計算器。如果計算器沒有安裝,就會安裝計算
器。
if driver.is_app_installed("com.youba.calculate"):
driver.remove_app("com.youba.calculate")
else:
driver.install_app(r"F:\APP_packages\apks\calc.apk")
#退出driver
driver.quit()
1.3 在腳本內啟動其他應用
我們經常遇到需要從一個應用跳轉到另外一個應用 ,就像我們使用餓了嗎的時候,需要跳轉到支付寶來進行支付一樣。
我們想要實現這種功能,就要使用下面的方法了。???????
driver.start_activity(appPackage, appActivity) :分別傳入要打
開的應用的包名和界面名。
實例:
打開《設置》,等待三秒后跳轉到《通訊錄》???????
sleep(3)
#跳轉到短信
driver.start_activity('com.android.contacts',
'.activities.PeopleActivity')
sleep(5)
#退出driver
driver.quit()
1.4 關閉應用???????
driver.quit() 。但是這種關閉呢,是關閉驅動對象,同時關閉所有關聯的
應用,關閉后我們是無法使用腳本操作應用的。
如果我們只想關閉當前操作的應用,不關閉驅動對象,我們就可以使用
driver.close_app() 方法。
若要終止某個指定的應用可以使用driver.terminate_app('app_id')?,需要傳入app_id參數。
1.5 重置應用???????
driver.reset()
#重置應用,相當于“恢復出廠默認值”的效果,這個方法不需要傳入參數
1.6 將應用置于后臺???????
driver.background_app(seconds) :app放置到后臺一定時間后再回到前
臺,模擬熱啟動。這個方法需要傳入一個時間,表示在后臺停留多少秒
實例:
打開《設置》,進入后臺五秒,再回到前臺???????
time.sleep(3)
driver.background_app(5)
time.sleep(3)
# 退出driver
driver.quit()
現在我也找了很多測試的朋友,做了一個分享技術的交流群,共享了很多我們收集的技術文檔和視頻教程。
如果你不想再體驗自學時找不到資源,沒人解答問題,堅持幾天便放棄的感受
可以加入我們一起交流。而且還有很多在自動化,性能,安全,測試開發等等方面有一定建樹的技術大牛
分享他們的經驗,還會分享很多直播講座和技術沙龍
可以免費學習!劃重點!開源的!!!
qq群號:691998057【暗號:csdn999】
2、滑動和拖拽
2.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, 5000)
2.2 scroll滑動事件
從一個元素滑動到另一個元素,直到頁面自動停止。
方法:???????
driver.scroll(origin_el, destination_el, duration=None) :參
數分別是滑動開始的元素和滑動結束的元素
實例:
從“存儲”滑動到“更多”???????
save_button = driver.find_element_by_xpath("//*[@text='存
儲']")
more_button = driver.find_element_by_xpath("//*[@text='更
多']")
driver.scroll(save_button, more_button,5000)
2.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)
2.4 滑動和拖拽的選擇???????
滑動和拖拽無非就是考慮是否具有“慣性”,以及傳遞的參數是“元素”還是“坐
標”。
可以分為三種情況:
無 “慣性” ,傳入 “元素”:drag_and_drop。
有 “慣性” ,傳入 “坐標”:swipe,并且設置較短的duration時間。
有 “慣性” ,傳入 “元素”:scroll,并且設置較短的duration時間。
3、高級手勢
高級手勢TouchAction可以實現一些針對手勢的操作,比如滑動、長按、拖動等。我們可以將這些基本手勢組合成一個相對復雜的手勢。比如,我們解鎖手機或者一些應用軟件都有手勢解鎖的這種方式。
想要使用TouchAction,必須要創建TouchAction對象,通過對象調用想要執行的手勢,通過perform()執行動作。
需要導入的模塊:
from?appium.webdriver.common.touch_action?import TouchAction
3.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'] = '7.1.2'
#使用adb devices -l 查詢,當有多臺設備時,需要聲明
desired_caps['deviceName'] = '127.0.0.1:21503'
#包名
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()
3.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'] = '7.1.2'
#使用adb devices -l 查詢,當有多臺設備時,需要聲明
desired_caps['deviceName'] = '127.0.0.1:21503'
#包名
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'] = '7.1.2'
#使用adb devices -l 查詢,當有多臺設備時,需要聲明
desired_caps['deviceName'] = '127.0.0.1:21503'
#包名
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()
3.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'] = '7.1.2'
#使用adb devices -l 查詢,當有多臺設備時,需要聲明
desired_caps['deviceName'] = '127.0.0.1:21503'
#包名
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()
3.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'] = '7.1.2'
#使用adb devices -l 查詢,當有多臺設備時,需要聲明
desired_caps['deviceName'] = '127.0.0.1:21503'
#包名
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()
4、手機操作
4.1 獲取手機分辨率
自動化測試可能會需要根據當前設備的屏幕分辨率來計算一些點擊或者滑動的坐標,方法:
driver.get_window_size()
實例:
輸出當前設備的屏幕分辨率:
print(driver.get_window_size())
4.2 手機截圖
有些自動化的操作可能沒有反應,但并不報錯。此時我們就可以將操作過后的關鍵情況,截圖留存,后期也可以根據圖片發現問題。方法:
get_screenshot_as_file(filename)?:參數是將截圖保存為指定路徑下、指定格式的圖片
實例:
打開《設置》界面,截圖當前頁面保存到當前目錄,命名為screen.png
driver.get_screenshot_as_file("screen.png")
4.3 獲取和設置手機網絡
視頻應用在使用流量看視頻的時候,大部分都會提示用戶正在是否繼續播放。作為測試人員,我們可能需要用自動化的形式來判斷是否有對應的提示。即,用流量的時候應該有提示,使用WIFI的時候應該沒有提示。
4.3.1 獲取手機網絡
driver.network_connection
實例:
獲取當前網絡類型,并打印到控制臺
print(driver.network_connection)
4.3.2 設置手機網絡
driver.set_network_connection(connectionType)?:參數為網絡類型
實例:
設置當前設備為飛行模式
driver.set_network_connection(1)
又將網絡設置為全部打開
driver.set_network_connection(6)
4.4 發送鍵到設備
模擬按 “返回鍵” “home鍵” 等等操作,比如,很多應用有按兩次返回鍵退出應用的功能,如果這個功能 需要我們做自動化,那么一定會用到這個方法。???????
driver.press_keycode(keycode, metastate=None) :第一個參數是發
送給設備的關鍵代碼,第二個是關鍵代碼的元信息,一般是默認值
實例:
點擊三次音量加,再點擊返回,再點擊兩次音量減。(為了讓效果明顯,我設置了暫停)???????
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)
4.5 操作手機通知欄
測試即時通信類軟件的時候,如果A給B發送一條消息,B的通知欄肯定會顯示對應的消息。我們想通過通知欄來判斷B是否收到消息,一定要先操作手機的通知欄。方法:
driver.open_notifications() :打開手機通知欄
appium官方并沒有為我們提供關閉通知的api,那么現實生活中怎么關閉,就怎樣操作就行,比如,手指從下往上滑動,或者,按返回鍵。
實例:
打開通知欄,兩秒后,關閉通知欄???????
driver.open_notifications()
sleep(2)
driver.press_keycode(4)
下面是配套資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!
最后: 可以在公眾號:自動化測試老司機?! 免費領取一份216頁軟件測試工程師面試寶典文檔資料。以及相對應的視頻學習教程免費分享!,其中包括了有基礎知識、Linux必備、Shell、互聯網程序原理、Mysql數據庫、抓包工具專題、接口測試工具、測試進階-Python編程、Web自動化測試、APP自動化測試、接口自動化測試、測試高級持續集成、測試架構開發測試框架、性能測試、安全測試等。
如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “點贊” “評論” “收藏” 一鍵三連哦!