Appium python自動化測試系列之頁面滑動原理講解(十)

來源:互聯網
上載者:User

標籤:上進   分析   直接   port   問題   window   設定   例子   瞭解   

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).move_to(x=812,y=1241).release().perform()

 

?10.4.3 九宮格解鎖實戰

通過上面的學習我相信大家一定覺得能夠完全搞定上面的問題了,但是去動手了的人都知道結果了,上面執行後肯定回報錯,知道為什麼嗎?往上照了資料但是一樣卻實際要報錯,為什麼呢?首先來看My Code:

from appium.webdriver.common.touch_action import TouchActionTouchAction(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去訪問就好,那樣操作最快,下去動手操作一下吧。

 

Appium python自動化測試系列之頁面滑動原理講解(十)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.