前言

随着手机阅读的普遍应用,微信公众号阅读,更为普遍,微信和qq一样,都是基于腾讯自研X5内核,不是google原生webview(其实就是进行了二次定制)。实质上也是混合应用的一种,现在很多app产品也开始流行采用X5内核作为其内嵌web浏览服务,所以掌握X5内核的混合应用自动化也是重中之重的一种技能

X5内核应用自动化方式和普通混合应用有非常多的差异,接下来以微信公众号举例介绍怎么来开展X5内核的自动化

准备工作

  1、java-client 3.4.16依赖包

  2、微信应用版本7.0.0

  3、手机端和PC端安装chrome浏览器(注意版本最好对应一致)

  4、android手机(7.0+版本)

  5、chromedriver 2.26

  6、appium-desktop V1.10.0

步骤

1、打开微信,在任意窗口输入:debugx5.qq.com

在打开的界面中选择信息->勾选是否打开TBS内核Inspector调试功能

2、手机通过usb连接到电脑,打开USB调试模式,通过adb devices命令检测到设备

3、在chrome浏览器里面输入chrome://inspect#devices

显示的webview版本是57.xxx,这里就是微信X5内核的版本,不是android System webview版本,同样也可以点击inspect查看页面元素:

可以看到当前就是一个html页面,我们可以采取常规web元素定位方式来定位元素

注意事项:

页面空白加载不出来,这是因为Google的inspect工具需要访问到墙外的网站,所以需要有FQ工具或者VPN方式;

4、默认appium-desktop安装之后里面自带的chromedriver不是2.26的,需要手动去官网

将其放到appium的chromedriver对应目录中,或工程目录

附chromedriver与chrome版本映射关系

chromedriver下载链接:
https://chromedriver.storage.googleapis.com/index.html

http://npm.taobao.org/mirrors/chromedriver/
根据映射关系,不同的chrome版本下载不同的chromedrive

5、如何查看公众号在微信中的运行进程
如何查看进程?
我们分别在打开微信不打开小程序和打开微信并打开小程序两种情况下查看当前活动的进程

通过以上可以看到,打开小程序后当前活动的进程号为7671,查看7671对应的进程是com.tencent.mm:toolsmp,因此toolsmp就是
ChromeOptions设置
上面我们查看到当前小程序的活动进程是com.tencent.mm:toolsmp,因此toolsmp就是ChromeOptions中的要设置的值
具体在初始化driver时要添加如下代码:

ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("androidProcess", "com.tencent.mm:toolsmp");
caps.setCapability(ChromeOptions.CAPABILITY, options);

测试代码

package com.rong.appium.demo;

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidKeyCode;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Set;
import java.util.concurrent.TimeUnit; /**
* 测试微信公众号菜单
*
* @author rongrong
*/
public class WeixinDemo2 { AndroidDriver<WebElement> driver; @BeforeClass(alwaysRun = true)
public void setUp() throws Exception {
// set up appium
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "WTK7N16C14006883");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("deviceName", "Android Emulator");
capabilities.setCapability("platformVersion", "7.0");
// 设置app的主包名和主类名(要启动应用包名和activity)
capabilities.setCapability("appPackage", "com.tencent.mm"); //app包名
capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI");
//要启动的Android Activity名
capabilities.setCapability("appActivity", ".ui.LauncherUI");
//不要在会话前重置应用状态
capabilities.setCapability("noReset", true);
//Android是否删除应用,IOS是否删除整个模拟器目录
capabilities.setCapability("fullReset", false);
capabilities.setCapability("sessionOverride", true);
//输入配置,是否启动Unicode输入法
capabilities.setCapability("unicodeKeyboard", true);
//结束后是否切换回默认输入法
capabilities.setCapability("resetKeyboard", true);
File chromedriver = new File("chromedriver.exe");
capabilities.setCapability(AndroidMobileCapabilityType.CHROMEDRIVER_EXECUTABLE, chromedriver.getAbsolutePath());
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("androidProcess", "com.tencent.mm:tools");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
} /**
* webview线程切换
*
* @throws Exception
*/
@Test
public void testEduConsult() {
//通讯录
driver.findElementByName("通讯录").click();
//公众号
driver.findElementByName("公众号").click();
//滚动到指定位置点击
driver.scrollTo("51CTO学院").click();
driver.findElementByName("热门课程").click();
pause(10);
Set<String> handles = driver.getContextHandles();
for (String handle : handles) {
System.out.println(handle);
}
//切换到webview的content
driver.context("WEBVIEW_com.tencent.mm:tools");
Set<String> windowHandles = driver.getWindowHandles();
for (String handle : windowHandles) {
driver.switchTo().window(handle);
if (driver.getPageSource().contains("5CTO学院微职位")) {
break;
}
}
//选择linux
driver.findElementByXPath("/html/body/div[2]/div[1]/div/div[9]/p/a").click();
pause(2);
driver.findElementByXPath("//div[@class='fr Ly']").click();
pause(2);
driver.switchTo().frame("doyoo_f_work");
//进入对话框咨询三次
driver.findElementById("message").click();
for (int i = 0; i < 3; i++) {
driver.findElementById("message").clear();
//输入咨询价格
driver.findElementById("message").sendKeys("how much?");
pause(2);
//点击发送
driver.findElementById("btnSendMsg").click();
}
for (int i = 0; i < 4; i++) {
driver.pressKeyCode(4);
pause(3);
}
} @AfterClass
public void afterTestStopDriver() {
driver.quit();
} /**
* 程序暂停几秒
*
* @param i
*/
public void pause(int i) {
try {
Thread.sleep(i * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

总结:

进入到公众号内,切换到小程序context后,还需要切换到当前的windowHandle,windowHandle切换成功,正确的webview页面自然就能找到
执行后查看获取到的页面源码,然后就可以愉快的玩耍了

运行效果

appium+java(四)微信公众号自动化测试实践的更多相关文章

  1. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  2. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  3. Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token

    获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...

  4. Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装

    在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...

  5. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  6. Java开发微信公众号(一)---初识微信公众号以及环境搭建

    ps:1.开发语言使用Java springMvc+Mybaits+spring maven实现 2.使用微信接口测试账号进行本地测试 https://mp.weixin.qq.com/debug/c ...

  7. 使用Appium进行微信公众号自动化测试

    查看Android的webview视图版本:手机链接电脑后在电脑Chrome打开页面chrome://inspect/#devices查看Android的Chrome内核版本     下载与该版本相对 ...

  8. 用java开发微信公众号:公众号接入和access_token管理(二)

    本文为原创,原始地址为http://www.cnblogs.com/fengzheng/p/5027630.html 上一篇说了微信开发的准备工作,准备工作完成之后,就要开始步入正题了.其实微信公众号 ...

  9. java开发微信公众号----开发者基本配置的

    首先附上微信公众平台开发技术文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5 本文主要描 ...

随机推荐

  1. ArcGis 拓扑检查——狭长角锐角代码C#

    中学的时候醉心于研究怎么“逃课”,大学的时候豁然开悟——最牛逼的逃课是准时准地儿去上每一课,却不知到老师讲的啥,“大隐隐于市”大概就是这境界吧. 用到才听说有“余弦定理”这么一个东西,遂感叹“白上了大 ...

  2. ETL脚本的版本管理方法和 SourceTree 使用

    =============================使用git管理Kettle 作业的一个注意=============================之前 ETL 作业是用 svn 管理的, ...

  3. Coding语言强弱类型且动静态类型简单解析。附图解

    话不多说,上图: (以下均以Java来说明) 对于语言的强弱类型: 1.强类型语言:通俗的点来讲,就是对于数据类型,如果开发者定义了一个int数据类型的变量,那么虚拟机就会特别坚定该变量为int,坚决 ...

  4. hackrf入门

    http://www.hackrf.net/hackrf%E4%B8%8Egnuradio%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/

  5. mysql查询表达式解析

    1.mysql> SHOW COLUMNS FROM users;+----------+----------------------+------+-----+---------+------ ...

  6. Coursera, Deep Learning 5, Sequence Models, week1 Recurrent Neural Networks

    有哪些sequence model Notation: RNN - Recurrent Neural Network 传统NN 在解决sequence input 时有什么问题? RNN就没有上面的问 ...

  7. 最小生成树入门(克鲁斯卡尔+普利姆 hdu1233)

    克鲁斯卡尔 #include <set> #include <map> #include <queue> #include <stack> #inclu ...

  8. 【Thymeleaf】Thymeleaf模板对没有结束符的HTML5标签解析出错的解决办法

    解决方案 spring: thymeleaf: mode: LEGACYHTML5 <dependency> <groupId>net.sourceforge.nekohtml ...

  9. WSGI、uwsgi和uWSGI

    一.WSGI WSGI ( Web Server Gateway Interface )是一个网络服务器和网络应用的通用接口的规范或者用于Python框架. 由于python开发人员在网络框架的选择限 ...

  10. DedeCMS找后台目录漏洞

    参考文章 https://xianzhi.aliyun.com/forum/topic/2064 近期,学习的先知社区<解决DEDECMS历史难题--找后台目录>的内容,记录一下. 利用限 ...