1. 程式人生 > >Appium+python自動化(二十九)- 模擬手指在手機上多線多點作戰 - 多點觸控(超詳解)

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

簡介

在網頁中我們經常使用縮放操作來便利的檢視具體的資訊,在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:\Users\DELL\Downloads\base.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:\Users\DELL\Downloads\base.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,可以加巨集哥的微信拉你進群,請備註:進群)          

                                                                &n