你在和脚本谈恋爱(自动化在IM聊天中的应用)
谢谢打开这篇文章的每个你
在网络世界里你不知道对面和你聊天的是人是鬼,是男是女,是胖是瘦,也许他们只是一堆脚本。
本文将通过自动化的手段,模拟微信聊天,同时也给大家提供IM的UI自动化测试中,对于聊天应该如何处理的思路。
采用工具为appium服务端1.10.1,java-client版本6.1.0,实现思路如下
1. 使用appium脚本+testng配置文件同时驱动两台手机设备,启动两个服务端
testng配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="tests" thread-count="2">
<test name="127.0.0.1:62001">
<parameter name="udid" value="127.0.0.1:62001"/>
<parameter name="port" value="4490"/>
<parameter name="sysPort" value="8201"/>
<classes>
<class name="com.testfan.testcases.WXChat"/>
</classes>
</test>
<test name="TUP4C19104003285">
<parameter name="udid" value="TUP4C19104003285"/>
<parameter name="port" value="4491"/>
<parameter name="sysPort" value="8202"/>
<classes>
<class name="com.testfan.testcases.WXChat"/>
</classes>
</test>
</suite>
2. 脚本中对微信聊天进行定位及操作,并且完成互相轮流发送信息的代码
以下是脚本实现:
package com.testfan.testcases;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.android.nativekey.AndroidKey;
import io.appium.java_client.android.nativekey.KeyEvent;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.AutomationName;
import io.appium.java_client.remote.MobileCapabilityType;
public class WXChat {
AndroidDriver<AndroidElement> driver;
static String switchFlag="";//两个手机上的账户切换变量
HashMap<String, String> AChatContents=new HashMap<>();//A设备的聊天字典
HashMap<String, String> BChatContents=new HashMap<>();//B设备的聊天字典
@Parameters({"udid","port","sysPort"})
@BeforeClass
public void initDriver(String udid,String port,String sysPort) throws Exception{
AChatContents.put("你好", "你是机器人吗");
AChatContents.put("我不是机器人", "终于碰到个真人了");
AChatContents.put("那你是机器人吗", "我是啊");
BChatContents.put("你好", "你好");
BChatContents.put("你是机器人吗", "我不是机器人");
BChatContents.put("终于碰到个真人了", "那你是机器人吗");
BChatContents.put("我是啊", "我去,机器人都疯了,88");
//driver初始化
DesiredCapabilities caps = new DesiredCapabilities();
// deviceName表示要执行的测试设备名字,这个参数在安卓上可以随便写
caps.setCapability(MobileCapabilityType.DEVICE_NAME, "xxxxxx");
// driver的session超时时间,默认是60秒
caps.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 600);
// automationName表示appium使用的测试引擎,默认是Appium,其实就是uiautomator
caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);
//安卓多设备时并且使用uiautomator2引擎时,需要指定不同systemport
caps.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, Integer.valueOf(sysPort));
// unicodeKeyboard设置为true表示我们要使用appium自带的输入法,用来支持中文和隐藏键盘,并且将其设置为默认输入法
caps.setCapability(AndroidMobileCapabilityType.UNICODE_KEYBOARD, true);
// 在执行测试完成之后,将手机的输入法从appium自带的还原成我手机默认的输入法
caps.setCapability(AndroidMobileCapabilityType.RESET_KEYBOARD, true);
//表示不重签名app在设置为true的情况下
caps.setCapability(AndroidMobileCapabilityType.NO_SIGN, true);
//udid表示指定某台设备
caps.setCapability(MobileCapabilityType.UDID, udid);
//appPackage和appActivity表示你要启动的应用的包名和起始activity,这里是微信
caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.tencent.mm");
caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "com.tencent.mm.ui.LauncherUI");
//不重置应用数据
caps.setCapability(MobileCapabilityType.NO_RESET, true);
driver=new AndroidDriver<>(new URL("http://127.0.0.1:"+port+"/wd/hub"), caps);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
/**
* 交互聊天思路
* 1. A、B两台设备,udid分别为A:127.0.0.1:62001,B:TUP4C19104003285
* 2. beforeclass中对AChatContents、BChatContents进行了初始化,分别代表A和B对话的信息数据Map对象
* 3. 对话中A先发送信息,再轮B,使用switchFlag变量来切换两个手机交替发送信息
* 4. 每次拿到对方发送的信息就去对话的信息数据Map里找对应的信息进行回复
* 5. 本实例并没有做断言
* @throws Exception
*/
@Test
public void chat() throws Exception{
//因为我们两台手机上的微信版本不一样,所以有的元素的定位不一样,因此我们在这里进行区分
if(driver.getCapabilities().getCapability("udid").equals("127.0.0.1:62001")){
driver.findElement(By.xpath("//*[@text='大雄']")).click();
//这个作为A先发送消息
driver.findElement(By.className("android.widget.EditText")).sendKeys("你好");
driver.findElement(By.xpath("//*[@text='发送']")).click();
driver.pressKey(new KeyEvent(AndroidKey.BACK));//模拟安卓的返回
switchFlag="TUP4C19104003285";//输入完成以后讲切换变量设置为对方,意思是该对方输入了
//使用字典库的数量作为循环变量
int i=AChatContents.size();
while(i>0){
if(switchFlag.equals("127.0.0.1:62001")){
//先获取聊天的最后内容,因为聊天窗口中聊天内容无法获取,因此我们在聊天信息页获取和对方聊天的最后一条内容
String curContent=driver.findElement(By.xpath("//*[@text='大雄']/../../following-sibling::*[1]/*[1]/*[1]")).getText();
driver.findElement(By.xpath("//*[@text='大雄']")).click();
//根据对方回复的内容,我们去信息Map对象中去找对应的信息进行输入
driver.findElement(By.className("android.widget.EditText")).sendKeys(AChatContents.get(curContent));
driver.findElement(By.xpath("//*[@text='发送']")).click();
driver.pressKey(new KeyEvent(AndroidKey.BACK));//模拟安卓的返回
switchFlag="TUP4C19104003285";//输入完成以后讲切换变量设置为对方,意思是该你输入了
i--;
}else{
Thread.sleep(2000);
}
}
}else{
//使用字典库的数量作为循环变量
int i=BChatContents.size();
while(i>0){
if(switchFlag.equals("TUP4C19104003285")){
//先获取聊天的最后内容,因为聊天窗口中聊天内容无法获取,因此我们在聊天信息页获取和对方聊天的最后一条内容,采用xpath定位
String curContent=driver.findElement(By.xpath("//*[@text='七七']/../../following-sibling::*[1]/*[1]/*[1]")).getText();
driver.findElement(By.xpath("//*[@text='七七']")).click();
//根据对方回复的内容,我们去信息Map对象中去找对应的信息进行输入
driver.findElement(By.className("android.widget.EditText")).sendKeys(BChatContents.get(curContent));
driver.findElement(By.xpath("//*[@text='发送']")).click();
driver.pressKey(new KeyEvent(AndroidKey.BACK));//模拟安卓的返回
switchFlag="127.0.0.1:62001";//输入完成以后讲切换变量设置为对方,意思是该你输入了
i--;
}else{
Thread.sleep(2000);
}
}
}
}
@AfterClass
public void quit(){
driver.quit();
}
}
3. 执行testng的配置文件,最后结果如下:
说在最后,自动化不仅可以用来测试,还可以用来自动化运营,比如自动发朋友圈、自动评论、点赞等等
作 者:Testfan 陌豆
出 处:微信公众号:自动化软件测试平台
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出文章链接
你在和脚本谈恋爱(自动化在IM聊天中的应用)的更多相关文章
- Python测试开发-浅谈如何自动化生成测试脚本
Python测试开发-浅谈如何自动化生成测试脚本 原创: fin 测试开发社区 前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...
- 通过shell脚本实现代码自动化部署
通过shell脚本实现代码自动化部署 一.传统部署方式及优缺点 1.传统部署方式 (1)纯手工scp (2)纯手工登录git pull.svn update (3)纯手工xftp往上拉 (4)开发给打 ...
- 基于脚本的modelsim自动化仿真笔记
这里记录一下基于脚本的modelsim自动化仿真的一些知识和模板,以后忘记了可以到这里查找.转载请标明出处:http://www.cnblogs.com/IClearner/ . 一.基本介绍 这里介 ...
- 持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本
持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...
- CC2 条理分明-----AACTP教你谈恋爱
AACTP是一个神奇的地方,这里可以培养你的自信,培养你的沟通表达能力,培养你的领导管理能力:但是你不知道的是AACTP还可以培养你恋爱的本领.想知道是怎么回事吗?听我给你慢慢说来.我把恋爱分为三 ...
- jenkins结合脚本实现代码自动化部署及一键回滚至上一版本
持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...
- 【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- 服务器启动之后运行脚本在/etc/rc.d/rc.local中配置
服务器启动之后运行脚本在/etc/rc.d/rc.local中配置 # ! /bin/sh # 启动svn /usr/bin/svnserve -d -r /var/svnroot/
随机推荐
- 重置csr
重置csr 注意:下面操作仅在刚安装k8s后24小时内有效 分析:kubelet启动后会生成如下文件.kubelet.conf文件决定了csr的存在,如果要想重新获取csr,可以停掉kubelet,删 ...
- JS事件中级 --- 拖拽
http://bbs.zhinengshe.com/thread-1200-1-1.html 要求:实现div块的拖拽 原理:拖拽过程中鼠标点和div块的相对位置保持不变. 需要理解三点: 1. 为什 ...
- 分片式图片服务器fastDFS安装过程
1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制, 充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, ...
- 【机器学习】梯度、Hessian矩阵、平面方程的法线以及函数导数的含义
想必单独论及" 梯度.Hessian矩阵.平面方程的法线以及函数导数"等四个基本概念的时候,绝大部分人都能够很容易地谈个一二三,基本没有问题. 其实在应用的时候,这几个概念经常被混 ...
- 1 基于梯度的攻击——FGSM
FGSM原论文地址:https://arxiv.org/abs/1412.6572 1.FGSM的原理 FGSM的全称是Fast Gradient Sign Method(快速梯度下降法),在白盒环境 ...
- Android selector一些坑
最近给textview添加seletor时,发现textcolor和background要分开成两个selector.并且,textcolor的要再res路径下建color路径,然后在color下面建 ...
- C语言 俄罗斯方块的实现1 全局变量
目录 全局变量 程序的模块化之MVC 关于俄罗斯方块的代码实现要点 使用数组表示背景和方块 方块表示及其初始化 要让游戏动起来 方块自动下落 全局变量 简而言之,定义在函数外的变量,就是全局变量. 所 ...
- sql server2012中使用convert来取得datetime数据类型样式(全)
一.日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/*时间一般为getdate()函数或数据表里的字段*/ CONV ...
- MyBatis 安装和配置
在这里我们使用 MyBatis 开发一个简单的 Java 项目(默认你已安装JDK和MySQL及会使用Maven的基本操作),可以与上一篇通过底层操作数据进行比较 1.新建表 students,插入数 ...
- 小记---------spark优化之更优分配资源
spark优化:在一定范围之内,增加资源与性能的提升是成正比的. 因此, 一个cpu core 执行一个task线程. task数: 若有 cpu core 2个.num-execu ...