【appium】Hybrid应用自动化|微信小程序自动化

news2025/4/23 16:59:17

目录

一、Hybrid(native+webview)应用自动化

1、webview

2、Hybrid应用自动化实现

2.1准备工作

Step1:准备android 4.4+版本以上的手机/模拟器

Step2:在app源码中将webview调试模式打开

Step3:安装UC开发者工具 UC-devtools 识别webview版本 识别web页面元素

Step4:

2.2 脚本编写

Step1:获取所有的contexts:

Step2:切换到webview context——driver.context(webview context)

Step3:定位webview中的元素,并执行操作:web网页元素定位和操作。

Step4:切换回默认的context:

3  其他操作

二、微信小程序自动化

step1:打开微信小程序webview调试开关(微信小程序页面的元素)

step2:UC开发者工具识别小程序的web元素信息—UCdevtools

step3:确认微信小程序对应的进程名

​编辑step4:X5内核启动参数配置

step5:编写脚本


一、Hybrid(native+webview)应用自动化

1、webview

Android系统的控件,android是google开发的 用来展示web页面 在系统中作为单独的系统应用存在(特殊)

2、Hybrid应用自动化实现

基于UIAutomator+ChromeDriver 、native元生部分走UIAutomator,web部分走Chromedriver,两者结合混搭,从而实现Hybrid自动化

 

2.1准备工作

  1. Step1:准备android 4.4+版本以上的手机/模拟器
  2. Step2:在app源码中将webview调试模式打开
    ——webview.setWebContentsDebuggingEnabled(true);
  3. Step3:安装UC开发者工具 UC-devtools 识别webview版本 识别web页面元素
  4. Step4:
    • 下载UC-devtools中webview对应匹配的chromedriver chromeDriver下载地址:CNPM Binaries Mirroricon-default.png?t=N7T8https://npm.taobao.org/mirrors/chromedriver/

      CNPM Binaries Mirroricon-default.png?t=N7T8https://registry.npmmirror.com/binary.html?path=chromedriver/

    • 替换Appium自带的chromeDriver:

      • WINDOWS:Appium.exe所在路径\resources\app\node_modules\appium\node_modules\appiumchromedriver\chromedriver\win

      • MAC:/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-chromedriver/chromedriver/mac

2.2 脚本编写

  1. Step1:获取所有的contexts:
    Set<String> contextHandles = driver.getContextHandles();
    System.out.println(contextHandles);//NATIVE_APP、WEBVIEW_com.lemon.lemonban
    //NATIVE_APP,表示原生app
    //WEBVIEW_com.lemon.lemonban,表示WEBVIEW控件
  2. Step2:切换到webview context——driver.context(webview context)

    当driver切换context ,底层存在把AndroidDriver转换成WebDriver, 他们都是remoteWebDriver的子类, 接下来的操作都是web操作

    //知道WEBVIEW控件名字的前提下,可以这样切换:
    driver.context("WEBVIEW_com.XXXX");
    //一般情况下一个页面嵌入一个webview网页,如果嵌了多个webview网页,只能通过不同的名字
    //如果一个页面只嵌入了一个webview网页  可以用遍历的形式 只要包含webview 就切换到想要的webview
    //这种情况不需要查询
    for(String contextHandle:contextHandles){
        if(contextHandle.contains("WEBVIEW")){
            driver.context("WEBVIEW_com.XXX");
        }
    }
  3. Step3:定位webview中的元素,并执行操作:web网页元素定位和操作。
  4. Step4:切换回默认的context:

    当driver切回到 NATIVE_APP,WebDriver -> AndroidDriver

    driver.context(native context)
    ​
    //切换回原生app
    //⚠️一般就像下面一样用NATIVE_APP,因为大家命名基本上都是这个
    driver.context("NATIVE_APP");

3  其他操作

比如,滑动

滑动可以退回到native用页面的滑动api——SlideUp(2)

也可以在退出之前在webview里面用web的js滑动

二、微信小程序自动化

由于腾讯系QQ、微信是基于腾讯自研X5内核,不是谷歌原生webview,所以调试会有些许差异(有很多 app厂商也开始采用X5内核) 微信小程序只能够支持手机,模拟器是不行的

微信小程序自动化 模拟器应用——显示系统进程——可以看到Android System Webview

step1:打开微信小程序webview调试开关(微信小程序页面的元素)

聊天窗口输入如下URL: http://debugmm.qq.com/?forcex5=true http://debugx5.qq.com

打开X5调试页面,勾选中【打开TBS内核Inspector调试功能】

相当于进行了【在app源码中将webview调试模式打开】

step2:UC开发者工具识别小程序的web元素信息—UCdevtools

step3:确认微信小程序对应的进程名

微信有很多的进程,微信和小程序的进程是分开的,我们要确定当前小程序是位于哪个进程中:(⚠️最好只开一个小程序,保证只有一个小程序进程)

adb shell dumpsys activity top |  grep/findstr ACTIVITY
​
找到ACTIVITY com.tencent.mm/.plugin.appbrand.ui.AppBrandUI 868fc95 pid=7989 的PID
​
adb shell ps PID

step4:X5内核启动参数配置

//不清除app数据  !!!!一定要加!!!!
capabilities.setCapability("noReset", true);

//支持X5内核应用自动化配置
//支持小程序自动化测试
capabilities.setCapability("recreateChromeDriverSessions", true);

//ChromeOptions使用来定制启动选项,因为在appium中切换context识别webview的时候,
//把com.tencent.mm:appbrand0的webview识别成com.tencent.mm的webview. 所以为了避免这个问题,加上androidProcess: com.tencent.mm:appbrand0
ChromeOptions options = new ChromeOptions();
//设置小程序进程
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
//初始化会默认将chrome浏览器打开,需要将Browser置为空
capabilities.setBrowserName("");
//每次启动时覆盖session,否则第二次后运行会报错不能新建session
//capabilities.setCapability("sessionOverride", true);

step5:编写脚本

注意:小程序X5内核(webview)版本和chromeDriver版本匹配的时候不能按照常规的chromeDriver版本对照,使用V2.40 chromeDriver

//微信向下滑动,找到小程序
SlideDown(2);

//小程序本质上也是web页面 所以我们也需要切换webview 获取context
System.out.println(driver.getContextHandles());

//切换小程序webview(X5内核)
//driver.context("WEBVIEW_com.tencent.mm:appbrand0");
//driver.context("WEBVIEW_com.tencent.mm:toolsmp");

//进入到web模式,定位小程序页面的元素

//driver.findElementByXPath("//a[contains(text(),'课程')]").click();

//直接定位报错:NoSuchElementException --->因为小程序打开之后会有三个web窗口
//System.out.println(driver.getWindowHandles());显示有三个window句柄

//需要找到正确的web窗口--- 需要切换句柄

//这个API是用来获取所有的窗口句柄
Set<String> windowHandles = driver.getWindowHandles();
for (String windowHandle : windowHandles) {
     System.out.println(driver.getCurrentUrl());
     //通过窗口的标题来判断
     if(driver.getTitle().equals("XXX")) {
     //如果是所需页面的title,不再切换,并且退出
         break;
       }else {
              //继续来切换句柄
              driver.switchTo().window(windowHandle);
            }
       }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sui主网升级至V1.19.1版本

其他升级要点如下所示&#xff1a; #16190, #16193 现在CLI正确处理并修复了交易没有输入或命令时的输出表格。例如&#xff0c;调用 client call — package 0x2 — module kiosk — function default 现在具有正确格式的输出。 #15928 Move编译器的一系列变更 添加了宏函…

Redis持久化的两种方式RDB和AOF详解

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 以下内容为学习 Redis 过程中的笔记 文章目录 Redis持久化RDB&#xff08; Redis DataBase &#xff09;触发机制&#xff1a;如何恢复rbd文件&#xff1a;优点&#xff1a;缺点&#xff1a; AOF &…

搬家了,发现虚拟机链接不上,查找原因,解决了

是网络配置的问题&#xff0c;因为ip地址变动&#xff0c;所以配置文件要进行改动 1.通过cmd查看本地主机ip地址 2.在虚拟网络编辑器中选在vmnet8&#xff0c;用管理员权限修改ip&#xff0c;网关&#xff0c;子网掩码&#xff0c;和物理主机对应 3.在/etc/sysconfig/network…

同局域网共享虚拟机(VMware)

一、前言 首先我们先来了解下 VMware 的三种网络模式桥接模式、NAT模式、仅主机模式&#xff0c;网络类型介绍详情可以参考下我之前的文档 Linux系统虚拟机安装&#xff08;上&#xff09;第三章 - 第9步指定网络类型。了解三种网络模式的原理之后&#xff0c;再来剖析下需求&…

【力扣hot100】刷题笔记Day14

前言 又是新的一周&#xff0c;快乐的周一&#xff0c;快乐地刷题&#xff0c;今天把链表搞完再干活&#xff01; 114. 二叉树展开为链表 - 力扣&#xff08;LeetCode&#xff09; 前序遍历 class Solution:def flatten(self, root: Optional[TreeNode]) -> None:if not r…

clickhouse 随心所欲的聚合模型-AggregatingMergeTree

clickhouse 强大的 MergeTree 系列引擎令人信服&#xff0c;其 ReplacingMergeTree、SummingMergeTree 在数据唯一性和汇总场景中表现非凡。但你是否还有保留最小(大)、平均等预聚合需求&#xff0c;甚至在一个模型中既有唯一性语意也有汇总、最小、最大、平均值语意该如何处理…

【Simulink系列】——Simulink与Matlab接口使用命令行进行仿真

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、Simulink与Matlab接口 1、Matlab工作区变量设置模块参数 Matlab工作区的变量可以作为模块的设置参数 2、Matlab工作区变量作为输入信号 使用From Worksp…

深度学习--神经网络基础

神经网络 人工神经网络&#xff08; Artificial Neural Network &#xff0c; 简写为 ANN &#xff09;也简称为神经网络&#xff08; NN &#xff09;&#xff0c;是一种模仿生物神经网络结构和 功能的计算模型 。人脑可以看做是一个生物神经网络&#xff0c;由众多的 神经元…

FLStudio20.8编曲制作软件中文版下载及功能全面介绍

一、主要功能 FL Studio 20.8&#xff0c;作为一款深受音乐制作人和作曲家喜爱的软件&#xff0c;具备多种核心功能&#xff0c;满足从创作到完成的整个音乐制作流程。 音频录制与编辑&#xff1a;用户可以轻松录制外部音频&#xff0c;如乐器演奏、人声等&#xff0c;并在软…

【新书推荐】8.4 逻辑运算指令

本节内容&#xff1a;逻辑运算指令。8086 CPU逻辑运算指令包括NOT、AND、OR、XOR&#xff0c;除NOT指令外&#xff0c;均有两个操作数。逻辑运算指令影响状态标志位。 ■否操作指令NOT指令格式&#xff1a;NOT OPRD。将OPRD取反&#xff0c;然后送回OPRD。操作数可以是8位/16位…

UE5 UE4 不同关卡使用Sequence动画

参考自&#xff1a;关于Datasmith导入流程 | 虚幻引擎文档 (unrealengine.com) 关卡中的Sequence动画序列&#xff0c;包含特定关卡中的Actor的引用。 将同一个Sequcen动画资源放入其他关卡&#xff0c;Sequence无法在新关卡中找到相同的Actor&#xff0c;导致报错。 Sequen…

2024国际生物发酵展览会独家解读-力诺天晟科技

参展企业介绍 北京力诺天晟科技有限公司&#xff0c;专业致力于智能仪器仪表制造&#xff0c;工业自动控制系统用传感器、变送器的研发、设计、销售和服务。 公司坐落于首都北京行政副中心-通州区&#xff0c;下设生产子公司位于河北香河经济开发区&#xff0c;厂房面积 300…

Vue NextTick工作原理及使用场景

$nextTick的定义及理解&#xff1a; 定义&#xff1a;在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM。 所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操…

GitHub标星50k的Android全栈技术知识,成为一名合格Android架构师

JNI 简介 JNI &#xff08;Java Native Interface英文缩写&#xff09;&#xff0c;译为Java本地接口。是Java众多开发技术中的一门技术&#xff0c;意在利用本地代码&#xff0c;为Java程序提供更高效、更灵活的拓展。尽管Java一贯以其良好的跨平台性而著称&#xff0c;但真正…

js 面试运行机制和存储(从以下几方面理解),栈和堆的理解

1 工作原理 每个浏览器都有自己的引擎&#xff0c;通过引擎把代码解析运行起来。 2 生命周期 3-1 内存分配 3-2 内存使用 3-3 内存回收 3 栈和堆的理解 timer也是个函数--所以也是引用类型。 4 如何运行 以下可忽略 首先声明变量&#xff0c;放在左侧栈中执行&#xff0c;在执行…

FPGA-时钟管理单元

时钟管理单元(Clock Management Tile, CMT) : 即时钟管理片,是FPGA器件中一个十分重要的时钟资源。能够对内部和外部的时钟去偏斜、去抖动,同时还支持频率合成、分倍频等功能。 举例&#xff0c;下面这个例子数据从FIFO输出时钟频率为125MHZ&#xff0c;这个时钟频率可以通过…

Redis冲冲冲——Redis的主从复制,哨兵模式以及SpringBoot的配置

目录 引出Redis的主从复制&#xff0c;哨兵模式以及SpringBoot的配置Redis的主从复制Redis的哨兵模式SpringBoot配置 缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Redis冲冲冲——Redis的主从复制&#xff0c;哨兵模式以及SpringBoot的配置…

Taro React ---- 在函数组件或类组件中访问上下文(Context)中的值

1. 解决问题的场景 项目是开发好几年了&#xff0c;当时采用的是类组件开发。现在新增需求&#xff0c;新增需求使用的函数组件&#xff0c;组件涉及的层级比较多&#xff0c;如果直接组件传值&#xff0c;比较麻烦。但是单独为这次的需求新增 redux 的引入又觉得没必要。然后在…

优化照片分辨率:如何将照片调整为150dpi,以适应不同场景?

在数字化时代&#xff0c;我们经常需要在不同场景中使用照片&#xff0c;如打印、网页发布、社交媒体分享等。然而&#xff0c;不同场景对于照片的分辨率要求各不相同。有时&#xff0c;我们需要将照片的分辨率调整为特定数值&#xff0c;例如150dpi(每英寸点数)。这样做可以确…

flutter面试题及答案,android面试题最新

前言 今天想停下代码&#xff0c;写点脑袋里不断浮现出来的一些看法。 也就是最近在微博和知乎上老看到“互联网寒冬”的说法。要么是看到啥公司薪水无法如期发放了&#xff0c;要么是看到别人说什么“裁员了&#xff0c;没有交接&#xff0c;签字然后电脑还了就走人&#xf…