Appium混合页面点击方法tap的使用

2023-09-14 14:47:31

原生应用开发,是在Android、IOS等移动平台上利用官方提供的开发语言、开发类库、开发工具进行App开发;HTML5(h5)应用开发,是利用Web技术进行的App开发。目前,市面上很多app都是原生和h5混合开发,这样做的好处在于:

1)开发效率高,节约时间同一套代码Android和IOS基本都可用。

2)更新和部署比较方便,不需要每次升级都要上传到App Store进行审核了,只需要在服务器端升级就可以。

3)代码维护方便、版本更新快,降低产品成本。(以上内容引用自百度)

使用appium对混和开发的app做自动化时,会碰到不少坑。最近在用appium操作app中h5页面时,碰到一个问题:已经切换到webview中并且定位到了元素,用click方法点击元素怎么都不起作用。这时候查看appium日志如图1,发现click方法已经执行了,但是手机上并没有执行这个动作。我以前用click方法是可以点击已定位的webview元素的,所以我找前端研发工程问了一下,找到了原因:在手机端用js操作H5页面时,click会有200-300ms延时,后面写的页面很多都采用封装好的tap来进行点击,这种情况下用click就不起作用。

图片

图 1

接下来我想到用原生中tap方法,先获取元素范围内坐标,再进行tap点击,代码如图2。结果在切到webview获取到元素中心坐标,使用tap方法时报错,因为webview中无法使用原生的tap方法。

图片

图 2

于是我在webview中定位好元素后切回原生后使用tap方法,但这个时候又碰到一个问题:由于web页面坐标系与手机原生坐标系不一致,同一个元素在webview中的坐标与在原生页面中的坐标不一致,切出webview后tap依然点击不到,这条路暂时也行不通了。

我想起appium中的webdriver是继承自selenium,但是手势操作会不会有不同呢,抱着试一试的心态查看了一下appium中的手势操作类TouchAction,发现几行注释如图2,

图片

图 3

原来原生中的tap方法是appium作者为了适应selenium而写的,于是我找到selenium中的TouchActions类,发现也有tap方法如图 3。注:

图片

图 4

该方法中只有element参数,没有坐标参数,参数为坐标时无法点击。
尝试着用selenium下的tap方法,成功实现,伪代码如下:

element = getElement(driver,locationType,locatorExpression)

#该方法为我自己封装的获取element方法,读者只需根据正常方法获取到元素即可。

tas = TouchActions(driver)

#实例化一个TouchActions对象tas.tap(element)

本来以为此问题已经解决,不料在运行第二次时,该方法也失效了,查看touch_actions中的代码如图5发现,手势操作需要用perform再执行一下,把action提交才会起作用,问题解决。

图片

图 5

附上源代码:

from selenium.webdriver.common.touch_actions import TouchActions
def tap_element(locationType, locatorExpression):
    try:
element = getElement(driver, locationType=locationType, locatorExpression=locatorExpression)        #element可根据自己的方式获取
tas = TouchActions(driver)
tas.tap(element).perform()
except Exception, e:
    raise e

    if __name__=='__main__':
launchApp_smy_noReset()     #启动app,此方法自己封装
sleep(10)     #留足够时间点击到调试页,也可用程序跳转到h5页面
switch_to_webview()    #切换到webview
tap_element('xpath','//*[@id="detail"]/div[4]/a[2]')

#调用刚封装好的tap_element方法
print '点击成功'
switch_to_native()    #切换到原生
print '切换成功'

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

更多推荐

精益求精:Android应用体积优化的终极指南

精益求精:Android应用体积优化的终极指南1.介绍在当今移动应用生态系统中,Android应用的体积优化是开发者需要高度重视的关键方面之一。一个庞大的应用体积不仅会对用户体验造成负面影响,还会导致以下问题:下载速度延迟:用户需要等待更长时间来下载和安装应用程序,这可能导致用户流失。占用存储空间:较大的应用占用用户设

华为开源自研AI框架昇思MindSpore应用案例:消噪的Diffusion扩散模型

目录一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例二、案例实现构建Diffusion模型位置向量ResNet/ConvNeXT块Attention模块组归一化条件U-Net正向扩散数据准备与处理采样训练过程推理过程(从模型中采样)本文基于HuggingFace:TheAnnot

Homebrew国内和国外如何自动安装(Mac & Linux)

介绍Homebrew是一个适用于macOS和Linux操作系统的开源包管理器,它允许用户轻松安装、升级和管理各种软件包和工具。Homebrew的目标是简化软件包的安装和维护过程,使用户能够快速获取他们所需的工具和应用程序。安装1、官网推荐安装方式,如果在国内,要使用vpn才可以访问通在macOS上安装Homebrew:

react-route的路由

React-Router是一个基于React的强大路由库,它可以帮助我们在React应用中实现页面之间的跳转和路由管理。本文将详细介绍React-Router的路由功能、常用功能模块、路由传参和路由嵌套,并提供相关代码和解释。路由功能React-Router通过管理URL和组件的映射关系,可以帮助我们实现以下路由功能:

算法 缺失的第一个正整数-(哈希)

牛客网:BM53题目:无重复元素数组中未出现的最小的正整数思路:(1)使用单独hash表记录每个元素出现的次数,从1开始递增查询出现次数直到次数为0停止返回(2)将原数组作为hash表使用,处理好负数与0,将绝对值在N范围内的每个元素的绝对值减1定位到数组相关的下标将值置反(因为每个元素可能已被其他元素置为负数,所以需

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测

时序预测|MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测目录时序预测|MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料预测效果基本介绍MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测(完整源码和数

可以查看输入字数的手机备忘录软件用哪个?

在当下这个科技迅速发展的时代,我们常常需要依赖备忘录来记录重要的信息、灵感和待办事项。手机备忘录成为了我们随身携带的工具,但是你有没有遇到这样的情况:你写了很多内容,但不知道写了多少字?这个问题或许曾经困扰着你,但如今,有了敬业签,一切都变得方便了。敬业签不仅仅是一个备忘录应用,它是一款可以分类记录工作计划、学习笔记、

Linux 线程同步、互斥锁、避免死锁、条件变量

1.线程同步概述线程同步定义线程同步,指的是控制多线程间的相对执行顺序,从而在线程间正确、有序地共享数据,以下为线程同步常见使用场合。多线程执行的任务在顺序上存在依赖关系线程间共享数据只能同时被一个线程使用线程同步方法在实际项目中,经常使用的线程同步方法主要分为三种:互斥锁条件变量Posix信号量(包括有名信号量和无名

Unity中关于多线程的一些事

一.线程中不允许调用unity组件api解决方法:可以使用bool值变化并且在update中监测bool值变化来调用关于unity组件的API.二.打印并且将信息输出到list列表中多线程可能同时输出多条信息。输出字符串可以放入Queue队列中。队列可以被多线程插入。三.启用socket连接server在主线程中直接连

Qt5开发及实例V2.0-第十一章-Qt事件处理及实例

Qt5开发及实例V2.0-第十一章-Qt事件处理及实例第11章Qt5事件处理及实例11.1鼠标事件及实例11.2键盘事件及实例11.3事件过滤及实例本章相关例程源码下载1.Qt5开发及实例_CH1101.rar下载2.Qt5开发及实例_CH1102.rar下载3.Qt5开发及实例_CH1103.rar下载第11章Qt5

buuctf-[网鼎杯 2020 朱雀组]phpweb

1.打开网站,吓我一跳2.查看源代码,主要看到timezone,然后这个页面是五秒就会刷新一次一开始去搜了这个,但是没什么用3.使用bp抓包会发现有两个参数,应该是用func来执行p4.修改func和pfile_get_contents:把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。

热文推荐