漲薪技術 —— 搞定Appium工作中常見應用操作!

前言

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")#退出driverdriver.quit()

1.3 在腳本內啟動其他應用

我們經常遇到需要從一個應用跳轉到另外一個應用 ,就像我們使用餓了嗎的時候,需要跳轉到支付寶來進行支付一樣。

我們想要實現這種功能,就要使用下面的方法了。???????

driver.start_activity(appPackage, appActivity) :分別傳入要打開的應用的包名和界面名。

實例:

打開《設置》,等待三秒后跳轉到《通訊錄》???????

sleep(3)#跳轉到短信driver.start_activity('com.android.contacts','.activities.PeopleActivity')sleep(5)#退出driverdriver.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)# 退出driverdriver.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-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化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)#退出driverdriver.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-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化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)#退出driverdriver.quit()

實例2:

使用坐標的形式按下 WLAN (650, 650),2 秒后,按下(650, 650)的位置,并抬起???????

# coding:utf-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化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)#退出driverdriver.quit()

3.3 等待操作

模擬手指等待,比如按下后等待5秒之后再抬起,方法:

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

實例:

使用坐標的形式點擊 WLAN(650, 650),2 秒后,按下(650, 650)的位置,暫停2秒,并抬起???????

# coding:utf-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化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)#退出driverdriver.quit()

3.4 長按操作

模擬手指移動操作,比如,手勢解鎖需要先按下,再移動,方法:

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

實例:

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

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

com.android.settings/.ChooseLockPattern
# coding:utf-8from appium import webdriverfrom time import sleepfrom appium.webdriver.common.touch_action importTouchAction# 初始化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)#退出driverdriver.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自動化測試、接口自動化測試、測試高級持續集成、測試架構開發測試框架、性能測試、安全測試等。

如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “點贊” “評論” “收藏” 一鍵三連哦!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10328.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

日報表定時任務優化歷程

報表需求背景 報表是一個很常見的需求,在項目中后期往往會需要加多種維度的一些統計信息,今天就來談談上線近10個月后的一次報表優化優化之路(從一天報表跑需要五分鐘,優化至秒級) 需求:對代理商進行日統計…

基礎I/O:文件系統調用接口

文章目錄 文件系統調用接口open系統調用接口和C語言封裝文件描述符fd重定向 文件系統調用接口 open NAME//打開、創建 - 打開并可能創建文件或設備open, creat - open and possibly create a file or deviceSYNOPSIS#include <sys/types.h>#include <sys/stat.h>…

【C++算法】隊列相關經典算法題

1. N叉樹的層序遍歷 首先我們遇到這個題目&#xff0c;沒有任何思路&#xff0c;我們就可以來模擬一下層序的流程&#xff0c;首先我們肯定是訪問根節點1&#xff0c;訪問之后呢就是訪問下一層的最左節點3&#xff0c;此時第一層的節點1已經訪問過了就可以不要了&#xff0c;然…

[GESP樣題 四級] 填幻方和幸運數

B3940 [GESP樣題 四級] 填幻方 題目 在一個NN 的正方形網格中&#xff0c;每個格子分別填上從 1 到 NN 的正整數&#xff0c;使得正方形中任一行、任一列及對角線的幾個數之和都相等&#xff0c;則這種正方形圖案就稱為“幻方”&#xff08;輸出樣例中展示了一個33 的幻方&am…

ICode國際青少年編程競賽- Python-4級訓練場-嵌套for循環練習

ICode國際青少年編程競賽- Python-4級訓練場-嵌套for循環練習 1、 for i in range(3):Spaceship.step(4)for j in range(4):Dev.step(2)Dev.turnRight()Spaceship.turnLeft()Spaceship.step(4)Spaceship.turnRight()2、 for i in range(4):Spaceship.step(6)for j in range(3):…

Nginx或Tengine服務器配置SSL證書

目錄 前提條件 步驟一&#xff1a;下載SSL證書 步驟二&#xff1a;在Nginx服務器安裝證書 步驟三&#xff1a;驗證SSL證書是否配置成功 前提條件 已通過數字證書管理服務控制臺簽發證書SSL證書綁定的域名已完成DNS解析&#xff0c;即您的域名與主機IP地址相互映射已在Web服…

維修Philips IU22飛利浦四維多普勒彩超診斷儀 V6-2 L12-5 C8-4V深圳捷達工控維修

專為新時代而設計。專為更多而設計。 超聲波在抗擊 COVID-19 中的成像作用不斷擴大&#xff0c;并且對血管和心臟檢查的需求不斷增加&#xff0c;因此比以往任何時候都更有價值。飛利浦的超聲產品組合&#xff08;包括 EPIQ Elite&#xff09;為一線護理人員提供了寶貴的診斷支…

Intel處理器7z/XZ遇到 The failure in hardware

最近在使用Intel 12700H混合架構處理器的時候&#xff0c;一旦使用7z或者XZ算法壓縮東西就會出現如下的報錯&#xff1a; Internal Error: The failure in hardware (RAM or CPU), OS or program在檢查排除了內存、磁盤和OS的問題后&#xff0c;最終確定為Intel CPU的問題&…

Lazada、Shopee測評自養號,快速出單技巧全解析!

每個人都憧憬著自己的店鋪能夠擁有一款或多款引人注目的熱銷商品&#xff0c;這些商品不僅能為店鋪帶來可觀的收益&#xff0c;更重要的是它們能夠成為吸引顧客的強大磁石&#xff0c;顯著提升店鋪的整體流量。一旦這樣的爆款商品成功吸引顧客&#xff0c;其他產品也將隨之受到…

C++11:并發新紀元 —— 深入理解異步編程的力量(1)

hello &#xff01;大家好呀&#xff01; 歡迎大家來到我的Linux高性能服務器編程系列之《C11&#xff1a;并發新紀元 —— 深入理解異步編程的力量》&#xff0c;在這篇文章中&#xff0c;你將會學習到C新特性以及異步編程的好處&#xff0c;以及其如何帶來的高性能的魅力&…

Python:通過接口獲取公眾號的文章列表(但是開發文檔沒有這個接口)

&#x1f4da;博客主頁&#xff1a;knighthood2001 ?公眾號&#xff1a;認知up吧 &#xff08;目前正在帶領大家一起提升認知&#xff0c;感興趣可以來圍觀一下&#xff09; &#x1f383;知識星球&#xff1a;【認知up吧|成長|副業】介紹 ??感謝大家點贊&#x1f44d;&…

【LeetCode】每日一題:2960. 統計已測試設備

給你一個長度為 n 、下標從 0 開始的整數數組 batteryPercentages &#xff0c;表示 n 個設備的電池百分比。 你的任務是按照順序測試每個設備 i&#xff0c;執行以下測試操作&#xff1a; 如果 batteryPercentages[i] 大于 0&#xff1a; 增加 已測試設備的計數。 將下標在 [i…

力扣HOT100 - 35. 搜索插入位置

解題思路&#xff1a; 二分法模板 class Solution {public int searchInsert(int[] nums, int target) {int left 0;int right nums.length - 1;while (left < right) {int mid left ((right - left) >> 1);if (nums[mid] target)return mid;else if (nums[mid…

【qt】設計器實現界面

設計器實現界面 一.總體思路二.具體操作1.創建項目2.粗略拖放3.水平布局4.垂直布局5.修改名字6.轉到槽7.實現槽函數 一.總體思路 二.具體操作 1.創建項目 這次咱們一定要勾選Generate form哦。 因為我們要使用設計器進行拖放。 2.粗略拖放 這里用到了復選框&#xff1a;C…

[數據集][目標檢測]管道焊縫質量檢測數據集VOC+YOLO格式1134張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;1134 標注數量(xml文件個數)&#xff1a;1134 標注數量(txt文件個數)&#xff1a;1134 標注…

python元類與C#、Java中的反射

Python的元類和C#中的反射 在概念上有一定的相似性&#xff0c;但它們的目的和使用方式有所不同。 Python的元類&#xff1a; 元類&#xff08;Metaclass&#xff09;是控制類創建的類。它們定義了類的創建過程&#xff0c;可以修改類的行為。元類通過定制類的創建過程&…

算法訓練營第二十五天 | LeetCode 669 修剪二叉樹、

LeetCode 669 修剪二叉樹 這題用層序遍歷雙指針刪除不符合條件的節點即可。具體是要用到一個虛擬根節點&#xff0c;雙指針中prev指針每次指向隊列頂元素&#xff0c;cur指針先指向prev左子節點&#xff0c;用循環去除這個位置上不符合條件的節點并連上繼承節點&#xff0c;內…

“我們堅持開源!”阿里云發布“地表最強”中文大模型:半年一迭代、性能翻倍?

5 月 9 日&#xff0c;在通義大模型發布一周年之際&#xff0c;阿里云大模型生態迎來一次重大升級&#xff0c;主要有“四個最”&#xff1a; 通義千問 2.5 正式發布&#xff0c;“模型性能全面趕超 GPT-4 Turbo&#xff0c;成為地表最強中文大模型”&#xff1b;Qwen1.5-110B…

卷積特征圖與感受野

特征圖尺寸和感受野是卷積神經網絡中非常重要的兩個概念&#xff0c;今天來看一下&#xff0c;如何計算特征尺寸和感受野。 特征圖尺寸 卷積特征圖&#xff0c;是圖片經過卷積核處理之后的尺寸。計算輸出特征的尺寸&#xff0c;需要給出卷積核的相關參數包括&#xff1a; 輸…

PC端與bluetooth藍牙虛擬串口通信

應該采用RFCOMM虛擬串口方式來進行通信&#xff0c;原理跟socket通信類似&#xff0c;不同的是使用的通信協議不同&#xff0c;本人結合相關的API&#xff0c;做了以下最簡單的封裝。 1、獲取本地藍牙設備與附近藍牙設備信息 2、通信類 /* 通信類&#xff1a;只是對于客戶端通…