網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
其實(shí)在前面兩個(gè)章節(jié)的元素定位的場(chǎng)景,我們已經(jīng)對(duì) app 中的自動(dòng)化操作已經(jīng)略知一二。這里我們發(fā)現(xiàn), 實(shí)際上 appium 復(fù)用了 selenium 的很多很多的操作方式,所以像一些 “點(diǎn)擊、輸入” 等操作,這種常規(guī)的操作的方式與在 WEB 自動(dòng)化中的方式基本上是完全一致的,就不再進(jìn)行贅述了。
唯一一個(gè)與 WEB 端不太一樣的地方就是關(guān)于 “滑動(dòng)操控” ,所以 “頁(yè)面的滑動(dòng)” 在實(shí)際操作手機(jī)過(guò)程中,也是最常使用的,只需要操控一個(gè)點(diǎn)在屏幕中拖動(dòng)到另外一個(gè)點(diǎn)就可以了。這個(gè) “滑” 的過(guò)程就是一個(gè)滑動(dòng)的動(dòng)作。
在 “appium” 中,對(duì)于 “滑動(dòng)” 的操作也做了一些簡(jiǎn)單的封裝,為其提供了方法,這就是 “swipe” 。
滑動(dòng)操控
OK,接下來(lái)我們就看一些,滑動(dòng)操控 的腳本究竟要怎么寫(xiě)。
在模擬 “滑動(dòng)操控” 的時(shí)候,使用的方法就是 swipe() ,該方法的參數(shù)說(shuō)明如下:
- start_x:起始橫坐標(biāo)
- start_y:起始縱坐標(biāo)
- end_x:結(jié)束時(shí)橫坐標(biāo)
- end_y:結(jié)束時(shí)縱坐標(biāo)
- duration:滑動(dòng)持續(xù)時(shí)間,單位毫秒,默認(rèn)None(一般設(shè)置500-1000毫秒比較合適)
ps:如果不設(shè)置 "duration" ,即為 0秒 ,無(wú)法看到滑動(dòng)效果。
duration 參數(shù)需要注意的是:在移動(dòng)設(shè)備上滑動(dòng)時(shí)間的快慢所形成的效果是不一樣的。以今日頭條APP首頁(yè)上滑為例,同樣的滑動(dòng)距離,滑動(dòng)較快則出現(xiàn)類(lèi)似翻頁(yè)的效果,而滑動(dòng)較慢則是同一則新聞從起始位置滑動(dòng)到結(jié)束位置。
手機(jī)屏幕的坐標(biāo):以手機(jī)屏幕最左上角的坐標(biāo)點(diǎn)為坐標(biāo)中心(0, 0),向右話(huà)滑動(dòng)則縱坐標(biāo)不變,橫坐標(biāo)變大;向下滑動(dòng)則橫坐標(biāo)不變,縱坐標(biāo)變大。
如何獲取設(shè)備屏幕坐標(biāo)系
在實(shí)際工作場(chǎng)景中,不同測(cè)試機(jī)的屏幕尺寸存在著很大的差異性。所以正常情況下,我們不會(huì)選擇使用固定的的坐標(biāo)來(lái)滑動(dòng)屏幕。
一般操作是,先獲取測(cè)試機(jī)屏幕尺寸,再通過(guò)獲取的手機(jī)屏幕尺寸來(lái)確定滑動(dòng)的起始、結(jié)束坐標(biāo);這樣,即使在我們更換了測(cè)試手機(jī)后也不需要重新更改坐標(biāo)。使用webdriver提供的get_window_size()方法可以獲取屏幕尺寸(即屏幕右下角的坐標(biāo)),方法如下:
# 獲取屏幕寬度
width = driver.get_window_size()['width']
# 獲取屏幕高度
height = driver.get_window_size()['heigth']
滑動(dòng)屏幕操作代碼如下:()
# 屏幕從下向上滑動(dòng)
driver.swipe(width*0.5, height*0.9, width*0.5, height*0.1, 1000)
sleep(1)
# 屏幕從上向下滑動(dòng)
driver.swipe(width*0.5, height*0.1, width*0.5, height*0.9, 1000)
sleep(1)
# 屏幕從左向右滑動(dòng)
driver.swipe(width*0.1, height*0.5, width*0.9, height*0.5, 1000)
sleep(1)
# 屏幕從右向左滑動(dòng)
driver.swipe(width*0.9, height*0.5, width*0.1, height*0.5, 1000)
sleep(1)
模擬實(shí)現(xiàn)一個(gè)簡(jiǎn)單的滑動(dòng)操作
代碼示例如下:
# coding=utf-8
from time import sleep
from appium import webdriver # appium 的特色就是將安卓、IOS的底層封裝成了 webdriver 類(lèi)型的語(yǔ)句
from appium.webdriver.common.appiumby import By
# 啟動(dòng)參數(shù)
desired_caps = {} # 定義 desired_caps 變量,用以賦值很多的啟動(dòng)信息
desired_caps['platformName'] = 'Android' # 設(shè)備名稱(chēng)、系統(tǒng)為 "Android"
desired_caps['platformVersion'] = '7.1.2' # 這里是在夜神模擬器的設(shè)置中心查看安卓版本是 "7.1.2" ,后續(xù)會(huì)告訴大家如何切換版本
desired_caps['deviceName'] = '127.0.0.1:62001' # 這里如果是真機(jī)的話(huà)填寫(xiě)的是設(shè)備名稱(chēng);因?yàn)槲覀冇玫氖悄M器,填寫(xiě)的是IP端口號(hào)
# desired_caps['appPackage'] = 'com.baidu.searchbox' # APP 的包名;這里我們使用的是通訊錄
# desired_caps['appActivity'] = 'com.baidu.searchbox.SplashActivity' # 啟動(dòng)的界面的名字(也或者叫啟動(dòng)名,默認(rèn)是 "." 開(kāi)頭的)
# desired_caps['automationName']='UiAutomator1'
# 聲明手機(jī)驅(qū)動(dòng)
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 注冊(cè)到這個(gè)節(jié)點(diǎn)上,傳入 "desired_caps"。這個(gè)節(jié)點(diǎn)就是 "appium" 開(kāi)啟的端口節(jié)點(diǎn)
sleep(1)
# 獲取屏幕寬度
width = driver.get_window_size()['width']
# 獲取屏幕高度
height = driver.get_window_size()['height']
# 利用 "swipe" 實(shí)現(xiàn)滑動(dòng), 屏幕從下向上滑動(dòng)
driver.swipe(width*0.5, height*0.9, width*0.5, height*0.1, 1000)
sleep(1)
# 利用 "swipe" 實(shí)現(xiàn)滑動(dòng), 屏幕從上向下滑動(dòng)
driver.swipe(width*0.5, height*0.1, width*0.5, height*0.9, 1000)
sleep(1)
# 利用 "swipe" 實(shí)現(xiàn)滑動(dòng), 屏幕從左向右滑動(dòng)
driver.swipe(width*0.1, height*0.5, width*0.9, height*0.5, 1000)
sleep(1)
# 利用 "swipe" 實(shí)現(xiàn)滑動(dòng), 屏幕從右向左滑動(dòng)
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()
將 “滑動(dòng)操控” 改為公共的方法
上文中的腳本雖然也能夠?qū)崿F(xiàn)我們針對(duì) App 的 “滑動(dòng)操控” 的操作,但是代碼的整潔度上來(lái)看不是那么的美觀。既然如此,我們是否能夠?qū)⑵浞庋b起來(lái),變成一個(gè)公共的方法,當(dāng)然是可以的了,繼續(xù)往下看。
代碼示例如下:
# coding=utf-8
from time import sleep
from appium import webdriver # appium 的特色就是將安卓、IOS的底層封裝成了 webdriver 類(lèi)型的語(yǔ)句
def getSize(driver):
"""獲取頁(yè)面大小"""
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return(x, y)
def swipeRight(driver):
"""向右滑動(dòng) - [x軸變動(dòng),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):
"""向左滑動(dòng) - [x軸變動(dòng),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):
"""向下滑動(dòng) - [x軸不變,y軸變動(dòng)]"""
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):
"""向上滑動(dòng) - [x軸不變,y軸變動(dòng)]"""
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():
# 啟動(dòng)參數(shù)
desired_caps = {} # 定義 desired_caps 變量,用以賦值很多的啟動(dòng)信息
desired_caps['platformName'] = 'Android' # 設(shè)備名稱(chēng)、系統(tǒng)為 "Android"
desired_caps['platformVersion'] = '7.1.2' # 這里是在夜神模擬器的設(shè)置中心查看安卓版本是 "7.1.2" ,后續(xù)會(huì)告訴大家如何切換版本
desired_caps['deviceName'] = '127.0.0.1:62001' # 這里如果是真機(jī)的話(huà)填寫(xiě)的是設(shè)備名稱(chēng);因?yàn)槲覀冇玫氖悄M器,填寫(xiě)的是IP端口號(hào)
# desired_caps['appPackage'] = 'com.baidu.searchbox' # APP 的包名;這里我們使用的是通訊錄
# desired_caps['appActivity'] = 'com.baidu.searchbox.SplashActivity' # 啟動(dòng)的界面的名字(也或者叫啟動(dòng)名,默認(rèn)是 "." 開(kāi)頭的)
# desired_caps['automationName']='UiAutomator1'
# 聲明手機(jī)驅(qū)動(dòng)
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 注冊(cè)到這個(gè)節(jié)點(diǎn)上,傳入 "desired_caps"。這個(gè)節(jié)點(diǎn)就是 "appium" 開(kāi)啟的端口節(jié)點(diǎn)
sleep(1)
# 利用 "swipe" 實(shí)現(xiàn)滑動(dòng), 屏幕從下向上滑動(dòng)
swipeDown(driver)
sleep(2)
# 利用 "swipe" 實(shí)現(xiàn)滑動(dòng), 屏幕從上向下滑動(dòng)
swipeUp(driver)
sleep(2)
# 利用 "swipe" 實(shí)現(xiàn)滑動(dòng), 屏幕從左向右滑動(dòng)
swipeLeft(driver)
sleep(2)
# 利用 "swipe" 實(shí)現(xiàn)滑動(dòng), 屏幕從右向左滑動(dòng)
swipeRight(driver)
sleep(2)
driver.terminate_app('com.baidu.searchbox')
# driver.quit()
if __name__ == '__main__':
swipeDemo()
其實(shí)滑動(dòng)在實(shí)際操作中應(yīng)用的場(chǎng)景還是不少的,就比如要定位的元素在頁(yè)面下方必須要通過(guò)滑動(dòng)才能往下滑將其展示出來(lái);再比如解鎖密碼、或者滑動(dòng)九宮格之類(lèi)的場(chǎng)景… 類(lèi)似的滑動(dòng)場(chǎng)景,大家可以在真實(shí)的場(chǎng)景中逐步的去體驗(yàn)。
到此,一個(gè)很簡(jiǎn)單的基于 “百度App” 實(shí)現(xiàn)的 demo 就到此結(jié)束了。但是該 demo 僅僅是基于實(shí)現(xiàn),沒(méi)有像之前的 WEB 框架那樣去同意做處理、去進(jìn)行 PO 模式的編寫(xiě)。
原文鏈接:https://blog.csdn.net/weixin_42250835/article/details/125687332
相關(guān)推薦
- 2022-06-16 C#使用符號(hào)表實(shí)現(xiàn)查找算法_C#教程
- 2022-06-01 C#的通用DbHelper類(lèi)(支持?jǐn)?shù)據(jù)連接池)示例詳解_C#教程
- 2023-07-15 oracle查看死鎖以及處理死鎖
- 2022-04-16 python代碼有一行標(biāo)黃問(wèn)題的解決方案_python
- 2022-03-14 xampp配置ssl 端口443后,無(wú)法開(kāi)啟服務(wù)。提示端口被占用
- 2022-10-08 React中useState的使用方法及注意事項(xiàng)_React
- 2022-04-29 WPF自定義路由事件_實(shí)用技巧
- 2022-09-01 詳解C語(yǔ)言中for循環(huán)與while循環(huán)的用法_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支