你在和脚本谈恋爱(自动化在IM聊天中的应用)

谢谢打开这篇文章的每个你

测开之分层自动化(Python)招生简章

Python自动化测试报告美化

在python中进行数据驱动测试

太嚣张了!他竟用Python绕过了“验证码”

在网络世界里你不知道对面和你聊天的是人是鬼,是男是女,是胖是瘦,也许他们只是一堆脚本。

本文将通过自动化的手段,模拟微信聊天,同时也给大家提供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  陌豆

出  处:微信公众号:自动化软件测试平台

版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出文章链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容