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

news/2024/7/20 1:04:30 标签: appium, 自动化, 小程序

目录

一、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.niftyadmin.cn/n/5395660.html

相关文章

【STM32】STM32学习笔记-读写备份寄存器和实时时钟(43)

00. 目录 文章目录 00. 目录01. BKP简介02. RTC简介03. BKP相关API3.1 BKP_ReadBackupRegister3.2 BKP_WriteBackupRegister3.3 PWR_BackupAccessCmd 04. RTC相关API4.1 RCC_LSEConfig4.2 RCC_GetFlagStatus4.3 RCC_RTCCLKConfig4.4 RCC_RTCCLKCmd4.5 RTC_WaitForSynchro4.6 RT…

Adobe Illustrator 2022 for Mac/Win:设计的新篇章

在数字艺术和设计领域&#xff0c;Adobe Illustrator一直以其强大的功能和高效的工具受到专业人士的青睐。随着2022年的到来&#xff0c;Adobe Illustrator 2022&#xff08;简称AI 2022&#xff09;的发布无疑为设计师们带来了新的希望和期待。 一、强大的新功能 AI 2022引入…

Kafka是如何保证消息不丢失

Apache Kafka通过多种机制来确保消息不丢失&#xff0c;包括数据复制&#xff08;Replication&#xff09;、持久化&#xff08;Persistence&#xff09;、确认机制&#xff08;Acknowledgments&#xff09;、幂等生产者&#xff08;Idempotent Producer&#xff09;、事务性发…

iOS 通过NSURLProtocol拦截WKWebView网络请求

以前NSURLProtocol可以直接拦截UIWebView&#xff0c;后面升级成WKWebView发现拦截不到了 有细心爱研究的老铁发现了 [WKBrowsingContextController registerSchemeForCustomProtocol:] 这个函数的存在 所以还是可以拦截的 直接上步骤 1.在控制器或者你喜欢的地方注册NSU…

设计模式-备忘录模式(C++)

备忘录模式&#xff08;Memento Pattern&#xff09;是一种设计模式&#xff0c;用于在不破坏对象封装的情况下&#xff0c;捕获和保存对象的内部状态&#xff0c;并在需要时恢复到之前的状态。下面是一个简单的 C 实现备忘录模式的示例&#xff1a; #include <iostream>…

在CentOS上使用Docker搭建Halo博客并实现远程访问的详细指南

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. Docker部署Halo1.1 检查Docker版本1.2 在Docker中部署Halo 二. Linux安装Cpol…

C语言——switch 语句的基本格式是什么?

一、问题 C语⾔中有两个构成选择结构的语句&#xff0c;即构成双分⽀的让if..else 语句和构成多分⽀的 switch..case 语句&#xff0c;switch 语句的基本格式是什么&#xff1f; 二、解答 switch (表达式) { case 常量表达式 1:语句1;break;case 常量表达式 n:语句n;break;de…

【Django】model模型—字段关联关系:多对多

多对多 例子&#xff1a;如果 Pizza 含有多种 Topping &#xff08;配料&#xff09; – 也就是一种 Topping 可能存在于多个 Pizza 中&#xff0c;并且每个 Pizza 含有多种 Topping。 from django.db import models# 配料 class Topping(models.Model):# ...passclass Pizza…