appium+java(四)微信公众号自动化测试实践
前言
随着手机阅读的普遍应用,微信公众号阅读,更为普遍,微信和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(四)微信公众号自动化测试实践的更多相关文章
- Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理
在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...
- 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)
微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...
- Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token
获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...
- Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装
在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...
- Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...
- Java开发微信公众号(一)---初识微信公众号以及环境搭建
ps:1.开发语言使用Java springMvc+Mybaits+spring maven实现 2.使用微信接口测试账号进行本地测试 https://mp.weixin.qq.com/debug/c ...
- 使用Appium进行微信公众号自动化测试
查看Android的webview视图版本:手机链接电脑后在电脑Chrome打开页面chrome://inspect/#devices查看Android的Chrome内核版本 下载与该版本相对 ...
- 用java开发微信公众号:公众号接入和access_token管理(二)
本文为原创,原始地址为http://www.cnblogs.com/fengzheng/p/5027630.html 上一篇说了微信开发的准备工作,准备工作完成之后,就要开始步入正题了.其实微信公众号 ...
- java开发微信公众号----开发者基本配置的
首先附上微信公众平台开发技术文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5 本文主要描 ...
随机推荐
- Web服务调试可用,发布之后访问出错
今天重装了系统,然后发现之前的Web服务DataService不能用了.将其设置为启动项,运行的结果是 跟踪发现,是mysql.data.dll的版本不对.所以要找到所有版本不对的该dll,将其替换成 ...
- 无法推动项目起步?Let's try McDonald’s Theory
McDonald’s Theory I use a trick with co-workers when we’re trying to decide where to eat for lunch a ...
- Kudu系列: Kudu主键选择策略
每个Kudu 表必须设置Pimary Key(unique), 另外Kudu表不能设置secondary index, 经过实际性能测试, 本文给出了选择Kudu主键的几个策略, 测试结果纠正了我之前 ...
- /*+ hint*/用法,该如何解决
/*+ use_hash(b, a)*/用法SELECT /*+ use_hash(b, a)*/ 1, NVL(b.AgentWorkGroup, ' '), ................ ...
- 2017CCPC秦皇岛 A题Balloon Robot&&ZOJ3981【模拟】
题意: 一个机器人在长为M的圆形轨道上送气球,当机器人到达M号点的时候下一站会回到1号点,且全程不会停止运动.现在在长为M的轨道上有N个队伍,队伍会在某个时间做需要一个气球,机器人需要送过去.一共有P ...
- Chain训练准则的计算
轮迭代时验证集的日志: log/compute_prob_valid.1000.log: LOG (nnet3-chain-compute-prob[5.5.100-d66be]:PrintTotal ...
- MGR架构~高可用架构细节的梳理
一 简介:今天咱们来聊聊mgr的细节原理相关 二 选择新主机制 1 当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值 ...
- Hibernate_day04
Hibernate_day04 上节内容 1 表与表之间关系回顾 (1)一对多(客户和联系人) (2)多对多(用户和角色) 2 hibernate一对多操作 (1)一对多映射配置 (2)一对多级联保存 ...
- Javascript - ExtJs - Ext.form.Panel组件
FormPanel组件(Ext.form.FormPanel) logogram:Ext.form.Panel | xtype:form Ext.form.Panel.配置 frame }//旗下所有 ...
- 2017 ACM/ICPC(北京)总结
这个季节的,北京真的很冷. 下午的热身赛,我依然先去敲一道搜索题,但是很不幸这道搜索题坑点还是蛮多的,浪费了好长时间后依然没能A掉,期间Codeblocks崩溃一次使得代码完全丢失,在队友的建议下便暂 ...