10.1.1 頁面滑動原理分析
在頁面滑動查找章節我們就講了滑動的知識點,只是不知道大家是否有認真練習以及去理解,如果你認真練習、理解了那么我相信這一章節的東西不用看也能夠完成,下面我們還是簡單分析一下。
所謂的頁面滑動在我們實際操作手機的過程中就是不斷的從屏幕的下面滑到上面,或者右邊滑到左邊,反之亦然。其實在做自動化滑動的時候我們遵循的也是這個道理,我們只需要按着一個點然后在屏幕上拖動到另外一個點就行,這就實現了一個簡單的滑動。還不懂?回去看第六章的滑動定位吧。
10.2 常見頁面滑動方式實戰10.2.1 滑動實戰
前面沒動也沒問題,我們這里從基礎的講一下。首先我們應該很高心appium將滑動的操作封裝成了一個函數swipe函數,我們看官方api:
swipe(self, start_x, start_y, end_x, end_y, duration=None) ,這句話我相信大家能夠看懂,如果看不是很理解,沒事,我們看官方給出的例子:
Swipe from one point to another point, for an optional duration. 從A點滑動至B點,滑動時間為毫秒 :Args: - start_x - x-coordinate at which to start - start_y - y-coordinate at which to start - end_x - x-coordinate at which to stop - end_y - y-coordinate at which to stop - duration - (optional) time to take the swipe, in ms. :Usage: driver.swipe(100, 100, 100, 400) 用法 driver.swipe(x1,y1,x2,y2,500)
從官方的例子中我相信大家能夠明白了吧。說得通俗易懂就是,我們整個屏幕是一個坐標系,x軸加上y軸的各一個標志就形成了一個坐標點,那么你要滑動屏幕,你總得告訴appium從哪個點(start_x,start_y)到哪個點(end_x,end_y),那么剩下的是不是就是要告訴appium你整個滑動操作要持續的時間呢(毫秒計算)?到這里是不是so easy!
10.3 滑動函數的封裝實戰
10.3.1 如何設計滑動封裝
看到這里可能有人說我啰嗦,當然你有一定基礎,然后有這個思想了那么你可以跳過,其實我每次看書的時候無論該知識點我是否掌握,我都會看一遍,畢竟每個人的思考不一樣,說不定會有一些不一樣的收獲,事實也是如此。
整個app操作中的滑動無非就是上下左右的滑動,那么變化的也就是x,y的值不一樣,水平滑動就是x軸變化,y軸不變化,垂直滑動就是y軸變化,x軸不變化,那么我們回頭來看一下我們第六章的代碼:
def getSize(self): x = self.driver.get_window_size()['width'] y = self.driver.get_window_size()['height'] return (x,y) #向左滑動 def swipeLeft(self,t): l=self.getSize() x1=int(l[0]*0.9) y1=int(l[1]*0.5) x2=int(l[0]*0.1) self.driver.swipe(x1,y1,x2,y1,t) #向右滑動 def swipeRight(self,t): l=self.getSize() x1=int(l[0]*0.25) y1=int(l[1]*0.5) x2=int(l[0]*0.75) self.driver.swipe(x1,y1,x2,y1,t) #向上滑動 def swipeUp(self,t): l=self.getSize() x1=int(l[0]*0.5) y1=int(l[1]*0.8) y2=int(l[1]*0.4) self.driver.swipe(x1,y1,x1,y2,t) time.sleep(5) #向下滑動 def swipeDown(self,t): l=self.getSize() x1=int(l[0]*0.5) y1=int(l[1]*0.25) y2=int(l[1]*0.75) self.driver.swipe(x1,y1,x1,y2,t)
再次回來看的時候收獲不太一樣呢?看到這里你是不是該思考一個問題了呢?這個滑動能夠實現我一些app里面的驗證碼功能嗎?
這個知識點我在這里面就不仔細講了,能否實現下來去實踐一下,即使不行那么最后的解決方案也是類似的。哈哈,答案又說漏了。實踐去,不然你真的只會紙上談兵了。
10.4 解鎖九宮格
10.4.1 解鎖思想
在這個課程之前講一個題外話,其實自動化的目的是為了提高工作效率,不是為了顯示咱會寫代碼,所以能減少工作的時候就減少,好比這個解鎖九宮格如果在你工作中遇見app中有,那么不去設置就好。哈哈,題外話。
首先講解鎖這個之前需要了解一個問題,我們這個解鎖解的是app里面的密碼鎖,不是你設置手機的密碼,切記切記。手機的密碼暫時appium還不提供方法去解決,so,等待你去努力。
首先我們看一下下面一張圖片:
你看到圖片中的定位你能找到方法去操作嗎?我們的9個點就在一個view里面,他們是一個整體,分不開。怎么去實現?思考一下。
10.4.2 九宮格解鎖語法
不知道看見上面的那幅圖的思考結果是什么,首先我們來看一下我們經常用到的解鎖方式以及語法。
首先我們第一個需要了解的是TouchAction。其實TouchAction的原理是將一系列的動作放在一個鏈條中,好比我們解鎖九宮格的時候一樣,我們是在這個鏈條中執行了很多不操作,然后將這個鏈條傳遞給服務器,然后服務器再去挨個解析這一些動作,最后挨個執行。
知道了TouchAction之后那么我們在解鎖之前是不是需要做第一個動作呢?就是去點(用到press),只有點了開始點之后我們再將我們的動作移動到下一個點(move_to),然后依次類推,當我們將所有的點都執行完畢之后就需要松開我們的點(release),然后進行提交(perform),這是不是就是一個完整的解鎖流程呢?那我們如何將上面的流程轉換成代碼呢?看下面:
TouchAction(self.driver).press().move_to().move_to().release().perfrom()
這是我們整個流程的代碼,但是如果你這樣去執行肯定回報錯,為什么呢?因為我都不知道你要點啥,從哪里移動到哪里,能不報錯么?
首先press()時需要指定一個對象,對吧。那么這里看press()的語法:
press(WebElement e):這里你需要傳入一個WebElement元素,但是像我們上面的圖片無法獲取到WebElement元素怎么辦,那么我們就需要通過下面這種坐標的方式來進行。
press(int x,int y):這里你需要傳入需要點擊元素的坐標位置。
move_to(WebElement e):同樣的傳入一個WebElement元素,當無法獲取WebElement元素時,同樣用坐標去操作
move_to(int x,int y).
那么最后我們上面的解鎖代碼就成了下面這個樣子:
TouchAction(self.driver).press(x=228,y=647).move_to(x=228,y=647).wait(100).move_to(x=812,y=647).wait(100).move_to(x=812,y=940).wait(100).mov e_to(x=812,y=1241).release().perform()
10.4.3 九宮格解鎖實戰
通過上面的學習我相信大家一定覺得能夠完全搞定上面的問題了,但是去動手了的人都知道結果了,上面執行后肯定回報錯,知道為什么嗎?往上照了資料但是一樣卻實際要報錯,為什么呢?首先來看我的代碼:
from appium.webdriver.common.touch_action import TouchAction TouchAction(self.driver).press(x=217,y=600).move_to(x=0,y=150).wait(1000).move_to(x=0,y=150).wait(1000).move_to(x=113,y=0).move_to(x=113,y=0).release().perform()
是不是發現有不一樣的地方呢?這里一定要記住的是move_to()函數里面的坐標位置是在上一個目標位置的基礎上進行坐標位置的變化。初始坐標位置為:press(x=217,y=600),第一個move_to(x=0 ,y=150),表示在(x=217,y=600)這個位置上向下移動150分辨率,也就是連接第二個點。而第二個move_to(x=0,y=150),意思也差不多,因為,這個時候我還沒有release()也就是沒有松開手,所以第三個點還是以(x=217,y=900)為起點,依次類推那么最后的結果就是我們上面的代碼。哈哈,是不是頓時有被網上一些資料忽悠呢?但是你也不要覺得很厲害,你思考過一個問題沒?每個手機的分辨率不一樣,那么這樣的操作在測試兼容性的時候是不是就有問題了呢?那思考一下該怎么解決吧。
備注:可能看到這里的小伙伴會疑惑,為什么不用開始講的定位直接使用element來進行定位操作呢?因為我們選擇操作的對象是qq,在qq中整個九宮格頁面他是一個view,他沒有將每一個空格都拆分成一個element,所以那種方法不行,但是相對而言那會簡單,只需要將我們的坐標更換成element的元素信息即可。提醒一下,最好是開始定位整個九宮格view,這個時候是一個數組,那么每一個元素只需通過index去訪問就好,那樣操作最快,下去動手操作一下吧。