格力空调多少钱26Q一台多少钱

appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python。小编擅长Python,所以接下来的教程是appium+python的实例。
学习appium最大的难处在于环境的安装,80%的人死于环境安装,然后就没然后了,10%的人被环境折腾一周以上,只有剩下的10%人品好,可以顺利安装。
一、环境准备
小编的环境是Windows 7版本 64位系统(32位的同学自己想办法哦)
& & 1.jdk1.6.0 (64位)
& & 2.android-sdk_r24.3.4-windows
& & 3.python:2.7(3.6也可以)
& & 4.appium:1.4.13.1
& & 5.Node.js:node-v4.4.7-x64
& & 6.Appium-Python-Client
二、jdk安装
& & 1.下载jdk包,小编的是64位1.6版本,其它高级版本应该也是可以的。根据自己的系统选择对应版本
& & 2.一路傻瓜式安装,注意安装路径不要有空格,不要有中文。jdk和jre不要放在一个文件夹下
& & 3.设置三个环境变量,我的电脑&选择&属性&-&&高级&-&&环境变量&-&&系统变量&-&&新建&
JAVA_HOME----D:\Java\jdk1.6.0& (根据自己安装路径填写)
CLASSPATH---&.;%JAVA_HOME%\%JAVA_HOME%\lib\tools.
PATH-----;%JAVA_HOME%\%JAVA_HOME%\jre\
在path路径下加上面那两个,这里就不多说了
& & 4.打开cmd验证是否安装成功,输入java -version,然后输入javac
能显示版本号和下面的帮助信息说明安装成功
三、android-sdk下载安装
& & 1.下载android-sdk,这个是做android测试和开发的必备环境,如果不会下载的话,在QQ群:群文件下载
& & 2.解压后,里面有个SDK manager.exe双击打开
& & 3.勾选你要现在的API版本和对应的android版本,后面模拟器会用到
,然后坐等下载
四、android-sdk环境变量
& & 1.在系统变量新建:ANDROID_HOME,对应变量值为:D:\androidsdk\android-sdk-windows(sdk安装路径)
& & 2.path添加两个变量,将以下箭头所指的两个文件路径添加到path里
& & 3.path里面添加D:\androidsdk\android-sdk-windows\tools和D:\androidsdk\android-sdk-windows\platform-tools
五、adb环境
& & 1.因为adb是在D:\androidsdk\android-sdk-windows\platform-tools这个目录下的,所以上面添加了环境变量后,可以直接在cmd里面运行了。
& &2.在cmd输入adb可以查看对应版本号
六、连接手机
& & 1.手机用数据线连电脑,如果安装了91助手或者360什么的可以先下载手机驱动,确认手机能连上
& & 2.打开cmd输入:adb devices,当屏幕上出现一串字符,后面显示devices说明连接成功(出现其它的提示,得检查自己的环境了)
到这里android的测试开发环境已经装好了,下一篇会教搭建搭建appium环境。安装过程中遇到各种奇葩问题,请卸载完后,仔细阅读,从第一行开始,一步一步走下来,中间任何一个环境出问题,都会导致最后appium运行失败。
在学习过程中有遇到疑问的,可以加appium(python+java) QQ群交流:
阅读(...) 评论()一、适用操作系统Win7 旗舰版Sp1 64位操作系统 或 32位操作系统二、所需软件jdk-7u45-windows-i586.exenode-v0.10.28-x86.msi (32位)下载地址:http://nodejs.org/download/adt-bundle-windows-x86-.zipSDK下载地址:/sdk/index.htmlapache-ant-1.9.4-bin.zip ( 非必装) http://ant.apache.org/bindownload.cgiapache-maven-3.1.1-bin.zip (非必装) http://maven.apache.org/download.cgiActivePython-2.7.5.6-win32-x86.msi三、安装步骤1)安装JDK,并进行环境变量配置JDK安装很简单,按默认安装即可。环境变量配置:添加JAVA_HOME变量, 值:Jdk的安装路径,如:D:\Java\jdk1.7.0_45添加CLASSPATH变量,值 .;%JAVA_HOME%\lib\tools.%JAVA_HOME%\lib\dt.jar修改path变量,加上这句 %JAVA_HOME%\检查JAVA环境是否配置好,进入CMD命令行,输入java或javac,可以看到好多的命令提示,说明成功了。2)安装Node.js,按默认安装即可,可以改变安装的路径。安装完成以后,检查Node版本安装是否成功:进入CMD,输入node -v, 可以看到版本号,说明成功了。
3)安装ADT,配置环境变量下载地址:/sdk/index.html?hl=sk下载 adt-bundle-windows-x86-.zip,直接解压即可。配置环境变量,设置ANDROID_HOME 系统变量为你的 Android SDK 路径,并把tools和platform-tools两个目录加入到系统的 Path路径里。变量名:ANDROID_HOME 值: D:\AutoTest\adt\sdk设置Path值: %ANDROID_HOME%\%ANDROID_HOME%\platform-tools
4)联网安装Appium进入cmd命令行,输入:npm install &g
或者npm --registry pmjs.org install -g
(推荐这种,npm的国内镜像)注:-g全局参数多等几分钟,可以看到的版本1.1.0及安装目录
也可以下载地址:&下载完毕后解压到pc本地,将压缩包里有appium.cmd文件的路径设置到环境变量path中。
5)检查一下是否安装成功。进入cmd命令行,输入提示:socket.io started 说明安装好了。
6)检查所需的环境是否OK(这步很重要)进入Cmd命令行,输入appium-doctor ,出现以下提示,All Checks were successful ,说明环境成功。
7)安装Apache Ant (这一步可省)安装Apache Ant(http://ant.apache.org/bindownload.cgi)。解压缩文件夹,并把路径加入环境变量。变量: ANT_HOME 值: D:\AutoTest\ant-1.9.4设置Path: %ANT_HOME%\测试Ant是否安装成功,进入cmd命令行:输入ANT,如果没有指定build.xml就会输出:Buildfile: build.xml does notexist! Build failed
也可用eclipse中自带的Ant,路径为 eclipse\plugins。配置环境同上。
8)安装Apache Maven (这一步可省)下载Maven(http://maven.apache.org/download.cgi),并解压缩文件夹,把路径加入环境变量。变量M2_HOME 值:D:\AutoTest\maven-3.1.1设置Path: %M2_HOME%\测试Maven是否成功,运行cmd,输入mvn -version如果成功,则出现maven版本等环境信息。
安装:python+webdriver环境第一步:安装active-python,双击可执行文件,直接默认安装即可。第二步:安装selenium webdriver1. 打开cmd2. 命令为:pip install selenium -i /simple (使用国内地址)3. 打开python的shell或者IDEL界面 ,输入from selenium import webdriver 如果不报错那就说明你已经安装selenium for python成功了。4. 安装appium-python-client:(这步很重要,必须)进入cmd,输入:pip install Appium-Python-Client以上全部安装好以后,最后就是执行实例来测试一下:1. 打开Adt,创建一个模拟器,并启动android模拟器。2. 在cmd启动appium输入:appium3. 另开一个cmd终端窗口。切换到实例代码路径下,执行android_contacts.py文件。
阅读(...) 评论()Posts - 2,
Articles - 0,
Comments - 0
16:51 by CockRoacher, ... 阅读,
  由于工作的需要进行Andriod手机app自动化测试,公司现有支持的app的手机平台(Andriod和IOS), 所以选择了Appium工具。因为Andriod和IOS,Appium都支持。百度和谷歌上的各种Appium教程可谓是琳琅满目,但大抵都是浅尝辄止。因此笔者想要总结一套较全面的Appium的实战经验,以此记录我遇到的坑和填过的坑。
  web自动化测试的路线是这样的:编程语言基础---&测试框架---&webdriver API(selenium2)---&开发自动化测试项目。
& & &移动自动化的测试的路线则是这样的:编程语言基础---&测试框架---&android/IOS开发测试基础----&appium API&-----&开发移动自动化项目。
  俗话说,工欲善其事,必先利其器。闲话不多话,开始!
  准备工作
  一、Python安装
  Python作为当下猿类主流的热门语言,低门槛,上手快,见效快。目前主流的编程语言对Appium的兼容都是很好的,现在流传世面使用的python版本有两种:Python2与Python3。python3并不是python2的升级,可以理解成python2和python3是两种完全不同的语言,它们的类库是完全不能兼容的!但python官方文档已说明python2只是过渡版,在2020年就会停止对python2的维护和更新,并推荐转为使用python3。不过本教程仍是以python2.7.12为例。访问python官网, 下载适合自己操作系统的安装文件
这里以Windows(64位)操作系统为例,下载Windows x86-64 MSI installer,双击打开,一直next,在选择安装组件的一步时,勾上所有的组件完成安装。值得注意的一点是需要勾选上Add python.exe to Path,
默认会安装到C:\Python27目录下,然后打开命令提示符窗口,敲入python后,
如果出现以上画面则说明python安装成功!当然如果命令行出现提示 "‘python’不是内部或外部命令,也不是可运行的程序或批处理文件。",则说明在安装时忘记勾选上Add python.exe to Path。
二、Appium安装
  Appium官方网站:,关于安装说明,官方也给出了言简意赅的安装步骤:
看了官方的安装说明,感觉貌似并不是那么的难。其实这里面还是遇到了不少的坑。OK,为了尊重官方,我们首先还是按照官方的方法尝试安装。
  1、安装node.js
  为什么要安装node?node.js 是javascript和Google V8结合的服务器项目,appium就是node的其中一个开源项目,appiun server端是用node实现,遵循了REST架构(1),所以appium可以用node的包管理工具npm来进行安装。
  下载node.js ,下载地址: &建议下载最新的LTS版本。目前Latest LTS Version:&v6.9.1&(includes npm 3.10.8),一路"Next"即可安装完成。默认安装路径为"C:/Program Files/nodejs/",安装时需添加系统全局变量。
安装完成,然后打开命令提示符窗口,敲入npm -v,
如果出现以上画面则说明node.js安装成功!
 安装步骤
  &1、安装Appium
  方法一:
  由于appium实则是一个node的开源项目,所以可以使用node的包管理工具npm在线安装,打开命令提示符窗口输入"npm install -g appium"即可在线安装,但是由于GFW关系,此方法会在安装过程中卡住或是直接报错,解决办法:挂VPN代理FQ
  方法二:
  因为npm install是连接官方的npmjs.org去下载源码,为了满足国内开发人员的需要,淘宝npm镜像cnpmjs.org可替代官方版本。打开输入"npm install -g appium --registry=https://registry.npm.taobao.org"。此方法可行,但不推荐,安装过程耗费时间略长,也不一定会成功。
  方法三:(推荐)
  直接下载appium的GUI界面安装包,下载地址:,Windows最新版本是AppiumForWindows_1.4.16.1.zip,MacOS最新版本是appium-1.5.3.dmg。笔者以windows为例,下载的AppiumForWindows_1.4.16.1.zip 进行解压安装,启动appium,弹出错误提示框
很容易在网上查到错误原因,因为node.js需要.NET Framework框架的支持,所以在这里需要安装net framework4.5。当.net&framework&4.5安装完成,再次启动Appium,
出现上面的画面则表示appium的服务端已安装完成。那么我们还要安装appium的客户端,因为我们是基于python的开发环境,因此可以直接用pip安装appium客户端。打开命令控制行,输入"pip install&Appium-Python-Client",
等待提示Success,即完成了所有的安装。大多数网上的教程就到此结束,但其实安装还没有结束。因为我们使用的方法三进行安装,所以还需要手动设置appium的环境变量(2)。
(如果从官方的资源库下载Appium-Python-Client失败,请自行更换下载源重新下载。在命令行输入"pip install Appium-Python-Client -i /simple"重试 &特别鸣谢@大橙子 同学的指正。)
tips:设置方法:选中计算机点击右键--&属性--&高级系统设置,选中高级--&系统变量,在新建系统变量,变量名为"APPIUM_HOME",变量值为"C:\Program Files (x86)\Appium"(默认安装路径);再编辑PATH,添加变量值";%APPIUM_HOME%\node_modules\."
设置完成后打开命令行,输入"appium-doctor",
根据提示可知,还需设置Android环境变量,而Android环境变量又需要Java环境的支持。所以最后自行下载搭,建JDK和Android SDK环境吧。所有安装完成后,再次在命令行输入"appium-doctor",
以上则是搭建APPIUM环境的准备工作和所有步骤过程,大家也来试一试吧!Android测试(14)
一、什么是并行测试
多台设备同时执行多个用例。。。
appium启动多个服务,每个服务对应一个手机,占用不同的服务端口。利用testng的多线程实现并行。
网上有些教程说grid,然后加什么json,这是以前selendriod 的并行方法了。appium是不用那么复杂的,那个json是配置信息,我们在testng文件和脚本里面已经配置好了。
还有启动appium服务端用命令是最方便的,你硬是要用gui客户端也行,启动多几个appium的gui客户端,配置好bootstrap和appium服务端口,然后启动服务就行了,我在这里就不详解了。
1. testng文件例子
&?xml version="1.0" encoding="UTF-8"?&
name="Suite" parallel="tests" thread-count="2"&
class-name="org.uncommons.reportng.HTMLReporter"/&
class-name="org.uncommons.reportng.JUnitXMLReporter"/&
name="6533d70_Login"&
name="port" value="6666"/&
name="udid" value="6533d70"/&
name="com.example.cases.Login"/&
name="JBORPNPZAQMBDIZH_Login"&
name="port" value="6667"/&
name="udid" value="JBORPNPZAQMBDIZH"/&
name="com.example.cases.Login"/&
2. 脚本接收参数
添加@Parameters({“udid”,”port”})注解接收testng的参数值,,初始化的时候添加udid和port。
获取手机设备udid
判断端口是否可以用,生成开启appium服务的命令
运气开启appium服务命令
生成设备信息文件和生成testng文件
运行testng文件进行测试
不想测试了就运行StopServer停止服务
我这里把流程都已经封装好了,运行StartServers.kava 即可自动生成对应的testng文件,然后运行这个testng即可进行测试,不想测试了就运行StopServer停止服务。
(ps: driver的初始化请放在BeforeClass或者BeforeTest,如果你放在BeforeSuite的话,就会导致只有一个手机执行,因为BeforeSuite注解的方法将只运行一次,运行在所有测试前)
CmdCtrl: cmd命令的控制类,单例的方式执行cmd命令
FileCtrl: 文件的控制类,获取log,xml文件的路径
PortCtrl: 端口的控制类,判断端口是否占用,获取端口列表
ServerCtrl: 服务的控制类,获取手机udid列表,生成启动服务命令,关闭服务,获取启动的端口列表,获取对应的pid列表
StartServers: 启动服务,手机插好之后,run这个文件即可在module下自动生成testng文件
StopServers: 停止服务,测试完成之后,可以run这个文件,关闭appium服务
XmlUtils: xml工具类,保存在运行的设备的信息和testng做生成和解析获取
1. CmdCtrl.java
package com.example.
import java.io.BufferedR
import java.io.InputStreamR
import java.util.ArrayL
import java.util.L
* cmd命令控制类
* Created by Litp on .
public class CmdCtrl {
private static CmdCtrl cmdC
private Runtime runtime = Runtime.getRuntime();
public static
CmdCtrl getInstance(){
if(cmdCtrl == null){
cmdCtrl = new CmdCtrl();
return cmdC
* 运行cmd,并且返回结果
* command 要运行的命令
public List&String& execCmd(String command) {
if (!command.isEmpty()) {
BufferedReader br = null;
Process process = runtime.exec("cmd /c " + command);
br = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
String line = "";
List&String& content = new ArrayList&&();
while ((line = br.readLine()) != null){
if (!line.isEmpty()) {
content.add(line);
} catch (Exception e) {
System.out.println("execCmd执行命令错误!" + e.getMessage());
} finally {
if (br != null) {
br.close();
} catch (Exception e) {
e.printStackTrace();
return null;
* 执行cmd命令看看有没有成功执行
* command 对应的命令
public Boolean execCmdTrue(String command){
Process process = runtime.exec("cmd /c " + command);
return true;
} catch (Exception e) {
System.out.println("execCmdTrue的cmd命令执行错误" + e.getMessage());
return false;
2. FileCtrl.java
package com.example.
import mons.io.FileU
import org.openqa.selenium.OutputT
import java.io.F
import java.io.IOE
import java.text.SimpleDateF
import java.util.D
import javax.swing.filechooser.FileSystemV
import io.appium.java_client.android.AndroidD
* Created by Litp on .
public class FileCtrl {
* 获取桌面路径
private static String getDesktopPath(){
FileSystemView fsv = FileSystemView.getFileSystemView();
File com=fsv.getHomeDirectory();
return com.getAbsolutePath();
* 获取当前项目路径
static String getProjectPath(){
return System.getProperty("user.dir")+"autotest/src/main/java/com/example/utils/";
static String getModulePath(){
return System.getProperty("user.dir")+"/autotest/";
static String getLogsPath(){
return getModulePath()+"src/main/java/com/example/logs/";
static String getPackageName(){
return "com.example.cases.";
* 删除文件
public static boolean delFile(String filePth){
boolean flag = false;
File file = new File(filePth);
if (file.isFile() && file.exists()) {
if(file.delete()){
flag = true;
System.out.println("删除文件成功:"+filePth);
System.out.println("删除文件失败:"+filePth);
3. PortCtrl.java
package com.example.
import java.util.ArrayL
import java.util.L
* 端口控制类
* Created by Litp on .
public class PortCtrl {
* 判断端口是否被占用
* portNum 端口号
private static Boolean isPortUsed(int portNum) {
List&String& portRes = new ArrayList&&();
boolean flag = true;
portRes = CmdCtrl.getInstance().execCmd("netstat -an|findstr " + portNum);
if (portRes.size() & 0) {
System.out.println("端口" + portNum + "已被占用");
System.out.println("端口" + portNum + "没有被占用");
flag = false;
} catch (Exception e) {
System.out.println("获取端口占用情况失败!=");
* 创建可用的端口列表,是个设备就是20个端口,因为一个设备有2个端口需要开通
* startPort
开始的端口
* devicesTotal 设备总数
public static List&Integer& createPortList(int startPort, int devicesTotal) {
List&Integer& portList = new ArrayList&&();
while (portList.size() != devicesTotal) {
if (startPort & 0 && startPort & 65535) {
if(!isPortUsed(startPort)){
portList.add(startPort);
startPort = startPort + 1;
return portL
* 根据设备数量来生成可用端口列表
* startPort 起点端口
public static List&Integer& getPortList(int startPort){
List&String& deviceList = ServerCtrl.getUdidList();
List&Integer& portList = new ArrayList&&();
if(deviceList != null){
portList =
createPortList(startPort,deviceList.size());
return portL
4. ServerCtrl.java
package com.example.
import java.util.ArrayL
import java.util.L
import java.util.M
import java.util.regex.M
import java.util.regex.P
* appium服务控制类
public class ServerCtrl {
public static List&String& udidL
* 获取当前链接的手机的udid列表
public static List&String& getUdidList() {
if (udidList == null || udidList.isEmpty()) {
udidList = new ArrayList&&();
List&String& list = CmdCtrl.getInstance().execCmd("adb devices");
if (list != null && !list.isEmpty()) {
for (int i = 0; i & list.size(); i++) {
if (i != 0) {
String[] devicesInfo = list.get(i).split("\t");
if (devicesInfo[1].equals("device")) {
System.out.println("成功获取设备:" + devicesInfo[0].trim());
udidList.add(devicesInfo[0].trim());
} catch (ArrayIndexOutOfBoundsException e) {
i = i + 2;
System.out.println("当前没有手机链接...");
return null;
if (udidList.isEmpty()) {
System.out.println("有" + list.size() + "台手机链接,但是手机没有正确链接,请尝试重新链接手机");
return udidL
* 创建 启动服务的命令
public static List&String& createServerCommand() throws Exception {
List&Integer& appiumPortList = PortCtrl.getPortList(6666);
List&Integer& bsPortList = PortCtrl.getPortList(9999);
List&String& devicesList = getUdidList();
List&String& commandList = new ArrayList&&();
List&String& logNameList = new ArrayList&&();
for (int i = 0; i & devicesList.size(); i++) {
String logName =
devicesList.get(i) + "_" + XmlUtils.getCurrentTime() + ".log";
String command = "appium.cmd --address 127.0.0.1 -p " + appiumPortList.get(i) + " -bp " + bsPortList.get(i) +
" --session-override -U " + devicesList.get(i) + "&" + FileCtrl.getLogsPath()+logN
commandList.add(command);
logNameList.add(logName);
XmlUtils.createDeviceXml(devicesList, appiumPortList,logNameList);
return commandL
* 根据进程pid杀死进程,用在结束测试之后,杀死那些端口
* pid 要杀死的pid进程
public static Boolean killServerByPid(String pid) {
if (CmdCtrl.getInstance().execCmdTrue("taskkill -f -pid " + pid)) {
System.out.println("根据pid:" + pid + "杀死进程成功");
return true;
System.out.println("根据pid:" + pid + "杀死进程失败");
return false;
* 获取上一次开启服务端口
public static List&String& getStartPortList() throws Exception {
List&Map&String, String&& mapList = new ArrayList&&();
mapList = XmlUtils.readDevicesXml(FileCtrl.getModulePath() + "devicesInfo.xml");
List&String& portList = new ArrayList&&();
for (Map&String, String& map : mapList) {
String port = map.get(XmlUtils.APPIUMPORT);
portList.add(port);
return portL
* 占用服务的程序的pid
public static List&String& getStartPidList(List&String& portList) throws Exception {
List&String& pidList = new ArrayList&&();
if (!portList.isEmpty()) {
for (String port : portList) {
List&String& resultList = CmdCtrl.getInstance().execCmd("netstat -aon | findstr " + port);
if (!resultList.isEmpty()) {
for (String line : resultList) {
Pattern p = pile(" (\\d{2,5})$");
Matcher m = p.matcher(line);
if (m.find()) {
String pid = m.group(m.groupCount());
if (!pidList.contains(pid)) {
pidList.add(pid);
return pidL
5. StartServers.java
package com.example.
import java.util.ArrayL
import java.util.A
import java.util.L
* 根据手机启动服务
* Created by Litp on .
public class StartServers {
public static void main(String[] args) {
List&String& classList = new ArrayList&&();
if(args.length & 0){
classList.addAll(Arrays.asList(args));
classList.add(FileCtrl.getPackageName()+ "Login");
if(startServers(classList)){
System.out.println("开启服务完成");
System.out.println("开启服务失败,要执行的命令行为空");
} catch (Exception e) {
e.printStackTrace();
System.out.println("开启服务失败"+e.getMessage());
* 启动服务
* 返回时候执行命令成功
* className 用例名称
Login Index
* Exception 开启过程中的异常
public static boolean startServers(List&String& className) throws Exception{
List&String& startCommandList = ServerCtrl.createServerCommand();
if(startCommandList.size() & 0){
for(String str:startCommandList){
if(CmdCtrl.getInstance().execCmdTrue(str)){
System.out.println("开启服务成功:"+str);
System.out.println("开启服务失败:"+str);
flag = true;
XmlUtils.createTestNgXml(0,className);
flag = false;
6. StopServers.java
package com.example.
import java.util.L
* Created by Litp on .
public class StopServers {
public static void main(String[] args){
stopServers();
* 停止 服务
public static void stopServers(){
List&String& pidList = ServerCtrl.getStartPidList(ServerCtrl.getStartPortList());
for(String pid:pidList){
ServerCtrl.killServerByPid(pid);
} catch (Exception e) {
System.out.println("停止服务时候获取运行服务对应的进程pid失败"+e.getMessage());
e.printStackTrace();
7. XmlUtils.java
package com.example.
import org.dom4j.D
import org.dom4j.DocumentE
import org.dom4j.DocumentH
import org.dom4j.E
import org.dom4j.io.OutputF
import org.dom4j.io.SAXR
import org.dom4j.io.XMLW
import java.io.F
import java.io.FileOutputS
import java.text.SimpleDateF
import java.util.ArrayL
import java.util.D
import java.util.HashM
import java.util.L
import java.util.M
* xml管理,用到了dom4j库
* Created by Litp on .
public class XmlUtils {
public final static String DEVICE = "device";
public final static String DEVICEID = "deviceId";
public final static String DEVICENAME = "deviceName";
public final static String APPIUMPORT = "appiumPort";
public final static String LOGNAME = "logName";
* 创建设备和对应服务的xml信息,
* devicesList
* appiumPortList 端口列表
* logNameList
保存的log的名字
public static void createDeviceXml(List&String& devicesList, List&Integer& appiumPortList, List&String& logNameList) throws Exception {
Document document = DocumentHelper.createDocument();
Element root = DocumentHelper.createElement(DEVICE);
document.setRootElement(root);
root.addAttribute("name", "devicesList");
if (!devicesList.isEmpty()) {
for (int i = 0; i & devicesList.size(); i++) {
Element deviceId = root.addElement(DEVICEID);
deviceId.addAttribute("id", i + "");
Element deviceName = deviceId.addElement(DEVICENAME);
Element appiumPort = deviceId.addElement(APPIUMPORT);
Element logName = deviceId.addElement(LOGNAME);
deviceName.setText(devicesList.get(i));
appiumPort.setText(appiumPortList.get(i) + "");
logName.setText(logNameList.get(i));
OutputFormat format = new OutputFormat("
XMLWriter xmlWriter = null;
xmlWriter = new XMLWriter(new FileOutputStream(FileCtrl.getModulePath() + "devicesInfo.xml"), format);
xmlWriter.write(document);
System.out.println("生成设备信息文件");
} catch (Exception e) {
System.out.println("生成设备信息文件失败");
* 创建Testng xml文件 到module根目录
* threadCount 线程数,0 是根据手机数量来生成
* className
测试类的类名
public static void createTestNgXml(int threadCount, String className) throws Exception {
Document document = DocumentHelper.createDocument();
Element root = DocumentHelper.createElement("suite");
document.setRootElement(root);
root.addAttribute("name", "Suite");
List&Map&String, String&& devicesInfo = readDevicesXml(FileCtrl.getModulePath() + "devicesInfo.xml");
if (threadCount == 0 || threadCount & devicesInfo.size()) {
root.addAttribute("parallel", "tests");
root.addAttribute("thread-count", devicesInfo.size() + "");
root.addAttribute("thread-count", "1");
Element listeners = root.addElement("listeners");
Element listenerHtml = listeners.addElement("listener");
Element listenerXML = listeners.addElement("listener");
listenerHtml.addAttribute("class-name", "org.uncommons.reportng.HTMLReporter");
listenerXML.addAttribute("class-name", "org.uncommons.reportng.JUnitXMLReporter");
for (int i = 0; i & ((threadCount == 0 || threadCount & devicesInfo.size()) ? devicesInfo.size() : threadCount); i++) {
Element test = root.addElement("test");
test.addAttribute("name",
devicesInfo.get(i).get(DEVICENAME) + "_" + className.get(0).substring(className.get(0).lastIndexOf(".") + 1));
Element port = test.addElement("parameter");
port.addAttribute("name", "port");
port.addAttribute("value", devicesInfo.get(i).get(APPIUMPORT));
Element udid = test.addElement("parameter");
udid.addAttribute("name", "udid");
udid.addAttribute("value", devicesInfo.get(i).get(DEVICENAME));
Element classes = test.addElement("classes");
for(String cls:className){
Element classElement = classes.addElement("class");
classElement.addAttribute("name", cls);
OutputFormat format = new OutputFormat("
XMLWriter xmlWriter = null;
xmlWriter = new XMLWriter(new FileOutputStream(FileCtrl.getModulePath() + "testng_" + getCurrentTime() + ".xml"), format);
xmlWriter.write(document);
System.out.println("生成testng文件");
} catch (Exception e) {
System.out.println("生成testng文件失败");
* 获取当前的时间 年月日时分秒
public static String getCurrentTime() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMddHHmmss");
Date now = new Date();
return dateFormat.format(now);
public static Document getDevicesDocument(String fileName) throws DocumentException {
SAXReader saxReader = new SAXReader();
return saxReader.read(new File(fileName));
* 解析devicesInfo.xml 为
* fileName 设备信息xml路径,绝对路径
public static List&Map&String, String&& readDevicesXml(String fileName) throws Exception {
Document document = getDevicesDocument(fileName);
Element element = document.getRootElement();
List&Element& deviceIDList = element.elements(DEVICEID);
List&Map&String, String&& devices = new ArrayList&&();
if (deviceIDList != null && !deviceIDList.isEmpty()) {
for (Element deviceID : deviceIDList) {
Map&String, String& map = new HashMap&&();
map.put(DEVICENAME, deviceID.element(DEVICENAME).getText());
map.put(APPIUMPORT, deviceID.element(APPIUMPORT).getText());
devices.add(map);
ps: 技术只做参考,希望朋友自身多多思考
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:112504次
积分:2220
积分:2220
排名:第15731名
原创:88篇
评论:158条
如果文章对你有帮助,请捐赠我,非常感谢提供动力。/手动大哭

我要回帖

更多关于 格力空调e6解决多少钱 的文章

 

随机推荐