草庐IT

新鲜出炉:appium2.0+ 单点触控和多点触控新的解决方案

简---- 2023-03-28 原文

在 appium2.0 之前,在移动端设备上的触屏操作,单手指触屏和多手指触屏分别是由 TouchAction 类,Multiaction 类实现的。

在 appium2.0 之后,这 2 个方法将会被舍弃。

"[Deprecated] 'TouchAction' action is deprecated. Please use W3C actions instead."

 

 

 


1、w3c action 是什么?

在 w3c 的 actions 当中,将输入源分为了三类:

  1. 键盘类 - Key
  2. 指针类 - Pointer
  3. None

对于 Pointer 指针类输入源,共有 3 种:Mouse 鼠标、Touch 触屏、Pen 笔触

输入源,是提供输入事件的虚拟设备。

每一个输入源,都是一个输入 id,输入源 type。与真实设备一样,每一个输入源都有状态的,有输入事件。

在 python selenium 的源码当中,selenium/common/actions/input_devices.py 里 InputDevices 类定义了输入源类。

 

 

 

1、空输入源(null input source)

提供以下行为:

pause:不做任何操作一段时间,或者动作的持续时间

2、键盘输入源(key input source)

提供以下行为:

KeyDown:按下某个键

KeyUp:释放某个键

在 python selenium 的源码当中,selenium/common/actions/key_input.py 里 KeyInput 类定义了按钮输入源类。

 

 

 

3、指针输入源(pointer input source),提供以下行为:

PointerDown:按下鼠标键,或者触屏或者触屏笔触屏

PointerUp:松开鼠标键,或者手离开屏幕,或者触屏笔离开屏幕

PointerMove:移动到屏幕某个点

PointerCancel:删除某个指针操作

在 python selenium 的源码当中,selenium/common/actions/pointer_input.py 里 PointerInput 类定义了指针输入源类。

 

 

 

4、在输入源基础上,定义了键盘操作类 KeyActions

在 python selenium 的源码当中,selenium/common/actions/key_actions.py 里 KeyActions 类定义了键盘操作类。

 

 

 

5、在输入源基础上,定义了鼠标/触屏操作 PointerActions 类:

在 python selenium 的源码当中,selenium/common/actions/pointer_actions.py 里 PointerActions 类定义了鼠标/触屏操作类。

 

 

 

 

 

 

 

 

汇总一下上面几个类:

 

 

 

6、ActionBuilder 类

初始化方法:

  1. 输入源设备列表,会放 2 个输入源:鼠标输入源、键盘输入源。
  2. 有 2 个私有属性:键盘操作对象(KeyActions 类实例化**)**,鼠标/触屏操作对象(PointerActions 类实例化)

 

 

 

属性:key_action,pointer_action

在 ActionChains 类当中,就是通过这 2 个属性来调用鼠标和键盘的操作的。

 

 

 

添加新的输入源:add_key_input,add_pointer_input

 

 

 


2、ActionChains 类

selenium 中的鼠标操作类,鼠标行为都是使用的 ActionBuilder 类。

初始化:

 

 

 

 

 

 


3、单点触控 - ActionChains 类

直接使用 ActionChains 类里的,w3c_actions 去实现。

比如 appium 当中的 swipe 滑屏方法:

移动到某一个坐标点 → 按下 → 移动到另一个坐标点 → 释放

 

 

 


4、多点触控 - ActionChains 类

多点触控,是个单点触控操作同时发生,比如 2 个手指,同时在屏幕上进行滑动操作。

仍然是 ActionChains 类,不过需要在里面,添加新的单点触控操作。

 
actions = ActionChains(driver)
# 输入源设备列表为空
actions.w3c_actions.devices = []

# 添加一个新的输入源到设备到中,输入源类型为Touch
new_input = actions.w3c_actions.add_pointer_input('touch', f'finger{finger}')
# 输入源的动作:移动到某个点,按下,移动到另外一点,释放
new_input.create_pointer_move(x=start_x, y=start_y)
new_input.create_pointer_down(MouseButton.LEFT)
new_input.create_pause(duration / 1000)
new_input.create_pointer_move(x=end_x, y=end_y)
new_input.create_pointer_up(MouseButton.LEFT)

# 以此类推,可以添加多个输入源操作到设备当中。可以是鼠标操作,也可以是触屏,按键等操作

 

比如,对百度地图 app 进行放大操作的代码如下:

from time import sleep
from appium import webdriver

from selenium.webdriver import ActionChains
from selenium.webdriver.common.actions.mouse_button import MouseButton

#我要在android7.1.2设备上,打开百度地图app
desired_caps = {
"automationName":"UiAutomator2",
"platformName":"Android",
"platformVersion":"7.1.2",
"deviceName":"HuaWei",
"noReset":True,
"appPackage":"com.baidu.BaiduMap",
"appActivity":"com.baidu.baidumaps.WelcomeScreen",
"systemPort": 8225,
"newCommandTimeout": 1200
}

#先连接appium server。传递指令。 appium server连接地址
driver = webdriver.Remote('<http://127.0.0.1:4723/wd/hub>', desired_caps)

sleep(20)

#获取设备的大小 - size
size_dict = driver.get_window_size()

# ==========放大地图:从地图中心分别向对角线滑动放大 - 2个手指同时执行滑动操作  ==================
actions = ActionChains(driver)
#输入源设备列表为空
actions.w3c_actions.devices = []

# ========== 第1个手指:从正中心向右上角滑动  ==================
#添加一个新的输入源到设备到中,输入源类型为Touch,id为finger0
new_input = actions.w3c_actions.add_pointer_input('touch','finger0')
#输入源的动作:移动到某个点,按下,移动到另外一点,释放
new_input.create_pointer_move(x=size_dict["width"] * 0.5, y=size_dict["height"] * 0.5)
new_input.create_pointer_down()
# new_input.create_pointer_down(MouseButton.LEFT)
new_input.create_pause(0.2) # 200ms
new_input.create_pointer_move(x=size_dict["width"] * 0.9, y=size_dict["height"] * 0.1)
new_input.create_pointer_up(MouseButton.LEFT)

# ========== 第2个手指:从正中心向左下角滑动  ==================
#添加一个新的输入源到设备到中,输入源类型为Touch。id为finger1
new_input = actions.w3c_actions.add_pointer_input('touch','finger1')
#输入源的动作:移动到某个点,按下,移动到另外一点,释放
new_input.create_pointer_move(x=size_dict["width"] * 0.5, y=size_dict["height"] * 0.5)
new_input.create_pointer_down()
# new_input.create_pointer_down(MouseButton.LEFT)
new_input.create_pause(0.2) # 200ms
new_input.create_pointer_move(x=size_dict["width"] * 0.1, y=size_dict["height"] * 0.9)
new_input.create_pointer_up(MouseButton.LEFT)

#执行动作
actions.perform()

 

 

有关新鲜出炉:appium2.0+ 单点触控和多点触控新的解决方案的更多相关文章

  1. ruby - Ruby/Rack 中的单点登录服务器身份验证 - 2

    我在Windows服务器上编写和托管Web应用程序以供内部网使用。我的服务器堆栈使用Sinatra(使用Rack)、Thin和(在某些情况下)Apache仅用于反向代理。我想在我们的ActiveDirectory支持的域中支持单点登录(使用NTLM或Kerberos)。我已经看到我可以使用mod_ntlm或mod_auth_kerb当我在Apache后面执行我的NTLM身份验证时。我还没有尝试过,但我认为它会起作用。当我不支持Apache时,我的问题是关于NTLM或Kerberos身份验证,仅使用Thin和Sinatra。我看过rack-ntlm,但那里的使用细节非常稀少。请在Sina

  2. javascript - iPad 需要三点触控来处理 JavaScript 点击事件 - 2

    我的iPad有问题。我在JavaScript中使用3个函数作为anchor标记,onmouseover、onmouseout、onclick。但是当我在iPad上测试它时,第一次触摸它会触发onmouseover,然后需要两次触摸才能执行onclick事件。这意味着点击事件总共需要三个触摸。一般来说,它只需要两次触摸就可以了。为什么会这样? 最佳答案 要完全支持带有触摸屏的移动设备,您不能使用鼠标事件...您需要更改为触摸事件http://ross.posterous.com/2008/08/19/iphone-touch-even

  3. 【APP自动化测试必知必会】Appium之微信小程序自动化测试 - 2

    01.H5与小程序介绍H5概述H5是指第5代HTML,也指用H5语言制作的一切数字产品。所谓HTML是“超文本标记语言”的英文缩写。我们上网所看到网页,多数都是由HTML写成的。“超文本”是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。而“标记”指的是这些超文本必须由包含属性的开头与结尾标志来标记。浏览器通过解码HTML,就可以把网页内容显示出来,它也构成了互联网兴起的基础。H5之所以能引发如此广泛的效应,根本在于它不再只是一种标记语言,它为下一代互联网提供了全新的框架和平台,包括提供免插件的音视频、图像动画、本体存储以及更多酷炫而且重要的功能,并使这些应用标准化和开放化,从而使互联

  4. javascript - JQuery - 我可以查询 MacBook Pro 触控板吗? - 2

    我可以使用JQuery查询触控板吗?所以我可以做这样的事情:伪Javascript(JQuery)$(document).keyInput().trackpadTwoFingersLeft(function(){$('#divul').animate({left:"=+1"},1);});是否有可以执行此操作的插件或其他框架?感谢您的每一个回复和想法。:) 最佳答案 我在网上浏览了一下,到目前为止发现Chrome和Safari都没有在浏览器中公开这些事件。https://superuser.com/questions/27627/t

  5. javascript - 带有 Firefox 的 Surface Pro 3 - 具有单点触摸触发触摸/鼠标事件而不是滚轮事件 - 2

    仅在带有Firefox的SurfacePro3上:当用单指在元素上做出滑动手势时,浏览器将触发wheel事件,而不是touchmove或mousemove事件。您如何停止滚轮行为,并让单个手指始终被视为触摸/鼠标移动?所以我想将单个手指滑动视为一系列mousemove或touchmove而不是wheel事件。如果在此元素上滑动,我根本不希望单指滑动来滚动页面。这在Chrome和IE11中很容易做到。这在Firefox中似乎是不可能的。Current我认为这是一个错误,但我可能遗漏了一些东西。这是一个简单的例子:http://codepen.io/simonsarris/pen/Pwbd

  6. javascript - 单点触摸平移后不会在 iPad 上触发 onscroll 事件? - 2

    在尝试找出UIWebView的滚动位置时,我在HTML中附加了一个监听器,它将回调到主应用程序。我附加了javascript监听器,如:window.onscroll=functionreportScroll(){varsY=window.pageYOffset;alert('Scrollpos:'+sY);//WouldevetuallytriggeraURLorsomething}此事件似乎只在OS3.2(iPad)上的轻弹滚动结束时触发,一旦减速结束。然而这个:https://developer.apple.com/library/content/documentation/Ap

  7. javascript - SPA和SSO中无状态身份验证的性能(单点登录) - 2

    如果我有SPA(用BackboneJS开发的单页应用程序),并且想为其数据使用无状态RESTful后端API。我喜欢3rdparty单点登录如何使用户变得如此简单,因此会喜欢它使用它。但是我知道在这样的无状态环境中,对每个请求都进行身份验证吗?如果是这样,如果我使用的是第三方SSO,例如GitHub,我是否不需要每次都去GitHub进行用户身份验证?在这种情况下,最佳做法是什么?我相信这是一个非常常见的用例?-我允许用户通过Google/GitHub或其他方式登录,然后从一些无状态RESTAPI获取数据 最佳答案 免责声明:)为我的

  8. javascript - 有没有办法通过浏览器Javascript检测Mac上触控板、魔术鼠标或魔术触控板的多点触控事件? - 2

    我知道有很多方法可以直接在iPhone(jQtouch)上执行此操作,但我想在计算机的浏览器中检测这些事件。 最佳答案 Mozilla对鼠标手势有一些支持:https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mouse_gesture_events看起来chrome和safari没有原生支持:JQuery-CanIquerytheMacBookProTrackpad? 关于javascript-有没有办法通过浏览器Javas

  9. javascript - Highcharts 高亮单点在线 - 2

    我正在使用Highcharts绘制折线图。当页面加载时,将绘制折线图。请注意,对于从0到700(0,1,2,3,...,700)的每个x值,我都得到了一个y值。这就是我创建图表的方式:chart=newHighcharts.Chart({chart:{renderTo:'container',animation:false,type:'line',marginTop:null,marginRight:55,marginBottom:50,marginLeft:80,backgroundColor:backgroundColor,spacingTop:10,spacingRight:10

  10. javascript - Windows Phone 8 触控支持 - 2

    WindowsPhone8是否在默认浏览器中完全支持触摸事件?它是否开箱即用,以便网页可以检测到任意的触摸移动事件?我遇到了一些浏览器的问题,这些浏览器会劫持touchmove事件以用于其界面作为滑动手势。WindowsPhone8浏览器会做类似的事情吗?谁能指出有关WindowsPhone8触摸事件的任何文档?编辑:这里有一个页面可以让拥有windowsphone8的人测试触摸功能:http://blogs.msdn.com/b/ie/archive/2011/10/19/handling-multi-touch-and-mouse-input-in-all-browsers.asp

随机推荐