你在和腳本談戀愛(ài)(自動(dòng)化在IM聊天中的應(yīng)用)

謝謝打開(kāi)這篇文章的每個(gè)你

測(cè)開(kāi)之分層自動(dòng)化(Python)招生簡(jiǎn)章

Python自動(dòng)化測(cè)試報(bào)告美化

在python中進(jìn)行數(shù)據(jù)驅(qū)動(dòng)測(cè)試

太囂張了!他竟用Python繞過(guò)了“驗(yàn)證碼”

在網(wǎng)絡(luò)世界里你不知道對(duì)面和你聊天的是人是鬼,是男是女,是胖是瘦,也許他們只是一堆腳本。

本文將通過(guò)自動(dòng)化的手段,模擬微信聊天,同時(shí)也給大家提供IM的UI自動(dòng)化測(cè)試中,對(duì)于聊天應(yīng)該如何處理的思路。

采用工具為appium服務(wù)端1.10.1,java-client版本6.1.0,實(shí)現(xiàn)思路如下

1. 使用appium腳本+testng配置文件同時(shí)驅(qū)動(dòng)兩臺(tái)手機(jī)設(shè)備,啟動(dòng)兩個(gè)服務(wù)端

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. 腳本中對(duì)微信聊天進(jìn)行定位及操作,并且完成互相輪流發(fā)送信息的代碼

以下是腳本實(shí)現(xiàn):

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="";//兩個(gè)手機(jī)上的賬戶切換變量

HashMap<String, String> AChatContents=new HashMap<>();//A設(shè)備的聊天字典

HashMap<String, String> BChatContents=new HashMap<>();//B設(shè)備的聊天字典

@Parameters({"udid","port","sysPort"})

@BeforeClass

public void initDriver(String udid,String port,String sysPort) throws Exception{

AChatContents.put("你好", "你是機(jī)器人嗎");

AChatContents.put("我不是機(jī)器人", "終于碰到個(gè)真人了");

AChatContents.put("那你是機(jī)器人嗎", "我是啊");

BChatContents.put("你好", "你好");

BChatContents.put("你是機(jī)器人嗎", "我不是機(jī)器人");

BChatContents.put("終于碰到個(gè)真人了", "那你是機(jī)器人嗎");

BChatContents.put("我是啊", "我去,機(jī)器人都瘋了,88");

//driver初始化

DesiredCapabilities caps = new DesiredCapabilities();

// deviceName表示要執(zhí)行的測(cè)試設(shè)備名字,這個(gè)參數(shù)在安卓上可以隨便寫(xiě)

caps.setCapability(MobileCapabilityType.DEVICE_NAME, "xxxxxx");

// driver的session超時(shí)時(shí)間,默認(rèn)是60秒

caps.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 600);

// automationName表示appium使用的測(cè)試引擎,默認(rèn)是Appium,其實(shí)就是uiautomator

caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);

//安卓多設(shè)備時(shí)并且使用uiautomator2引擎時(shí),需要指定不同systemport

caps.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, Integer.valueOf(sysPort));

// unicodeKeyboard設(shè)置為true表示我們要使用appium自帶的輸入法,用來(lái)支持中文和隱藏鍵盤(pán),并且將其設(shè)置為默認(rèn)輸入法

caps.setCapability(AndroidMobileCapabilityType.UNICODE_KEYBOARD, true);

// 在執(zhí)行測(cè)試完成之后,將手機(jī)的輸入法從appium自帶的還原成我手機(jī)默認(rèn)的輸入法

caps.setCapability(AndroidMobileCapabilityType.RESET_KEYBOARD, true);

//表示不重簽名app在設(shè)置為true的情況下

caps.setCapability(AndroidMobileCapabilityType.NO_SIGN, true);

//udid表示指定某臺(tái)設(shè)備

caps.setCapability(MobileCapabilityType.UDID, udid);

//appPackage和appActivity表示你要啟動(dòng)的應(yīng)用的包名和起始activity,這里是微信

caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.tencent.mm");

caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "com.tencent.mm.ui.LauncherUI");

//不重置應(yīng)用數(shù)據(jù)

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兩臺(tái)設(shè)備,udid分別為A:127.0.0.1:62001,B:TUP4C19104003285

* 2. beforeclass中對(duì)AChatContents、BChatContents進(jìn)行了初始化,分別代表A和B對(duì)話的信息數(shù)據(jù)Map對(duì)象

* 3. 對(duì)話中A先發(fā)送信息,再輪B,使用switchFlag變量來(lái)切換兩個(gè)手機(jī)交替發(fā)送信息

* 4. 每次拿到對(duì)方發(fā)送的信息就去對(duì)話的信息數(shù)據(jù)Map里找對(duì)應(yīng)的信息進(jìn)行回復(fù)

* 5. 本實(shí)例并沒(méi)有做斷言

* @throws Exception

*/

@Test

public void chat() throws Exception{

//因?yàn)槲覀儍膳_(tái)手機(jī)上的微信版本不一樣,所以有的元素的定位不一樣,因此我們?cè)谶@里進(jìn)行區(qū)分

if(driver.getCapabilities().getCapability("udid").equals("127.0.0.1:62001")){

driver.findElement(By.xpath("http://*[@text='大雄']")).click();

//這個(gè)作為A先發(fā)送消息

driver.findElement(By.className("android.widget.EditText")).sendKeys("你好");

driver.findElement(By.xpath("http://*[@text='發(fā)送']")).click();

driver.pressKey(new KeyEvent(AndroidKey.BACK));//模擬安卓的返回

switchFlag="TUP4C19104003285";//輸入完成以后講切換變量設(shè)置為對(duì)方,意思是該對(duì)方輸入了

//使用字典庫(kù)的數(shù)量作為循環(huán)變量

int i=AChatContents.size();

while(i>0){

if(switchFlag.equals("127.0.0.1:62001")){

//先獲取聊天的最后內(nèi)容,因?yàn)榱奶齑翱谥辛奶靸?nèi)容無(wú)法獲取,因此我們?cè)诹奶煨畔㈨?yè)獲取和對(duì)方聊天的最后一條內(nèi)容

String curContent=driver.findElement(By.xpath("http://*[@text='大雄']/../../following-sibling::*[1]/*[1]/*[1]")).getText();

driver.findElement(By.xpath("http://*[@text='大雄']")).click();

//根據(jù)對(duì)方回復(fù)的內(nèi)容,我們?nèi)バ畔ap對(duì)象中去找對(duì)應(yīng)的信息進(jìn)行輸入

driver.findElement(By.className("android.widget.EditText")).sendKeys(AChatContents.get(curContent));

driver.findElement(By.xpath("http://*[@text='發(fā)送']")).click();

driver.pressKey(new KeyEvent(AndroidKey.BACK));//模擬安卓的返回

switchFlag="TUP4C19104003285";//輸入完成以后講切換變量設(shè)置為對(duì)方,意思是該你輸入了

i--;

}else{

Thread.sleep(2000);

}

}

}else{

//使用字典庫(kù)的數(shù)量作為循環(huán)變量

int i=BChatContents.size();

while(i>0){

if(switchFlag.equals("TUP4C19104003285")){

//先獲取聊天的最后內(nèi)容,因?yàn)榱奶齑翱谥辛奶靸?nèi)容無(wú)法獲取,因此我們?cè)诹奶煨畔㈨?yè)獲取和對(duì)方聊天的最后一條內(nèi)容,采用xpath定位

String curContent=driver.findElement(By.xpath("http://*[@text='七七']/../../following-sibling::*[1]/*[1]/*[1]")).getText();

driver.findElement(By.xpath("http://*[@text='七七']")).click();

//根據(jù)對(duì)方回復(fù)的內(nèi)容,我們?nèi)バ畔ap對(duì)象中去找對(duì)應(yīng)的信息進(jìn)行輸入

driver.findElement(By.className("android.widget.EditText")).sendKeys(BChatContents.get(curContent));

driver.findElement(By.xpath("http://*[@text='發(fā)送']")).click();

driver.pressKey(new KeyEvent(AndroidKey.BACK));//模擬安卓的返回

switchFlag="127.0.0.1:62001";//輸入完成以后講切換變量設(shè)置為對(duì)方,意思是該你輸入了

i--;

}else{

Thread.sleep(2000);

}

}

}

}

@AfterClass

public void quit(){

driver.quit();

}

}

3.?執(zhí)行testng的配置文件,最后結(jié)果如下:

說(shuō)在最后,自動(dòng)化不僅可以用來(lái)測(cè)試,還可以用來(lái)自動(dòng)化運(yùn)營(yíng),比如自動(dòng)發(fā)朋友圈、自動(dòng)評(píng)論、點(diǎn)贊等等

作  者:Testfan??陌豆

出  處:微信公眾號(hào):自動(dòng)化軟件測(cè)試平臺(tái)

版權(quán)說(shuō)明:歡迎轉(zhuǎn)載,但必須注明出處,并在文章頁(yè)面明顯位置給出文章鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容