【Appnium+C#+Winform自动化测试系列】一、获取本机连接的设备、启动多个Appnium和获取本机启动的Appnium

    本系列内容,准备根据所完成的项目为基线,一步一步的把整个设计和实现过程梳理。

先从基本的一些环境问题入手,梳理清楚关于手机设备和Appnium。因为我们在后面的建立Appnium连接时,需要设备名字和启动的Appnium实例和对应的端口号。

一、获取手机设备

获取本机连接的设备,我们可以通过adb命令通过控制台来实现,在控制台中输入命令adb devices可得如下结果:

既然能

够如此简单的获取到连接的设备,接下来也就是对控制台文字进行处理分析,最后把需要内容获取出来展示在下拉框里即可.

对于获取到的结果,我们只取attached后面部分,可通过字符串的截取实现。去掉空格和换行符后,就变成了一连串的字符,由device间隔开的设备名字了,这样只需普通的字符处理即可完成。

实际代码如下,可供参考:

/// <summary>
/// 获取当前机器连接的终端设备
/// </summary>
/// <returns></returns>
public static string[] InitDevices()
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.Start();//启动程序
//向cmd窗口发送输入信息
p.StandardInput.WriteLine("adb devices" + "&exit");
p.StandardInput.WriteLine("adb devices" + "&exit");
p.StandardInput.AutoFlush = true;
//p.StandardInput.WriteLine("exit");
//向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死
//同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令

//获取cmd窗口的输出信息
string output = p.StandardOutput.ReadToEnd();
string[] Devices = output.Replace("\r\n", "").Split(new string[] { "attached" }, StringSplitOptions.RemoveEmptyEntries)[1].Replace("\t", "").Replace(" ", "").Split(new string[] { "device" }, StringSplitOptions.RemoveEmptyEntries);
p.WaitForExit();//等待程序执行完退出进程
p.Close();
return Devices;

}

二、如何启动多个Appnium

    按照平常的使用方法,直接双击Appnium程序后点击启动即可启动一个默认端口为4723的Appnium实例。按照这种方法,貌似一台机器只能运行一个Appnium了。

不过笔者发现,在启动Appnium时,打印出一段代码样的东西:

通过这段代码,我发现Appnium的启动貌似是根据主要程序和一些配置来完成实例启动的。既然这样,那应该是可以通过修改IP、端口、平台和版本来控制启动的Appnium实例了。如果我想启动多个的话,

应该是可以通过配置端口号来运行多个Appnium了。果然,直接复制命令和配置文件的绝对路径,在控制台中执行,然后再观察对应的node程序,真的出现了!经过后期验证,这个通过命令实例话的

Appnium是可以运行的。

以此可得,通过对端口作为参数,启动Appnium实例的函数就这样实现了:

/// <summary>
/// 启动Appnium实例
/// </summary>
/// <param name="Port">启动Appnium端口</param>
public static void BootAppnium(string Port)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.Start();//启动程序

//向cmd窗口发送输入信息
string command = @"D:\Appium\node.exe D:\Appium\node_modules\appium\lib\server\main.js --address 127.0.0.1 --port " + Port + " --platform-name Android --platform-version 19 --automation-name Appium --language zh_CN --log-no-color" + "&exit";
p.StandardInput.WriteLine(command);
// p.StandardInput.WriteLine("netstat -aon|findstr \"127.0.0.1:47\"" + "&exit");
p.StandardInput.AutoFlush = true;
p.EnableRaisingEvents = true;

p.Close();

}

三、获取本机启动的Appnium

    知道了如何启动多个Appnium后,那获取本机启动的Appnium也就易如反掌了。我们可以通过获取到node.exe程序的PID值,然后根据PID值来获取对应的端口值了,当然我们在启动端口的时候,最好是预先

设定好一些范围,免得出现端口被占用的问题.

首先来获取node.exe的PID值:

C:\Users\Zeech>tasklist /v |findstr "node"
node.exe 6076 Console 9 78,948 K Unknown ZEECH_LEE\Zeech 0:00:03 暂缺

其中6076即对应的PID值,因为PID值是当前系统唯一的,所以可通过PID值获取到Appnium启动的端口号了

C:\Users\Zeech>netstat -ano |findstr "6076"
TCP 127.0.0.1:4723 0.0.0.0:0 LISTENING 6076

代码如下:

public static string getnodePID()
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.Start();//启动程序

//向cmd窗口发送输入信息
p.StandardInput.WriteLine("tasklist /v |findstr \"node.exe\"" + "&exit");
// p.StandardInput.WriteLine("netstat -aon|findstr \"127.0.0.1:472\"" + "&exit");
p.StandardInput.AutoFlush = true;
//p.StandardInput.WriteLine("exit");
//向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死
//同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令

//获取cmd窗口的输出信息
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
string nodePID = (((output.Replace("\r\n", "").Replace(" ", "").Split(new string[] { "node.exe", "Console" }, StringSplitOptions.RemoveEmptyEntries))))[2].ToString();

return nodePID;
}

/// <summary>
/// 获取当前机器运行的Appnium
/// </summary>
/// <returns></returns>
public static string [] InitAppnium()
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.Start();//启动程序

//向cmd窗口发送输入信息
p.StandardInput.WriteLine("netstat -aon|findstr \""+ getnodePID()+"\"" + "&exit");
// p.StandardInput.WriteLine("netstat -aon|findstr \"127.0.0.1:472\"" + "&exit");
p.StandardInput.AutoFlush = true;
//p.StandardInput.WriteLine("exit");
//向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死
//同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令

//获取cmd窗口的输出信息
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
string[] Appniuma = (((output.Replace("\r\n", "").Replace(" ", "").Replace("0.0.0.0:0", "||0.0.0.0:0").Split(new string[] { "TCP", "6076" }, StringSplitOptions.RemoveEmptyEntries))));
List<string> Appnium=new List<string>();
for (int i = 0; i < Appniuma.Count(); i++)
{
if (i>1)
{
Appnium.Add(Appniuma[i]);
}
}
return Appnium.ToArray();
}

注意:这种字符串截取的过程可能会出现一些bug.例如,在某些情况下,该PID值恰好是某个端口号的部分,那也会诶筛选出来,最完美的做法是只匹配PID值,这样处理一下就可以避免这种情况了.

当然,可能在其他的处理过程中同意会出现筛选不精确的情况,需要多次调试分析尽量做到精准.Windows下,可下载一个AWK插件,可以对列进行筛选处理会方便很多.在处理替换时,可能读者会发

现Replace("0.0.0.0:0", "||0.0.0.0:0"),其实这里的目的是隔开监听状体下的端口号,防止混乱.

四、销毁Appnium实例

    销毁与创建过程互为逆过程,有了以上知识,处理起来就非常简单了。只需要kill 实例程序node.exe即可.

直接上代码:

/// <summary>
/// 销毁Appnium实例
/// </summary>
public static void ExitAppnium()
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.Start();//启动程序

//向cmd窗口发送输入信息
p.StandardInput.WriteLine(@"taskkill /f /t /im node.exe" + "&exit");

p.StandardInput.AutoFlush = true;
p.EnableRaisingEvents = true;

p.Close();

}

五、总结

经过以上的梳理,在对环境的操作,需要用到大量的Windows命令。如果想实现一个完整的Windows平台自动化测试,需要对cmd命令比较熟悉。同时要实现一个功能,最

快速便捷的方法就是去弄懂其原理。任何事情在明白原理的情况下,处理起来都是得心应手,代码只是一个桥梁而已,相信以上的代码写出来后都会觉得非常简单,可以说

几乎全是一些字符串的处理。在测试的过程中,往往就需要对获取的结果进行处理分析,如何精确的获取到需要的信息将是测试是否成功的关键了。

    谢谢大家,我已经迫不及待的构思下一篇博文了!

时间: 2024-11-05 12:16:17

【Appnium+C#+Winform自动化测试系列】一、获取本机连接的设备、启动多个Appnium和获取本机启动的Appnium的相关文章

【Appnium+C#+Winform自动化测试系列】前言

目录(后期持续更新) 一.前言  1.为什么选择Appnium 最近这些年APP保持着持续的火热,对应的APP测试行业也是跟着水涨船高.由于市场的需求,APP测试平台也涌出大量的自动化测试工具. 在对MonkeyRunner.Monkey.Appnium和instrumentation进行比较分析后,我选择了Appnium这个工具.该工具最大的特点就是支持多平 台多语言,而且竟然同时支持JS这种脚本语言和C#.java编译型语言.跨平台的话,同时支持IOS和Android,只需要安装对应Appn

Appium自动化测试系列2- 写一个Python测试脚本来测试一下YY语音

我们在<Appium自动化测试系列1-Appium环境的安装和配置>里已经搭好了Appium的基本环境,这一章,我们就来真刀真枪使用一下Appium, 看看Appium是如果来实现自动化测试的.在写测试脚本之前,我们先安装几个必要的Python三方库. 1 安装Python的setuptools库 (因为安装Python的Selenium库需要用到它) 1) 下载setuptools文件并解压 https://pypi.python.org/pypi/setuptools/12.0.4#dow

接口自动化测试系列之PHPUnit-接口测试的步骤

接着上篇文章接口自动化测试系列之PHPUnit-接口测试基础继续来说 接口测试的步骤 接口测试的步骤并没有什么特殊的,但其中比较关键的是阅读接口文档.这里有个特别奇怪的现象,我们作为测试每天都在读各种复杂.不靠谱的需求,而且还是较好的完成测试工作.但为什么读起来一个非常好的文档的时候却不知道该怎么看了呢?实在想不明白!比如,给了你一份非常详细的学习文档了,或者搭建环境的文档亦或API的文档,很多人都不想看,甚至拒绝看!那怎么会做好测试呢?尤其是想做到高端点的.这个习惯要改改啊亲们! 好,回归正题

C# WinForm开发系列 - ZedGraph

ZedGraph是用于创建任意数据的二维线型.条型.饼型图表的一个类库,也可以作为Windows窗体用户控件和Asp.Net网页控件.这个类库具有高度的适应性,几乎所有式样的图表都能够被创建.这个类库的用法在于通过提供所有图表属性的省缺值来保持使用性的简单.这个类库包含了基于要绘制的数值范围内的可选择适当度量范围和跨度的代码.(相关文章及代码搜集自网络,仅供学习参考,版权属于原作者! ) 统计图控件dotnetCharting和ZedGraph比较 推荐一个功能强大chart控件 ZedGrap

RF+Appium框架自动化测试系列一之(Mac下Appium环境搭建)万事开头难

Mac下Appium环境搭建: 消失了3个月,有一段时间没来园子更新博客了,各位看官见谅哈哈,消失是因为TestYao刚换了工作环境没外网,好多笔记没能及时的记录分享,以后有时间慢慢补上吧,这段时间主要接触了移动端app的自动化测试,公司为了快速把移动端自动化这块搞起来,试用几款目前流行的工具,腾讯的xtest定制版.神州数码的自动化测试平台.开源rf+appium框架. 经过一段试用最终还是选择了rf+appium主要原因有: 1.开源,网上社区活跃 2.扩展性强,针对不同项目不同的需求,封装

C# WinForm开发系列 - ListBox/ListView/Panel

转自会飞的小猪文章 C# WinForm开发系列 - ListBox/ListView/Panel 在博客园看到了一篇博文,觉得很不错,就转载过来了. 包含自定义绘制的ListBox, 带拖动,图片显示, 内嵌其它控件, 打印等扩展功能的ListView(文章及相关代码搜集自网络,仅供学习参考,版权属于原作者! ). 1.ColorListBox   ColorListBox.zip 2.RadioListBox   RadioListBox.rar 3.扩展CheckedListBox控件  

C# WinForm开发系列 - ComboBox

5.一个带CheckBox,分组,颜色标记等功能的下拉框  PowerComboBoxCSharp.rar C# WinForm开发系列 - ComboBox

痞子衡嵌入式:飞思卡尔i.MX RT系列微控制器启动篇(9)- 从Parallel NOR启动

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Parallel NOR启动. 上一篇讲i.MXRT从Raw NAND启动的文章 飞思卡尔i.MX RT系列微控制器启动篇(8)- 从Raw NAND启动 一经放出,深入广大网友喜爱,短时间内阅读量飙升,这让痞子衡深入鼓舞,所以趁热打铁继续把从Parallel NOR启动也顺便一起讲了,为什么说是顺便呢?因为Parallel NOR与Raw NAND都是并行接口,属于同一门派,且这两种外存设备在i.

获取定位,苹果IOS10以上不支持h5的geolocation获取不到地理位置信息解决办法

今天开发应用,获取地理位置,最先采用H5的Geolocation的方法来获取地理位置,经过测试发现安卓的机子可以,但是IOS的就是不行,一查资料才知道:10.0苹果版本需要协议为https的才可以获取到地理定位. 而后为了解决此问题,改用百度MAP来获取,具体步骤和代码如下: 1. 打开http://lbsyun.baidu.com/百度地图开放平台 2. 开发-->javascriptApi,点击获取密钥,注册获取密钥 3. 最后上完整代码 <!DOCTYPE html> <ht