Appium高级操作--ActionChains类、Toast元素识别、Hybrid App操作、手机系统API的操作

server/2025/3/14 12:56:48/

书接上回Appium高级操作--从源码角度解析--模拟复杂手势操作-CSDN博客文章浏览阅读712次,点赞24次,收藏6次。下面总结Appium模拟复杂手势整体流程创建类实例action时,一定要传入WebDriver实例参数,创建实例成功后,调用属性(实例)将devices置为空列表,不使用默认的[mouse, keyboard, wheel],因为客户端鼠标操作子类型为touch不能使用mouse调用的方法将新输入源加入到devices列表中,并返回XXXInput类的新输入源调用新输入源(new_input)的各种操作方法(例如鼠标按下按钮,释放按钮,鼠标移动等)(这块源码就不细讲了可以自行查看) https://blog.csdn.net/fantasy_4/article/details/146154955,从源码的角度讲解了Appium模拟复杂手势的高级操作,使用的是WebDriver 提供的一种更底层的指针交互方法,适合更精细化的手势操作。本片文章主要讲解其他高级操作,适用于一般手势操作,ActionChains类自带的操作方法,手机系统API的操作,toast元素识别,Hybrid APP操作等。

1.ActionChains类方法

ActionChains类自带的操作方法很多,也可以完成轻击,长按,拖拽等操作,只介绍部分方法或者方法组合操作,其他方法可自行查看方法源码。PS:源码写的注释非常非常非常非常清晰!!!!!是可以拿来练习读源码的入门教材!!!!!!!

注意📢:所有操作都需要调用perform()方法执行

  • 手指短暂轻击click()

python">    login_id = 'new UiSelector().resourceId("com.sankuai.movie:id/dt8")'ele1 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, login_id)ActionChains(driver).click(ele1).perform();
 
  • 手指快速双击double_click()

python"># 双击图片放大photo_id = 'new UiSelector().resourceId("com.sankuai.movie:id/dt8")'ele4 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, photo_id)ActionChains(driver).double_click(ele4).perform()
  • 手指长按 click_and_hold() 手指抬起release() 手指暂停pause()

    
python">    text = 'new UiSelector().text("收藏")'ele2 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, text)# 手指点击并且按下ActionChains(driver).click_and_hold(ele2).perform()# 手指暂挺0.2秒,模拟长按ActionChains(driver).pause(0.2).perform() # 手指抬起ActionChains(driver).release(ele2).perform()
    
  • 手指移动具体位置 move_to_element_with_offset() 手指移动到某一元素位置move_to_element()

    
python">    # 手指移动到具体坐标位置size = driver.get_window_size()ActionChains(driver).move_to_element_with_offset(xoffset=size['width']*0.5, yoffset=size['height']*0.5).perform()# 手指移动到某一元素位置login_id = 'new UiSelector().resourceId("com.sankuai.movie:id/dt8")'ele3 = driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, login_id)ActionChains(driver).move_to_element(ele3).perform()

2.Toast元素识别

Toast是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息。

它不会打断当前操作,并且它永远不会获得焦点,无法被单击,必须使用XPath来查找。以下是两种查找方案。

  • //*[@class='android.widget.Toast']

  • "//*contains(@text, 'toast上的文字')"

python">    driver.find_element(AppiumBy.XPATH, "//*[@class='android.widget.Toast']")
​driver.find_element(AppiumBy.XPATH, "//*contains(@text, '手机号不合法')")

3.Hybrid App操作

对于APP中的H5页面元素的是基于B/S架构,不是基于APP原生控件,所以需要先切换上下文(Context)即当前所属的不同切换环境,然后在进行元素定位。切换Context需要环境准备,然后才能切换。

3.1环境准备
  • 安装软件的测试包(最好是测试包,可以直接打开webView的debug模式)

  • 模拟器或者真机通过USB连接到PC,并且ADB可调试

  • 移动端、PC装有Chrome浏览器

  • 移动端必须要装有与WebView版本对应的ChromeDriver

  • 开启Webview调试模式WebView.setWebContentsDebuggingEnabled(true); 一般需要需要H5前端开发人员帮忙

3.2检查App WebView调试模式是否开启

chrome浏览器打开chrome://inspect可以看到Remote Target,

在这里插入图片描述

此时在手机端打开webview页面,则如下图展示:

在这里插入图片描述

3.3Context相关方法
python">WebDriverWait(driver,10).until(lambda x:x.find_element(AppiumBy.CLASS_NAME, "android.webkit.WebView"))
# 获取当前Context   
driver.current_context
# 获取所有Contexts   
driver.contexts
# 切换到某一Context
driver.switch_to.context()
​

4.手机系统API的操作

4.1屏幕截图
  • save_screenshot() 截图保存到指定目录,只能保存成PNG格式

  • get_screenshot_as_file() 截图保存到制定目录,可以保存成多种格式JPG,PNG等

  • get_screenshot_as_png() 以二进制方式获取当前窗口截图

  • get_screenshot_as_base64() 以Base64编码字符串的形式获取当前窗口截图

特性get_screenshot_as_filesave_screenshot(filename)
是否需要检查返回值需要检查返回值无需检查返回值
文件格式支持多种格式(通过文件扩展名指定)仅支持 PNG 格式
使用方便性较低,因为需要检查返回值更低,因为无需额外处理
适用场景需要保存为其他格式(如 JPEG)的场景只需保存为 PNG 格式的场景
特性get_screenshot_as_png()get_screenshot_as_base64()
返回值类型bytes 类型的数据str 类型的字符串
数据格式PNG 格式Base64 编码的字符串
适用场景适用于需要将截图保存为文件或进行进一步处理的场景将截图嵌入到文本格式(如 HTML 报告或日志)中的场景
python">    # 直接保存当前截图到指定目录driver.save_screenshot('/Users/XXXX/Documents/homepage1.png')sleep(3)# 有返回值re = driver.get_screenshot_as_file('/Users/XXXX/Documents/homepage.png')print(re)sleep(4)# 适用于需要将截图保存为文件或进行进一步处理的场景 有返回值driver.get_screenshot_as_png()
​#适用于需要将截图嵌入到文本格式(如 HTML 报告或日志)中的场景,有返回值driver.get_screenshot_as_base64()
4.2 发送键到设备

driver.press_keycode 用于发送 Android 设备的按键事件

适用场景:很多应用有按两次返回键退出应用的功能

http://developer.android.com/reference/android/view/KeyEvent.html.官网可以查看keycode对应含义

python">     # 音量增加键   driver.press_keycode(24)# 返回键driver.press_keycode(4)# 音量减少键driver.press_keycode(25)
Keycode描述
24音量增加键
25音量减少键
3Home 键
4返回键
82菜单键(长按)
26电源键
19上方向键
20下方向键
21左方向键
22右方向键
23确认键(如 Enter 键)
66回车键
67退格键(Backspace)

4.3操作手机通知栏

driver.open_notifications() 下拉通知栏

使用场景:查看通知栏消息

python">driver.open_notifications()
# 输入keycode,根据keycode做对应操作,4:表示返回键  
# 表示上拉通知栏
driver.press_keycode(4)
4.4息屏亮屏
  • driver.lock() 息屏

  • driver.unlock() 亮屏

  • driver.is_locked() 返回当前屏幕状态

python">    driver.lock(10)
​sleep(3)
​driver.unlock()
# 返回boolean值 True表示亮屏 False表示息屏driver.is_locked()
4.5操作手机网络

driver.set_network_connection() 根据connect type 设置手机网络

使用场景:视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放,这种情况需要切换网络

python"># 设置网络仅为WIFI
driver.set_network_connection(2)
# 获取网络状态
driver.network_connection

可设置的connect type如下:

下文章继续Appium之旅,下篇文章主要讲解Appium的等待机制,可以期待一下哦~ 

参考文章:移动端webview进行网页调试_app webview在线模拟-CSDN博客

文章来源:https://blog.csdn.net/fantasy_4/article/details/146162851
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/174888.html

相关文章

Java网络多线程

网络相关概念: 关于访问: IP端口 因为一个主机上可能有多个服务, 一个服务监听一个端口,当你访问的时候主机通过端口号就能知道要和哪个端口发生通讯.因此一个主机上不能有两个及以上的服务监听同一个端口. 协议简单来说就是数据的组织形式 好像是两个人交流一样,要保证自己说…

汽车无钥匙启动系统不使用传统机械钥匙启动汽车

汽车无钥匙启动系统 定义 汽车无钥匙启动系统(Keyless Start System),启动车辆时不用掏拧钥匙,只需把钥匙放在包内或口袋里,按下车内按键或拧动导板即可使发动机点火。它无需插入钥匙,通过点按按键或旋转…

Github 2025-03-12 C开源项目日报Top5

根据Github Trendings的统计,今日(2025-03-12统计)共有5个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目5C++项目1Lean的LEDE源码:为国产龙芯LOONGSON SoC loongarch64/飞腾Phytium腾锐2000系列架构添加支持 创建周期:2338 天开发语言:C协议类…

JUnit 与 Mockito 组合测试 Controller 层-入门

文章目录 为什么要组合Mockito ?如何实现?导入依赖新建测试类类注解方法逻辑1. 定义替换逻辑2. 定义模拟操作3. 确保执行 完整示例 为什么要组合Mockito ? 答:隔离 Controller 层,保证单元测试纯粹性 具体来说&#…

版本号标识

Visual Studio 16 2019 是 Microsoft Visual Studio 2019 的版本号标识。具体来说: Visual Studio 是微软提供的一款集成开发环境(IDE),用于开发各种应用程序,如桌面软件、Web 应用、移动应用等,支持多种编…

后端主流数据库分析

一、关系型数据库(RDBMS) 1. MySQL:金融支付系统核心 行业场景:​ 金融支付:银行交易流水、支付订单(ACID事务保障)。​电商平台:商品库存管理、订单状态跟踪(高并发OLTP)。SaaS服务:多租户用户管理(分库分表隔离数据)。Python实战代码: # 金融交易事务操作(…

DataGear部署文档(基于openeuler)

目录 文章目录 目录安装JDK部署DataGear启用DataGear关于DataGear系统 安装JDK DataGear需要JDK 8的运行环境,所以我们需要预先在openeuler上安装好 可以点击这里进行下载:https://www.oracle.com/cn/java/technologies/downloads/#license-lightbox …

【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]

起因 在公共高性能服务器上运行OllamaDeepSeek,如果按照默认配置启动Ollama程序,则自己在远程无法连接你启动的Ollama服务。 如果修改配置,则会遇到你的Ollama被他人完全控制的安全风险。 不过,我们可以使用一个方向代理&#…