網站首頁 編程語言 正文
其實在前面兩個章節的元素定位的場景,我們已經對 app 中的自動化操作已經略知一二。這里我們發現, 實際上 appium 復用了 selenium 的很多很多的操作方式,所以像一些 “點擊、輸入” 等操作,這種常規的操作的方式與在 WEB 自動化中的方式基本上是完全一致的,就不再進行贅述了。
唯一一個與 WEB 端不太一樣的地方就是關于 “滑動操控” ,所以 “頁面的滑動” 在實際操作手機過程中,也是最常使用的,只需要操控一個點在屏幕中拖動到另外一個點就可以了。這個 “滑” 的過程就是一個滑動的動作。
在 “appium” 中,對于 “滑動” 的操作也做了一些簡單的封裝,為其提供了方法,這就是 “swipe” 。
滑動操控
OK,接下來我們就看一些,滑動操控 的腳本究竟要怎么寫。
在模擬 “滑動操控” 的時候,使用的方法就是 swipe() ,該方法的參數說明如下:
- start_x:起始橫坐標
- start_y:起始縱坐標
- end_x:結束時橫坐標
- end_y:結束時縱坐標
- duration:滑動持續時間,單位毫秒,默認None(一般設置500-1000毫秒比較合適)
ps:如果不設置 "duration" ,即為 0秒 ,無法看到滑動效果。
duration 參數需要注意的是:在移動設備上滑動時間的快慢所形成的效果是不一樣的。以今日頭條APP首頁上滑為例,同樣的滑動距離,滑動較快則出現類似翻頁的效果,而滑動較慢則是同一則新聞從起始位置滑動到結束位置。
手機屏幕的坐標:以手機屏幕最左上角的坐標點為坐標中心(0, 0),向右話滑動則縱坐標不變,橫坐標變大;向下滑動則橫坐標不變,縱坐標變大。
如何獲取設備屏幕坐標系
在實際工作場景中,不同測試機的屏幕尺寸存在著很大的差異性。所以正常情況下,我們不會選擇使用固定的的坐標來滑動屏幕。
一般操作是,先獲取測試機屏幕尺寸,再通過獲取的手機屏幕尺寸來確定滑動的起始、結束坐標;這樣,即使在我們更換了測試手機后也不需要重新更改坐標。使用webdriver提供的get_window_size()方法可以獲取屏幕尺寸(即屏幕右下角的坐標),方法如下:
# 獲取屏幕寬度
width = driver.get_window_size()['width']
# 獲取屏幕高度
height = driver.get_window_size()['heigth']
滑動屏幕操作代碼如下:()
# 屏幕從下向上滑動
driver.swipe(width*0.5, height*0.9, width*0.5, height*0.1, 1000)
sleep(1)
# 屏幕從上向下滑動
driver.swipe(width*0.5, height*0.1, width*0.5, height*0.9, 1000)
sleep(1)
# 屏幕從左向右滑動
driver.swipe(width*0.1, height*0.5, width*0.9, height*0.5, 1000)
sleep(1)
# 屏幕從右向左滑動
driver.swipe(width*0.9, height*0.5, width*0.1, height*0.5, 1000)
sleep(1)
模擬實現一個簡單的滑動操作
代碼示例如下:
# coding=utf-8
from time import sleep
from appium import webdriver # appium 的特色就是將安卓、IOS的底層封裝成了 webdriver 類型的語句
from appium.webdriver.common.appiumby import By
# 啟動參數
desired_caps = {} # 定義 desired_caps 變量,用以賦值很多的啟動信息
desired_caps['platformName'] = 'Android' # 設備名稱、系統為 "Android"
desired_caps['platformVersion'] = '7.1.2' # 這里是在夜神模擬器的設置中心查看安卓版本是 "7.1.2" ,后續會告訴大家如何切換版本
desired_caps['deviceName'] = '127.0.0.1:62001' # 這里如果是真機的話填寫的是設備名稱;因為我們用的是模擬器,填寫的是IP端口號
# desired_caps['appPackage'] = 'com.baidu.searchbox' # APP 的包名;這里我們使用的是通訊錄
# desired_caps['appActivity'] = 'com.baidu.searchbox.SplashActivity' # 啟動的界面的名字(也或者叫啟動名,默認是 "." 開頭的)
# desired_caps['automationName']='UiAutomator1'
# 聲明手機驅動
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 注冊到這個節點上,傳入 "desired_caps"。這個節點就是 "appium" 開啟的端口節點
sleep(1)
# 獲取屏幕寬度
width = driver.get_window_size()['width']
# 獲取屏幕高度
height = driver.get_window_size()['height']
# 利用 "swipe" 實現滑動, 屏幕從下向上滑動
driver.swipe(width*0.5, height*0.9, width*0.5, height*0.1, 1000)
sleep(1)
# 利用 "swipe" 實現滑動, 屏幕從上向下滑動
driver.swipe(width*0.5, height*0.1, width*0.5, height*0.9, 1000)
sleep(1)
# 利用 "swipe" 實現滑動, 屏幕從左向右滑動
driver.swipe(width*0.1, height*0.5, width*0.9, height*0.5, 1000)
sleep(1)
# 利用 "swipe" 實現滑動, 屏幕從右向左滑動
driver.swipe(width*0.9, height*0.5, width*0.1, height*0.5, 1000)
sleep(1)
driver.terminate_app('com.baidu.searchbox')
# driver.quit()
將 “滑動操控” 改為公共的方法
上文中的腳本雖然也能夠實現我們針對 App 的 “滑動操控” 的操作,但是代碼的整潔度上來看不是那么的美觀。既然如此,我們是否能夠將其封裝起來,變成一個公共的方法,當然是可以的了,繼續往下看。
代碼示例如下:
# coding=utf-8
from time import sleep
from appium import webdriver # appium 的特色就是將安卓、IOS的底層封裝成了 webdriver 類型的語句
def getSize(driver):
"""獲取頁面大小"""
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return(x, y)
def swipeRight(driver):
"""向右滑動 - [x軸變動,y軸不變]"""
l = getSize(driver)
x1 = int(l[0]*0.8)
x2 = int(l[0]*0.2)
y = int(l[1]*0.5)
driver.swipe(x1, y, x2, y, 1000)
def swipeLeft(driver):
"""向左滑動 - [x軸變動,y軸不變]"""
l = getSize(driver)
x1 = int(l[0]*0.9)
x2 = int(l[0]*0.1)
y = int(l[1]*0.5)
driver.swipe(x2, y, x1, y, 1000)
def swipeDown(driver):
"""向下滑動 - [x軸不變,y軸變動]"""
l = getSize(driver)
y1 = int(l[1]*0.9)
y2 = int(l[1]*0.1)
x = int(l[0]*0.5)
driver.swipe(x, y1, x, y2, 1000)
def swipeUp(driver):
"""向上滑動 - [x軸不變,y軸變動]"""
l = getSize(driver)
y1 = int(l[1]*0.8)
y2 = int(l[1]*0.2)
x = int(l[0]*0.5)
driver.swipe(x, y2, x, y1, 1000)
def swipeDemo():
# 啟動參數
desired_caps = {} # 定義 desired_caps 變量,用以賦值很多的啟動信息
desired_caps['platformName'] = 'Android' # 設備名稱、系統為 "Android"
desired_caps['platformVersion'] = '7.1.2' # 這里是在夜神模擬器的設置中心查看安卓版本是 "7.1.2" ,后續會告訴大家如何切換版本
desired_caps['deviceName'] = '127.0.0.1:62001' # 這里如果是真機的話填寫的是設備名稱;因為我們用的是模擬器,填寫的是IP端口號
# desired_caps['appPackage'] = 'com.baidu.searchbox' # APP 的包名;這里我們使用的是通訊錄
# desired_caps['appActivity'] = 'com.baidu.searchbox.SplashActivity' # 啟動的界面的名字(也或者叫啟動名,默認是 "." 開頭的)
# desired_caps['automationName']='UiAutomator1'
# 聲明手機驅動
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 注冊到這個節點上,傳入 "desired_caps"。這個節點就是 "appium" 開啟的端口節點
sleep(1)
# 利用 "swipe" 實現滑動, 屏幕從下向上滑動
swipeDown(driver)
sleep(2)
# 利用 "swipe" 實現滑動, 屏幕從上向下滑動
swipeUp(driver)
sleep(2)
# 利用 "swipe" 實現滑動, 屏幕從左向右滑動
swipeLeft(driver)
sleep(2)
# 利用 "swipe" 實現滑動, 屏幕從右向左滑動
swipeRight(driver)
sleep(2)
driver.terminate_app('com.baidu.searchbox')
# driver.quit()
if __name__ == '__main__':
swipeDemo()
其實滑動在實際操作中應用的場景還是不少的,就比如要定位的元素在頁面下方必須要通過滑動才能往下滑將其展示出來;再比如解鎖密碼、或者滑動九宮格之類的場景… 類似的滑動場景,大家可以在真實的場景中逐步的去體驗。
到此,一個很簡單的基于 “百度App” 實現的 demo 就到此結束了。但是該 demo 僅僅是基于實現,沒有像之前的 WEB 框架那樣去同意做處理、去進行 PO 模式的編寫。
原文鏈接:https://blog.csdn.net/weixin_42250835/article/details/125687332
相關推薦
- 2022-04-01 本地存儲(Local Storage) 和 會話存儲(Session Storage)
- 2023-03-17 Android?ViewModel與Lifecycles和LiveData組件用法詳細講解_Andr
- 2022-06-26 shell腳本語言之if條件判斷語句實例詳解_linux shell
- 2022-12-14 Docker中容器數據卷詳解_docker
- 2022-04-07 C++11實現字符串分割的示例_C 語言
- 2022-09-15 C#中DateTime的時間加減法操作小結_C#教程
- 2022-09-29 C#正則表達式(Regex類)用法實例總結_C#教程
- 2023-02-02 C語言求質數的幾種簡單易懂方式_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支