簡介
奈何橋上嘆奈何,三生石前憾三生,彼岸花下非彼岸,奈何三生彼岸人。
相傳過了鬼門關(guān)便上一條路叫黃泉路,路上盛開著只見花,不見葉的彼岸花?;ㄈ~生生兩不見,相念相惜永相失,路盡頭有一條河叫忘川河,河上有一座橋叫奈何橋。走過奈何橋有一個(gè)土臺叫望鄉(xiāng)臺。望鄉(xiāng)臺邊有個(gè)亭子叫孟婆亭,有個(gè)叫孟婆的女人守候在那里,給每個(gè)經(jīng)過的路人遞上一碗孟婆湯。忘川河邊有一塊石頭叫三生石。喝下孟婆湯讓人忘了一切。三生石記載著前世今生來世。
人死先到鬼門關(guān),出了鬼門關(guān),途經(jīng)黃泉路,來到忘川河邊,便是奈何橋。奈何橋上有孟婆,要過奈何橋,就要喝孟婆湯,不喝孟婆湯,就過不得奈何橋,過不得奈何橋,就不得投生轉(zhuǎn)世。凡是喝過孟婆湯的人就會忘卻今生今世所有的牽絆,了無牽掛地進(jìn)入輪回道開始了下一世的輪回。
孟婆湯又稱忘情水或忘憂散,一喝便忘前世今生。陽間的每個(gè)人在這里都有自己的一只碗,碗里的孟婆湯,其實(shí)就是活著的人一生所流的淚。每個(gè)人活著的時(shí)候,都會落淚:因喜,因悲,因痛,因恨,因愁,因愛。孟婆將他們一滴一滴的淚收集起來,煎熬成湯,在他們離開人間,走上奈何橋頭的時(shí)候,讓他們喝下去,忘卻活著時(shí)的愛恨情愁,干干凈凈,重新進(jìn)入六道,或?yàn)橄?,或?yàn)槿耍驗(yàn)樾?。不是每個(gè)人都會心甘情愿地喝下孟婆湯。
因?yàn)檫@一生,總會有愛過的人不想忘卻。孟婆會告訴他:你為她一生所流的淚都熬成了這碗湯,喝下它,就是喝下了你對她的愛。來的人眼中最后的一抹記憶便是他今生摯愛的人,喝下湯,眼里的人影慢慢淡去,眸子如初生嬰兒般清徹。為了來生再見今生最愛,你可以不喝孟婆湯,那便須跳入忘川河,等上千年才能投胎。千年之中,你或許會看到橋上走過今生最愛的人,但是言語不能相通,你看得見她,她看不見你。
千年之中,你看見她走過一遍又一遍奈何橋,喝過一碗又一碗孟婆湯,你盼她不喝孟婆湯,又怕她受不得忘川河中千年煎熬之苦。千年之后若心念不滅,還能記得前生事,便可重入人間,去尋前生最愛的人。奈何橋邊有塊青石叫三生石,三生石記載著每個(gè)人的前世今生,石身上的字鮮紅如血,最上面刻著四個(gè)大字“早登彼岸”。
溜冰是香港目前流行的叫法,而國內(nèi)則叫旱冰或輪滑,臺灣稱為溜冰,澳門則叫它做雪屐。不論叫法如何,其目的只是區(qū)別水冰地面或非水冰地面 (ICE
SKATING)。然而在宏哥這宏哥把手機(jī)上的這種滑動稱其為溜冰,咱也當(dāng)一回文藝人。
今天做自動化設(shè)置手勢密碼9宮格,本以為發(fā)現(xiàn)swipe不能滿足需求,于是用TouchAction去實(shí)現(xiàn)手勢滑動。但是不是想象中的那么順利。
這篇文章寫的特別的痛苦,寫的死去活來,期間多次想放棄,但是最終堅(jiān)持下來了,破繭成蝶,寫的宏哥好像真的是奈何橋上走了一遭,。細(xì)心地小伙伴們或者童鞋們會發(fā)現(xiàn)宏哥已經(jīng)好多天沒有更新文章了。那是因?yàn)檫@篇文章中遇到了不少坑,耗費(fèi)了大量時(shí)間,總的來說大約是兩個(gè)晚上的時(shí)間,每晚上大約3到4個(gè)小時(shí)。下邊慢慢的聽宏哥給你一一道來。
高級溜冰的滑動
滑動操作一般是兩點(diǎn)之間的滑動,這種滑動宏哥在這里稱其為低級的溜冰滑動;就是宏哥上一節(jié)給小伙伴們分享的。然而實(shí)際使用過程中用戶可能要進(jìn)行一些多點(diǎn)連續(xù)滑動操作。如九宮格滑動操作,連續(xù)拖動圖片移動等場景。那么這種高級絢麗的溜冰滑動在Appium中該如何模擬這類操作呢?下面聽宏哥給你慢慢道來。
TouchAction
首先看一下官方文檔
地址:
https://seleniumhq.github.io/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_actions.html
<https://seleniumhq.github.io/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_actions.html>
Touch Action包含一些列操作,比如按壓、長按、點(diǎn)擊、移動、暫停。由著些不同操作可以組成一套動作。使用TochAction需要先導(dǎo)入對應(yīng)的模塊
from appium.webdriver.common.touch_action import TouchAction
按壓
方法:press() 開始按壓一個(gè)元素或坐標(biāo)點(diǎn)(x,y)。通過手指按壓手機(jī)屏幕的某個(gè)位置。 press也可以接收屏幕的坐標(biāo)(x,y)。
press(self, el=None, x=None, y=None) TouchAction(driver).press(x=0,y=308)
長按
方法:longPress() 開始按壓一個(gè)元素或坐標(biāo)點(diǎn)(x,y)。
相比press()方法,longPress()多了一個(gè)入?yún)ⅲ热婚L按,得有按的時(shí)間吧。duration以毫秒為單位。1000表示按一秒鐘。其用法與press()方法相同。
long_press(self, el=None, x=None, y=None, duration=1000)
點(diǎn)擊
方法:tap() 對一個(gè)元素或控件執(zhí)行點(diǎn)擊操作。用法參考press()。
tap(self, element=None, x=None, y=None, count=1)
移動
方法:move_to() 將指針從上一個(gè)點(diǎn)移動到指定的元素或點(diǎn)。
move_to(self, el=None, x=None, y=None)
注意:
移動到目位置有時(shí)是算絕對坐標(biāo)點(diǎn),有時(shí)是基于前面一個(gè)坐標(biāo)點(diǎn)的偏移量,這個(gè)要結(jié)合具體App來實(shí)踐。
暫停
方法:Wait()
wait(self, ms=0)
暫停腳本的執(zhí)行,單位為毫秒。
釋放
方法:release() 結(jié)束的行動取消屏幕上的指針。
release(self)
執(zhí)行
方法:perform() 執(zhí)行的操作發(fā)送到服務(wù)器的命令操作。
perform(self)
TouchAction實(shí)戰(zhàn)——九宮格滑動操作
九宮格是一種比較常見的圖案加密方式,目前很多App都支持設(shè)置圖案鎖,Android原生系統(tǒng)也支持設(shè)九宮格圖案鎖屏。那么我們該如何使用Appium進(jìn)行滑動操作呢?
測試場景
安裝啟動隨手記App 啟動App后在密碼設(shè)置選項(xiàng)中開啟手機(jī)密碼并滑動九宮格設(shè)置如下“Z”字形的圖形密碼。
測試環(huán)境
1.宏哥的系統(tǒng)環(huán)境是Windows 10版本 64位系統(tǒng)
?
2.宏哥的dk版本:"1.8.0_181"
3.宏哥的appium版本:1.4.16?
4.selenium:3.141.0
安裝selenium:
輸入指令pip install selenium
驗(yàn)證安裝成功:pip show selenium
5.測試設(shè)備:Android 5.1.1 (不能低于5.0版本)
6.Python:3.7.2
命令:python -V? ,回車即可。
7.測試App:隨手記Android app V9.7.1.5
想法與思路
* 安裝啟動隨手記APP
* 代碼實(shí)現(xiàn)點(diǎn)擊“下一步”,向左滑動首頁引導(dǎo)頁面
* 點(diǎn)擊“開始隨手記”進(jìn)入首頁頁面
* 點(diǎn)擊“設(shè)置”按鈕,向上滑動,找到“高級”按鈕,點(diǎn)擊進(jìn)入
* 點(diǎn)擊“手勢密碼”,開始設(shè)置手勢密碼(高級滑動)
代碼實(shí)現(xiàn)
(1)安裝啟動隨手記
(2)代碼實(shí)現(xiàn)點(diǎn)擊“下一步”,向左滑動首頁引導(dǎo)頁面
(3)點(diǎn)擊“開始隨手記”進(jìn)入首頁頁面
(4)點(diǎn)擊“設(shè)置”按鈕,向上滑動,找到“高級”按鈕,點(diǎn)擊進(jìn)入
(5)點(diǎn)擊“手勢密碼”,開始設(shè)置手勢密碼,進(jìn)行解鎖(高級滑動)
這個(gè)地方move_to到了按下的這個(gè)坐標(biāo)點(diǎn),是因?yàn)椴贿@樣的話實(shí)際結(jié)果忽略掉了第一個(gè)按下的點(diǎn)。release()釋放,perform()執(zhí)行。
代碼運(yùn)行結(jié)果
運(yùn)行過程appium和夜神模擬器
?
參考代碼
1 # coding=utf-8 2 # 1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行 3 4 # 2
.注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。 5 ''' 6 Created on 2019-8-07 7 @author: 北京-宏哥 QQ交流群:
707699217 8 Project:學(xué)習(xí)和使用appium自動化測試-高級滑動 9 ''' 10 # 3.導(dǎo)入模塊 11 from appium
import webdriver12 from appium.webdriver.common.touch_action import TouchAction
13 from selenium.webdriver.support.ui import WebDriverWait 14 from
selenium.common.exceptions import NoSuchElementException15 from time import
sleep16 17 desired_caps={} 18 desired_caps['platformName']='Android' 19
desired_caps['deviceName']='127.0.0.1:62001' 20 desired_caps['platforVersion']='
5.1.1' 21 22 desired_caps['app']=r'C:\Users\DELL\Downloads\mymoney.apk' 23
desired_caps['appPackage']='com.mymoney' 24 desired_caps['appActivity']='
com.mymoney.biz.splash.SplashScreenActivity' 25 26 driver=webdriver.Remote('
http://127.0.0.1:4723/wd/hub',desired_caps) 27 driver.implicitly_wait(5) 28 29
30 def get_size(): 31 x=driver.get_window_size()['width'] 32
y=driver.get_window_size()['height'] 33 return x,y 34 35 def swipeLeft(): 36 l=
get_size()37 x1=int(l[0]*0.9) 38 y1=int(l[1]*0.5) 39 x2=int(l[0]*0.1) 40
driver.swipe(x1,y1,x2,y1,1000) 41 42 def swipeUp(): 43 l = get_size() 44 x1 =
int(l[0] * 0.5) 45 y1 = int(l[1] * 0.95) 46 y2 = int(l[1] * 0.35) 47
driver.swipe(x1, y1, x1, y2,1000) 48 49 #等待啟動頁面元素,然后向左滑動兩次,跳過引導(dǎo)頁面 50
WebDriverWait(driver,6).until(lambda x:x.find_element_by_id('
com.mymoney:id/next_btn')) 51 for i in range(2): 52 swipeLeft() 53 sleep(0.5)
54 #點(diǎn)擊“開始隨手記”按鈕 55 driver.find_element_by_id('com.mymoney:id/begin_btn').click()
56 #檢測是否有活動頁面彈窗,如果有就點(diǎn)擊關(guān)閉 57 try: 58 closeBtn=driver.find_element_by_id('
com.mymoney:id/close_iv') 59 except NoSuchElementException: 60 pass 61 else: 62
closeBtn.click()63 64 #點(diǎn)擊設(shè)置 65 driver.find_element_by_id('
com.mymoney:id/nav_btn_forth').click() 66 #等待界面菜單加載出來,然后向上滑動 67
WebDriverWait(driver,6).until(lambda x:x.find_element_by_id('android:id/content'
))68 swipeUp() 69 #點(diǎn)擊高級菜單 70 driver.find_element_by_android_uiautomator('new
UiSelector().text("高級")').click() 71 #點(diǎn)擊密碼與手勢密碼菜單 72 driver.find_element_by_id('
com.mymoney:id/password_protect').click() 73 #點(diǎn)擊手勢密碼保護(hù) 74
driver.find_element_by_id('com.mymoney:id/ll_gesture_psd').click() 75
#連續(xù)滑動兩次設(shè)置圖案密碼76 for i in range(2): 77 TouchAction(driver).press(x=212, y=296
).wait(100)\ 78 .move_to(x=148, y=0).wait(100)\ 79 .move_to(x=148,y=0).wait(100
)\80 .move_to(x=-148,y=148).wait(100)\ 81 .move_to(x=-148,y=148).wait(100)\ 82
.move_to(x=148,y=0).wait(100)\ 83 .move_to(x=148,y=0).wait(100) \ 84
.release().wait(200).perform()
連續(xù)滑動設(shè)置手勢密碼坐標(biāo)計(jì)算
首先使用工具獲取到元素坐標(biāo)位置,可以看到起始位置是【138,218】,終點(diǎn)位置是【581,661】
分析:
該圖形可以橫豎劃分六等分
?
那么第一個(gè)圓中心點(diǎn)的坐標(biāo):
x=138+(581-138)/6
y=218+(661-218)/6
依次類推,想要畫一個(gè)z形狀,則需要計(jì)算第1、2,3,5,7,8,9這幾個(gè)圓的中心點(diǎn)坐標(biāo)
然后用TouchAction 的press和moveto方法將幾個(gè)步驟鏈接起來。代碼如下
1 #引入包 2 from appium.webdriver.common.touch_action import TouchAction 3 4
def settingPassword(self): 5 6 #[138,218][581,661]夜神上的元素坐標(biāo) 7 8 xxx = (581-138
) /6 9 one_x = 138 + xxx 10 one_y = 218 + xxx 11 two_x = 138 + xxx * 3 12
two_y =218 + xxx #與第二個(gè)縱坐標(biāo)相等 13 three_x=138 + xxx*5 14 three_y=218 + xxx
#與第二個(gè)縱坐標(biāo)相等15 five_x=138 + xxx * 3 16 five_y=218+xxx*3 17 seven_x=138 + xxx 18
seven_y=218+xxx*5 19 eight_x=138 + xxx * 3 20 eight_y=218+xxx*5 21 nine_x=138 +
xxx*5 22 nine_y=218+xxx*5 23 24 TouchAction(self.driver).press(x=one_x,
y=one_y).wait(300).move_to(x=two_x, y=two_y).wait(300
).move_to(x=three_x,y=three_y).wait(300).move_to(x=five_x,y=five_y).wait(300
).move_to(x=seven_x,y=seven_y).wait(300).move_to(x=eight_x,y=eight_y).wait(300
).move_to(x=nine_x,y=nine_y).release().perform()
小結(jié)
1.實(shí)現(xiàn)的時(shí)候總是報(bào)錯(cuò):
The coordinates provided to an interactions operation are invalid.
解決方案:在release后邊加上wait,即可。這可是宏哥查了好多資料,才找到的解決辦法,具體原因宏哥也有點(diǎn)蒙圈,等找到原因了,后期補(bǔ)上,或者有知道的大佬可以分享一下心得體會
。
期間宏哥想不用for循環(huán)了,直接寫了兩個(gè)一樣的TouchAction還是報(bào)錯(cuò),然后宏哥實(shí)在是搞不定了,第二天晚上宏哥決定既然可以畫一個(gè)Z字形,要不把設(shè)置密碼的文章改成解鎖密碼文章
,前者需要畫兩個(gè)Z字形,后者需要畫一個(gè)Z字形。而且剛好解鎖,需要一個(gè)就可以,內(nèi)心的小鬼在打架,最終還是理性打敗了取巧和任性,硬著頭皮解決遇到的各種問題,才有了這篇文章的產(chǎn)生。這也側(cè)面的反應(yīng)學(xué)習(xí)和工作是不能偷奸取巧的。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ??
1 for i in range(2): 2 TouchAction(driver).press(x=212, y=296).wait(100)\ 3
.move_to(x=148, y=0).wait(100)\ 4 .move_to(x=148,y=0).wait(100)\ 5 .move_to(x=-
148,y=148).wait(100)\ 6 .move_to(x=-148,y=148).wait(100)\ 7 .move_to(x=148,y=0
).wait(100)\ 8 .move_to(x=148,y=0).wait(100) \ 9 .release().wait(100)
.perform()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
2.這段代碼里面有倆個(gè)坑,呃,關(guān)鍵點(diǎn):
(1)press方法中的坐標(biāo)為絕對坐標(biāo),move_to方法中的坐標(biāo)都是相對坐標(biāo),具體來說第一個(gè)move_to中的坐標(biāo)相對于press方法中的坐標(biāo),第二個(gè)move_to方法中的坐標(biāo)相對于第一個(gè)move_to方法中的坐標(biāo)。以此類推下去,以前好像不是這個(gè)樣子的。直接計(jì)算完就可以用了。宏哥期間犯的錯(cuò)誤:
a.就是直接算完就用結(jié)果報(bào)錯(cuò);然后查資料說是相對坐標(biāo);
b.然后把后邊move_to 的坐標(biāo)都相對第一個(gè)絕對坐標(biāo)了,結(jié)果可想而知,還是報(bào)錯(cuò)。
繼續(xù)查資料,才找到以上的解決辦法了。
(2)wait是必須的:這里ms表示為毫秒,ms=100就是等待100毫秒。不用的話太快會出錯(cuò)
3.分成六等份,小伙伴們有點(diǎn)蒙圈,給小伙伴們看一幅比較直觀的圖
4.
好了,奈何橋走了一遭,終于搞定了,獲得了新生。不過遺憾的事是:實(shí)在太忙了,寫文章,解決問題和各種坑,沒來得及喝一碗孟婆湯,不知道它的味道是酸甜苦辣。。。。,還是其他什么味道,然后把這個(gè)痛苦的過程忘記掉。友情提示:小伙伴們和童鞋們?nèi)绻侥魏螛?,可以喝一碗嘗一嘗鮮。
? ? ? 最后,今天是七夕節(jié),祝大家七夕節(jié)快樂,吃好,玩好?。。?br>
?
您的肯定就是我進(jìn)步的動力。如果你感覺還不錯(cuò),就請鼓勵(lì)一下吧!記得點(diǎn)波?推薦?哦?。。。c(diǎn)擊右邊的小球即可!?:))
? ? ? ?個(gè)人公眾號? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?微信群
?(微信群已滿100,可以加宏哥的微信拉你進(jìn)群)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 宏哥微信(請備注:進(jìn)群)?
? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
熱門工具 換一換
感谢您访问我们的网站,您可能还对以下资源感兴趣:
调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看