Appium+python自動化(二十九)- 模擬手指在手機上多線多點作戰 – 多點觸控(超詳解)

  • 2019 年 10 月 3 日
  • 筆記

簡介

在網頁中我們經常使用縮放操作來便利的查看具體的資訊,在appium中使用MultiAction多點觸控的類來實現。MultiAction是多點觸控的類,可以模擬用戶多點操作。主要包含載入add()和執行perform()兩個方法.

問題思考

在使用地圖App中,我們經常需要對介面進行縮放操作來更加便利的查看位置。那麼在Appium中怎樣去模擬這類操作呢?

MultiAction

MultiAction 是多點觸控的類,可以模擬用戶多點操作。主要包含 add() 和 perform() 兩個方法, MultiAction可以結合前面所學的 ActionTouch可以模擬出用戶的多個手指滑動的操作效果; MultiAction一般和TouchAction結合使用,故需要導入以下模組:

from appium.webdriver.common.multi_action import MultiAction    from appium.webdriver.common.touch_action import TouchAction

載入:

方法add(self, *touch_actions)將TouchAction對象添加到MultiAction中,稍後再執行。

參數:
  • touch_actions – 一個或多個TouchAction對象,描述一個手指要執行的動作鏈
用法
a1 = TouchAction(driver)    a1.press(el1).move_to(el2).release()        a2 = TouchAction(driver)    a2.press(el2).move_to(el1).release()        MultiAction(driver).add(a1, a2)

執行

perform(self) 執行存儲在對象中的操作。

用法
a1 = TouchAction(driver)    a1.press(el1).move_to(el2).release()        a2 = TouchAction(driver)    a2.press(el2).move_to(el1).release()        MultiAction(driver).add(a1, a2).perform()

Ps:是不是有點類似Python裡面的多執行緒和多進程的使用。

多點觸控操作實踐——地圖App縮放

測試場景

安裝啟動百度地圖Android app 進入地圖後分別進行放大縮小操作

測試環境

1.宏哥的系統環境是Windows 10版本 64位系統

 

2.宏哥的dk版本:”1.8.0_181″

3.宏哥的appium版本:1.4.16 

4.selenium:3.141.0

安裝selenium:

輸入指令pip install selenium

驗證安裝成功:pip show selenium

5.測試設備:Android 5.1.1 (不能低於5.0版本)

6.Python:3.7.2

命令:python -V  ,回車即可。

7.百度地圖Android版 V10.6.5

滑動原理圖解

 

放大(Zoom):則手指分別從B>A,C>D同時向外移動放大頁面

縮小(pinch):則手指分別從A>B,D>C同時向中間移動縮小頁面

想法與思路

  • 安裝啟動百度地圖APP
  • 啟動後程式碼實現點擊“同意”,然後接著點擊“進入地圖”
  • 進入地圖由於最近剛過完七夕,有個搶紅包的活動,將其關閉
  • 執行縮小函數3次,將地圖縮小三次;緊接著執行放大函數,將地圖放大三次。

程式碼實現

(1)安裝啟動百度地圖

(2)點擊“同意”,然後接著點擊“進入地圖

(3)進入地圖由於最近剛過完七夕,有個搶紅包的活動,將其關閉

活動關閉定位

程式碼實現

 

(4)執行縮小函數3次,將地圖縮小三次;緊接著執行放大函數,將地圖放大三次

 

程式碼運行結果

運行程式碼夜神模擬器自動化操作

參考程式碼

 1 # coding=utf-8   2 # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行   3   4 # 2.注釋:包括記錄創建時間,創建人,項目名稱。   5 '''   6 Created on 2019-8-08   7 @author: 北京-宏哥   QQ交流群:707699217   8 Project:學習和使用appium自動化測試-多點觸控操作   9 '''  10 # 3.導入模組  11 from appium import webdriver  12 from selenium.common.exceptions import NoSuchElementException  13 from appium.webdriver.common.touch_action import TouchAction  14 from appium.webdriver.common.multi_action import MultiAction  15  16 desired_caps={}  17 desired_caps['platformName']='Android'  18 desired_caps['deviceName']='127.0.0.1:62001'  19 desired_caps['platforVersion']='5.1.1'  20  21 desired_caps['app']=r'C:UsersDELLDownloadsbase.apk'  22 desired_caps['appPackage']='com.baidu.BaiduMap'  23 desired_caps['appActivity']='com.baidu.baidumaps.WelcomeScreen'  24  25 driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)  26 driver.implicitly_wait(5)  27  28 x=driver.get_window_size()['width']  29 y=driver.get_window_size()['height']  30 #點擊同意  31 driver.find_element_by_id('com.baidu.BaiduMap:id/ok_btn').click()  32 #點擊進入地圖  33 driver.find_element_by_id('com.baidu.BaiduMap:id/btn_enter_map').click()  34  35 #檢測是否有活動頁面彈窗,如果有就點擊關閉(宏哥做的時候有個領紅包的活動頁面)  36 try:  37     closeBtn=driver.find_element_by_id('com.baidu.BaiduMap:id/guide_close')  38 except NoSuchElementException:  39     pass  40 else:  41     closeBtn.click()  42  43 def pinch():  44     action1=TouchAction(driver)  45     action2=TouchAction(driver)  46     pinch_action=MultiAction(driver)  47  48     action1.press(x=x*0.2,y=y*0.2).wait(1000).move_to(x=x*0.4,y=y*0.4).wait(1000).release()  49     action2.press(x=x*0.8,y=y*0.8).wait(1000).move_to(x=x*0.6,y=y*0.6).wait(1000).release()  50  51     pinch_action.add(action1,action2)  52     print('start pinch...')  53     pinch_action.perform()  54  55 def zoom():  56     action1 = TouchAction(driver)  57     action2 = TouchAction(driver)  58     zoom_action = MultiAction(driver)  59  60     action1.press(x=x * 0.4, y=y * 0.4).wait(1000).move_to(x=x * 0.2, y=y * 0.2).wait(1000).release()  61     action2.press(x=x * 0.6, y=y * 0.6).wait(1000).move_to(x=x * 0.8, y=y * 0.8).wait(1000).release()  62  63     zoom_action.add(action1,action2)  64     print("start zoom...")  65     zoom_action.perform()  66  67 if __name__ == '__main__':  68     for i in range(3):  69         pinch()  70  71     for i in range(3):  72         zoom()

合格開發的參考程式碼

# coding=utf-8  # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行    # 2.注釋:包括記錄創建時間,創建人,項目名稱。  '''  Created on 2019-8-08  @author: 北京-宏哥   QQ交流群:707699217  Project:學習和使用appium自動化測試-多點觸控操作  '''  # 3.導入模組  from appium import webdriver  from selenium.common.exceptions import NoSuchElementException  from appium.webdriver.common.touch_action import TouchAction  from appium.webdriver.common.multi_action import MultiAction    #初始化  desired_caps={}  desired_caps['platformName']='Android'  desired_caps['deviceName']='127.0.0.1:62001'  desired_caps['platforVersion']='5.1.1'    desired_caps['app']=r'C:UsersDELLDownloadsbase.apk'  desired_caps['appPackage']='com.baidu.BaiduMap'  desired_caps['appActivity']='com.baidu.baidumaps.WelcomeScreen'    driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)  driver.implicitly_wait(5)    x=driver.get_window_size()['width']  y=driver.get_window_size()['height']  #點擊同意  driver.find_element_by_id('com.baidu.BaiduMap:id/ok_btn').click()  #點擊進入地圖  driver.find_element_by_id('com.baidu.BaiduMap:id/btn_enter_map').click()    #檢測是否有活動頁面彈窗,如果有就點擊關閉(宏哥做的時候有個領紅包的活動頁面)  try:      closeBtn=driver.find_element_by_id('com.baidu.BaiduMap:id/guide_close')  except NoSuchElementException:      pass  else:      closeBtn.click()    #定義縮小函數  def pinch():      action1=TouchAction(driver) #第一個手勢      action2=TouchAction(driver) #第二個手勢      pinch_action=MultiAction(driver) #縮小手勢        action1.press(x=x*0.2,y=y*0.2).wait(1000).move_to(x=x*0.4,y=y*0.4).wait(1000).release()      action2.press(x=x*0.8,y=y*0.8).wait(1000).move_to(x=x*0.6,y=y*0.6).wait(1000).release()        pinch_action.add(action1,action2) #載入      print('start pinch...')      pinch_action.perform() #執行    #定義放大函數  def zoom():      action1 = TouchAction(driver) #第一個手勢      action2 = TouchAction(driver) #第二個手勢      zoom_action = MultiAction(driver) #放大手勢        action1.press(x=x * 0.4, y=y * 0.4).wait(1000).move_to(x=x * 0.2, y=y * 0.2).wait(1000).release()      action2.press(x=x * 0.6, y=y * 0.6).wait(1000).move_to(x=x * 0.8, y=y * 0.8).wait(1000).release()        zoom_action.add(action1,action2)  #載入      print("start zoom...")      zoom_action.perform()  #執行    #主函數調用子函數    #__name=’__main__’表示執行當前py文件;否則當前文件屬於調用模組  if __name__ == '__main__':      for i in range(3):     #執行縮小函數3次,range(3)代表執行0,1,2共3次          pinch()        for i in range(3):     #執行放大函數3次,range(3)代表執行0,1,2共3次          zoom()

小結

   好了,時間不早了,關於多點觸控宏哥就簡單的介紹到這裡,大家晚安!!!

您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得點波 推薦 哦!!!(點擊右邊的小球即可! :))

       個人公眾號                                                             微信群 (微信群已滿100,可以加宏哥的微信拉你進群,請備註:進群)