uiautomator中如何判断开关wifi开启和关闭是否正确

本文介绍了一种通过自动化测试连续打开和关闭WiFi开关的方法,并详细解释了如何利用奇偶数循环来判断WiFi开关的状态。

在我们测试压力中肯定有这么些用例,就是让你打开xxx开关,判断开关开启成功,该如何去判断呢!

我们就举wifi开关为例,这里不考虑wifi打开后连接wifi然后能上网一系列动作我们暂不考虑,只开了打开和关闭开关这个动作,打开时是否打开成功,关闭时是否关闭成功;

第一步,打开开关这个动作我相信每个人都会,但是我们要思考如何并且判断打开开关成功,自动化开发就难倒在如何去判断和定位问题,我们打开开关肉眼可以看出就可以看,但是代码怎么去判断,代码实现肯定是:打开-关闭-打开-再关闭-再打开····这样的循环操作,也就是说,我第1次是打开,那第2次是关闭,第3次是打开,第4次是关闭····这规律就出来了,奇数是打开的意思,偶数是关闭的意思;我们第1次(奇数)打开开关的时候,使用uiautomator view工具查看test内容显示是否是关闭,反之,偶数是关闭时判断test文本是否显示是打开。只要用奇偶数去判断test文本内容,我们就可以进行判断,

因为我是根据奇偶数去判断状态的方法,所以开始测试前要确保开关是保证关闭状态的,要是为打开状态,记录的结果肯定是错误,当然还有其他的办法,我这种办法属于简单粗暴,简单易懂。仅供参考;

直接上代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;

import android.R.string;

import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import dengshengyu.Util.FileUtil;

/*
 * 项目名称:PublicPressureScript
 * 类名称:WifiOnAndOff
 * 类描述:连续打开、关闭WiFi开关
 * 创建人:享有盛誉之名
 * 创建时间:2017年8月15日 上午14:28
 * 备注:wifi开关初始状态要默认关闭,终端为开机状态;
 * @版本v0.0.1
 * 
 * */
public class WifiOnAndOff extends UiAutomatorTestCase{
 
	
		public void testWifi() throws Exception {  
			
			int i=0;
			int count = 1 ;
			int count1 = 1 ;
			int count2 = 1 ;
			int count3 = 1 ;
		
			//home键返回主界面
	        getUiDevice().pressHome(); 
	        
	        // 进入设置菜单  
	        Runtime.getRuntime().exec("am start com.android.settings");   
	        sleep(3000);
	        
	        // 首次开关默认为关;循环点击开关50次
	        for(;i<50;i++){
//	        getUiDevice().click(574,306);
	        UiObject clickOnAndOff = new UiObject(new UiSelector().resourceId("com.android.settings:id/switchWidget"));
	        clickOnAndOff.click();
	        sleep(2000);

	        //判断开关是否正确;
	        UiObject onOff = new UiObject(new UiSelector().resourceId("com.android.settings:id/switchWidget"));//开关控件
	        Runtime.getRuntime().exec("mkdir sdcard/dengshengyu"); // 在手机创建文件夹
	        Runtime.getRuntime().exec("mkdir sdcard/dengshengyu/wifi"); // 在手机创建文件夹
	          if(i%2==0){//偶数是为开
	        	  if(onOff.getText().equals("开启")){//开启成功   
	        		  
					     FileUtil.out("/sdcard/dengshengyu/wifi/Wifi开启成功.txt", "开启正确次数:"+count+";");
	        		     System.out.println("KaiQiChengGong");
	        		     count=count+1;
	        		  
	        	  } else if(onOff.getText().equals("关闭")){//开启失败!
	        			  
						 FileUtil.out("/sdcard/dengshengyu/wifi/Wifi开启失败.txt", "开启失败次数:"+count1+";");
		        		 System.out.println("KaiQiShiBai");
		        		 count1=count1+1;
		        		   
	        		}
	        	  
	          }else //否则为奇数,也就是为关闭
	        	   
                   if(onOff.getText().equals("关闭")){//关闭成功
                	   
					  FileUtil.out("/sdcard/dengshengyu/wifi/Wifi关闭成功.txt", "关闭正确次数:"+count2+";");
	        		  System.out.println("GuanBiChengGong");
	        		  count2=count2+1;
	        		  
	        		  
	        	   } else if(onOff.getText().equals("开启")){//关闭失败
	        		  
					 FileUtil.out("/sdcard/dengshengyu/wifi/Wifi关闭失败.txt", "关闭失败次数:"+count3+";");
	        		 System.out.println("GuanBiShiBai");
	        		 count3=count3+1;
	        	     }
	        }//for
	        	  
	          
	        	 
	    }
	          
}


这里添加个附件知识:

UiObject clickOnAndOff = new UiObject(new UiSelector().resourceId("com.android.settings:id/switchWidget"));

这条控件名默认是第一个开关,从我手机截图中大家可以知道我的wifi开关就在当前界面,而且resourceId就只有一个,大家有没有想过,要是当前界面有很多开关,而且resourceId和className等名称都一样呢,大家怎么获取?请看我另篇文章有讲解;

---------------------------------完,不明白的给我留言·······················

文章作者:享有盛誉之名

import logging import os,time,subprocess import uiautomator2 as u2 #一个基于 ADB(Android Debug Bridge,安卓调试桥)的工具类,封装了近 50 个与安卓设备交互的核心功能,涵盖设备管理、文件传输、应用控制、系统信息查询、性能监控等场景 #定义 AdbDebug 类(继承自 object) class AdbDebug(object): #adb通用处理函数 # def adbCommon(self,target): # list = self.checkDevices() # count = len(list) # if target + 1 > count: # print "请确认连接手机数量,输入正确的序号,0为第一台,依此类推" # return # return list #静态方法,负责接收 ADB 命令字符串、执行命令、捕获输出结果并返回,比如将传入的 command(如 devices)拼接为 adb devices;通过 os.popen 执行命令并读取输出流 # 它不需要访问类的实例属性或方法,仅依赖传入的 command 参数,它可以直接通过类名调用(如 ClassName.call_adb(command)),而不需要先创建类的实例 @staticmethod def call_adb(command): result = '' command_text = "adb %s" % (command) results = os.popen(command_text, "r") while True: line = results.readline() if not line: break result += line results.close() return result def checkDevices(self): res = self.call_adb("devices") devices = res.partition('\n')[2].replace('\n', '').split('\tdevice') return [device for device in devices if len(device) > 2] #停止adb服务 def adbStop(self): return self.call_adb("kill-server") #开启adb服务 def adbStart(self): return self.call_adb("start-server") #查看adb版本 def adbVersion(self): return self.call_adb("version") # 查看当前系统连接wifi ssid 名称 def adbGetCurSSID(self): str = self.call_adb("shell dumpsys netstats | findstr iface=wlan.*networkId") return eval(str.split(" ")[5].split("=")[1])[0] def adbGetCurSSIDSAMSUNG(self): str = self.call_adb("shell dumpsys netstats | findstr iface=wlan.*wifiNetworkKey") while str=="": str = self.call_adb("shell dumpsys netstats | findstr iface=wlan.*wifiNetworkKey") time.sleep(1) ms = str.split(" ")[5].split("=")[1].split("wpa") logging.info(str.split(" ")[5].split("=")) # print(str.split(" ")[5].split("=")) return eval(str.split(" ")[5].split("=")[1].split("wpa")[0]) #开启adb网络调试接口(需连接USB线) def adbTcp(self, target): return self.call_adb("-s %s tcpip 5555"% (target)) #网络调试连接 def adbNetConOpen(self, target, address): return self.call_adb("-s %s connect %s" % (target, address)) #关闭网络调试连接 def adbNetConClose(self, target, address): return self.call_adb("-s %s disconnect %s" % (target, address)) # 将电脑文件拷贝到手机里面 # [电脑上的目录] < 设备里的文件路径 > def push(self, target, local, remote): result = self.call_adb("-s %s push %s %s" % (target, local, remote)) return result # 拉数据到本地 # < 设备里的文件路径 > [电脑上的目录] def pull(self, target, remote, local): result = self.call_adb("-s %s pull %s %s" % (target, remote, local)) return result #电脑端安装应用 # -l 将应用安装到保护目录 / mnt / asec # -r 允许覆盖安装 # -t 允许安装AndroidManifest.xml里application指定android:testOnly = "true"的应用 # -s 将应用安装到sdcard # -d 允许降级覆盖安装 # -g 授予所有运行时权限 def adbInstallApk(self, target, local): return self.call_adb("-s %s install %s"(target, local)) def adbInstallApk(self, var, local): return self.call_adb("install "+ var + local) #电脑端卸载应用 # < packname > 表示应用的包名,-k # 参数可选,表示卸载应用但保留数据缓存目录。 def adbUninstallApk(self, target, packName): return self.call_adb("-s %s uninstall %s" % (target, packName)) def adbUninstallApk(self, target, var, packName): return self.call_adb("-s %s uninstall %s %s" % (target, var, packName)) #查看应用列表 # 无 所有应用 # -f 显示应用关联的 apk 文件 # -d 只显示 disabled 的应用 # -e 只显示 enabled 的应用 # -s 只显示系统应用 # -3 只显示第三方应用 # -i 显示应用的 installer # -u 包含已卸载应用 def adbGetPmlist(self, target, var): return self.call_adb("-s %s shell pm list packages %s" % (target, var)) # 清除应用数据缓存 def adbCacheClear(self, target, packName): result = self.call_adb("-s %s shell pm clear %s" % (target, packName)) return result.rstrip() # 查看应用详细信息 def adbGetAppInfo(self, target, packName): result = self.call_adb("-s %s shell dumpsys package %s" % (target, packName)) return result.strip() # 启动Activity def adbStartActivity(self, target, activity): result = self.call_adb("-s %s shell am start %s" % (target, activity)) return result.rstrip() # 强制停止Activity def adbStopActivity(self, target, packName): result = self.call_adb("-s %s shell am force-stop %s" % (target, packName)) return result.rstrip() # 获得设备型号 def adbGetDeviceModel(self, target): result = self.call_adb("-s %s shell getprop ro.product.model" % (target)) return result.rstrip() # 获取设备品牌 def adbGetDeviceBrand(self, target): result = self.call_adb("-s %s shell getprop ro.product.brand" % (target)) return result.rstrip() # 获得设备名称 def adbGetDeviceName(self, target): result = self.call_adb("-s %s shell getprop ro.product.name" % (target)) return result.rstrip() # 获得设备处理器型号 def adbGetDeviceBoard(self, target): result = self.call_adb("-s %s shell getprop ro.product.board" % (target)) return result.rstrip() # 设备重启 def adbDeviceReboot(self, target): result = self.call_adb("-s %s reboot" % (target)) return result.rstrip() # 获取电池状况 def adbGetBattery(self, target): result = self.call_adb("-s %s shell dumpsys battery" % (target)) return result.rstrip() # 获取屏幕分辨率 def adbGetScreenSize(self, target): result = self.call_adb("-s %s shell wm size" % (target)) return result.rstrip() # 获取屏幕dpi def adbGetScreenDPI(self, target): result = self.call_adb("-s %s shell wm density" % (target)) return result.rstrip() # 获取屏幕参数 def adbGetScreenInfo(self, target): result = self.call_adb("-s %s shell dumpsys window displays" % (target)) return result.rstrip() # 获取Android系统版本 def adbGetAndroidVersion(self, target): result = self.call_adb("-s %s shell getprop ro.build.version.release" % (target)) return result.strip() # 获取IP地址 def adbGetDevIP(self, target): result = self.call_adb("-s %s shell ifconfig wlan0" % (target)) if int(self.adbGetAndroidVersion(target).split(".")[0]) > 4: if result.rsplit(":")[1][19:23] == "inet": return result.rsplit(":")[2][:13] else: print ("WIFI开启,请打开WIFI开关") return else: return result.rsplit(":")[1][4:17] # 获取MAC地址 def adbGetDevMac(self, target): result = self.call_adb("-s %s shell cat /sys/class/net/wlan0/address" % (target)) return result.strip() # 获取CPU信息 def adbGetDevCPU(self, target): result = self.call_adb("-s %s shell cat /proc/cpuinfo" % (target)) return result.strip() # 获取系统内存信息 def adbGetDevMem(self, target): result = self.call_adb("-s %s shell cat /proc/meminfo" % (target)) return result.strip() # 获取应用内存信息 def adbGetDevPidMem(self, target, packname): result = self.call_adb("-s %s shell dumpsys meminfo %s" % (target, packname)) return result.strip() # 获取总的CPU使用时间 def adbGetCpuTime(self, target): result = self.call_adb("-s %s shell cat /proc/stat" % (target)) return result.strip() # 获取进程CPU时间片 def adbGetPidJiff(self, target, pid): result = self.call_adb("-s %s shell cat /proc/%s/stat" % (target, pid)) return result.strip() # 获取进程fps def adbGetPidfps(self, target, packname): result = self.call_adb("-s %s shell dumpsys gfxinfo %s" % (target, packname)) return result.strip() # # 获取进程流量信息 # def adbGetPidflow(self, target, packname, flag): # if int(self.adbGetAndroidVersion(target).split('.')[0]) < 8: # uid = AppPerCon.appuid['MATE8'][packname] # rec = self.call_adb("-s %s shell cat /proc/uid_stat/%s/tcp_rcv" % (target, uid)).strip() # sen = self.call_adb("-s %s shell cat /proc/uid_stat/%s/tcp_snd" % (target, uid)).strip() # # print rec, sen # flow = float(rec) + float(sen) # else: # if flag == 1: # # self.adbStartActivity(target, activity) # pid = self.adbGetPid(target, packname) # print pid # lis = self.call_adb("-s %s shell cat /proc/%s/net/dev" % (target, pid)).strip().split() # for k, v in enumerate(lis): # if v == 'wlan0:': # recindex = k + 1 # tranindex = k + 9 # flow = float(lis[recindex])+float(lis[tranindex]) # self.adbStopActivity(target, packname) # break # else: # lis = self.call_adb("-s %s shell cat /proc/net/dev" % (target)).strip().split() # for k, v in enumerate(lis): # if v == 'wlan0:': # recindex = k + 1 # tranindex = k + 9 # flow = float(lis[recindex]) + float(lis[tranindex]) # break # # return flow def adbGetPid(self, target, packname): if int(self.adbGetAndroidVersion(target).split('.')[0]) < 8: pid = self.call_adb("-s %s shell ps | findstr %s"%(target, packname)).rstrip().split("\n") if pid == ['']: print ("this process doesn't exist") return None else: for item in pid: if item.split()[8] == packname: return item.split()[1] else: pid = self.call_adb("-s %s shell top -n 1 | findstr %s" % (target, packname)).strip().split() if pid == []: print ("this process doesn't exist") return None else: return pid[0] def adbGetUid(self, target, packname): pid = self.adbGetPid(target, packname) lis = self.call_adb('-s %s shell cat /proc/%s/status' % (target, pid)).split() uid = 0 for k, v in enumerate(lis): if v == 'Uid:': index = k + 1 uid = lis[index] break return uid def adbGetAPPstartTime(self, target, activity): lis = self.call_adb('-s %s shell am start -W %s' % (target, activity)) for k, v in enumerate(lis): if v == 'TotalTime:': index = k + 1 time = lis[index] break return time def initBTWIFI(self): content = self.call_adb("shell settings get global wifi_on").strip(); content1 = self.call_adb("shell settings get global bluetooth_on").strip(); if content == "0": self.call_adb("shell svc wifi enable"); time.sleep(1); if content1 == "0": self.call_adb("shell svc bluetooth enable"); time.sleep(1); #4. 入口测试模块,用于快速验证类的功能 #快速验证:让开发者在编写或修改 AdbDebug 类后,能直接运行脚本测试核心功能是否正常(无需编写额外的测试脚本); #环境验证:确认 ADB 环境是否正常(设备已连接、ADB 命令可执行)、类中的方法是否按预期工作; if __name__ == '__main__': d = u2.connect("R5CWB30EZJX") ad = AdbDebug() ad.adbGetCurSSIDSAMSUNG() # ad.adbStopActivity("R5CWB30EZJX", "com.android.settings") pass
08-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试狂人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值