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

测开之分层自动化(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  陌豆

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

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

你在和脚本谈恋爱(自动化在IM聊天中的应用)的更多相关文章

  1. Python测试开发-浅谈如何自动化生成测试脚本

    Python测试开发-浅谈如何自动化生成测试脚本 原创: fin  测试开发社区  前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...

  2. 通过shell脚本实现代码自动化部署

    通过shell脚本实现代码自动化部署 一.传统部署方式及优缺点 1.传统部署方式 (1)纯手工scp (2)纯手工登录git pull.svn update (3)纯手工xftp往上拉 (4)开发给打 ...

  3. 基于脚本的modelsim自动化仿真笔记

    这里记录一下基于脚本的modelsim自动化仿真的一些知识和模板,以后忘记了可以到这里查找.转载请标明出处:http://www.cnblogs.com/IClearner/ . 一.基本介绍 这里介 ...

  4. 持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本

    持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...

  5. CC2 条理分明-----AACTP教你谈恋爱

      AACTP是一个神奇的地方,这里可以培养你的自信,培养你的沟通表达能力,培养你的领导管理能力:但是你不知道的是AACTP还可以培养你恋爱的本领.想知道是怎么回事吗?听我给你慢慢说来.我把恋爱分为三 ...

  6. jenkins结合脚本实现代码自动化部署及一键回滚至上一版本

    持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...

  7. 【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  8. 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

    [COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...

  9. 服务器启动之后运行脚本在/etc/rc.d/rc.local中配置

    服务器启动之后运行脚本在/etc/rc.d/rc.local中配置 # ! /bin/sh # 启动svn /usr/bin/svnserve -d -r /var/svnroot/

随机推荐

  1. Django FBV CBV以及使用django提供的API接口

    FBV 和 CBV 使用哪一种方式都可以,根据自己的情况进行选择 看看FBV的代码 URL的写法: from django.conf.urls import url from api import v ...

  2. SPSS学习笔记之——Kaplan-Meier生存分析

    SPSS学习笔记之--Kaplan-Meier生存分析 一.概述 关于生存分析的相关概念,Kaplan-Meier用于估计生存函数,允许有一个分组变量进行生存率的组间比较,还容许一个分层变量.若不考虑 ...

  3. C基础知识(8):结构体、共用体、位域

    结构体 数组允许定义可存储相同类型数据项的变量,而结构体是C编程中另一种用户自定义的可用的数据类型,它允许用户可以存储不同类型的数据项. struct 语句的格式如下: struct [structu ...

  4. Unity中的动画系统和Timeline(2) 按钮动画和2D精灵动画

    按钮动画 1 创建按钮后,按钮的Button组件中,Transition我们平时用的时Tint,这次选择Animation 选择Auto Generate Animation,创建一个按钮动画 2 后 ...

  5. 【DSP开发】mailbox的使用

    在DSP项目开发中,我用mailbox实现了进程间的通信,通过接收网络控制进程发来的mailbox,实现了云台的控制,其中需要学习的地方有两点:一是mailbox通信机制的学习,二是DSP时间管理机制 ...

  6. VS附加到进程调试

    WIN+R 进入cmd命令  输入 netstat -ano | find "进程端口"      找端口 打开vs alt+d+p选择上图对应的进程

  7. git与码云关联教程

    注:我用的这种方法是利用“公钥”使本地仓库与码云建立起联系,从而不需要用户名与密码的方法. 1.首先,创建好码云,再在码云上创建好个人仓库,然后复制好仓库地址,这里的地址是指“SSH”类型的. 2.下 ...

  8. 【坑】不要使用各种框架提供的内部List

    为了代码简洁有时我们会使用一些框架提供的工具类.如 import org.apache.commons.collections.ListUtils; package java.util.Collect ...

  9. 【Python】【demo实验1】【Python运行时强制刷新缓冲区,输出信息】(Python3 应不存在类似情况)

    [原文] 需求:打印一颗 ”*” 休息1s 代码如下: #!/usr/bin/python #coding=utf-8 ''' 暂停1s输出 ''' import time def printStar ...

  10. .Net Core 3.0使用Grpc进行远程过程调用

    因为.Net Core3.0已经把Grpc作为一等臣民了,作为爱好新技术的我,当然要尝鲜体验一下了,当然感觉是Grpc作为跨语言的产品做的相当好喽,比起Dubbo这种的,优势和劣势还是比较明显的. 我 ...