Java代码启动Appium server

前言

Appium的启动方式有下面的两种:

  • 使用Appium GUI启动,这种方式需要下载一个appium的客户端,然后填写地址和端口号。这是最简单粗暴的。
  • 使用代码appium自带的库函数来实现启动appium server的启动

    这篇文章着重讲使用代码实现appium server的启动

    使用AppiumDriverLocalService

    使用这个方法得先做下面的工作

  • 在本机安装Node/js
  • 使用npm安装Appium server

    使用java代码启动Appium server主要依靠这个两个类

  • AppiumDriverLocalService:这个类是用来启动和关闭Appium server的
  • AppiumServiceBuilder:这个类是用来构建Appium服务的。可以通过这个类向appium server传递地址,端口号,desired capabilities和其他标志。

    简单的实现

    简单的实现就是调用默认的服务来启动/关闭Appium server。代码如下

    AppiumDiverLocalService service =AppiumDriverLocalService.buildDefaultService();
    serivce.start();
    ...
    service.stop();

执行上述的代码后,可以在ide的控制台看到有关appium server已经启动的的信息。如下图所示:

使用AppiumServiceBuilder添加配置

通过AppiumServiceBuilder,我们可以添加选项配置Appium server。可以不使用默认的配置,自己选择对饮的主机号,端口号,容器等其他的标志。示例代码如下:

import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.service.local.AppiumDriverLocalService;
import io.appium.java_client.service.local.AppiumServiceBuilder;
import io.appium.java_client.service.local.flags.GeneralServerFlag;

public class AppiumServerJava {

private AppiumDriverLocalService service;
private AppiumServiceBuilder builder;
private DesiredCapabilities cap;

public void startServer() {
//Set Capabilities
cap = new DesiredCapabilities();
cap.setCapability("noReset", "false");

//Build the Appium service
builder = new AppiumServiceBuilder();
builder.withIPAddress("127.0.0.1");
builder.usingPort(4723);
builder.withCapabilities(cap);
builder.withArgument(GeneralServerFlag.SESSION_OVERRIDE);
builder.withArgument(GeneralServerFlag.LOG_LEVEL,"error");

//Start the server with the builder
service = AppiumDriverLocalService.buildService(builder);
service.start();
}

public void stopServer() {
service.stop();
}

public boolean checkIfServerIsRunnning(int port) {

boolean isServerRunning = false;
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(port);
serverSocket.close();
} catch (IOException e) {
//If control comes here, then it means that the port is in use
isServerRunning = true;
} finally {
serverSocket = null;
}
return isServerRunning;
}

public static void main(String[] args) {
AppiumServerJava appiumServer = new AppiumServerJava();

int port = 4723;
if(!appiumServer.checkIfServerIsRunnning(port)) {
appiumServer.startServer();
appiumServer.stopServer();
} else {
System.out.println("Appium Server already running on Port - " + port);
}
}
}

在上述的代码中,我们通过添加一个判断方法,来判断Appium server是否启动,如果已经启动了appium server,就不能执行下面的代码,然后就抛出一个异常来。在该方法,只有确保了端口号没被占用,才能成功启动appium server。

执行上述代码,可以在控制台看到我们之前配置不同于默认方法启动的信息。

通过node.js和appium的来启动服务器

这个方法是其实就是通过java代码来启动appiumgui。进而启动appiumvserver。这个方法不会直接打开对应的GUI版本。也就是说不在屏幕上是看不到Appium GUI的UI。这是一种无头也是。跟selenium启动浏览器driver时没有浏览器外壳差不多的意思。

先决条件

  • 必须安装node.js
  • 安装Apium GUI。

    使用该方法前,必须先找到AppiumGUI安装的路径。必须在java代码中提供该地址。node.exe通常安装在Appium文件夹下。比如Appium安装在C:\Program Files(x86)\Appium中。那么appium.js通常放在C:\Program Files(x86)\Appium\node_modules\appium\bin文件夹里node.js在C:\Program Files(x86)\Appium\node.js。具体的代码如下

import java.io.IOException;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecuteResultHandler;
import org.apache.commons.exec.DefaultExecutor;

public class AppiumServerJava {

public void startServer() {
CommandLine cmd = new CommandLine("C:\\Program Files (x86)\\Appium\\node.exe");
cmd.addArgument("C:\\Program Files (x86)\\Appium\\node_modules\\appium\\bin\\Appium.js");
cmd.addArgument("--address");
cmd.addArgument("127.0.0.1");
cmd.addArgument("--port");
cmd.addArgument("4723");

DefaultExecuteResultHandler handler = new DefaultExecuteResultHandler();
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(1);
try {
executor.execute(cmd, handler);
Thread.sleep(10000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}

public void stopServer() {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("taskkill /F /IM node.exe");
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
AppiumServerJava appiumServer = new AppiumServerJava();
appiumServer.startServer();

appiumServer.stopServer();
}
}

我们使用CommandLine class来设置Appium server变量和默认的执行器来启动Appium server。

使用命令行提示符来启动appium server

使用该方法,可以模拟打开命令提示符和启动Appium服务器的手动过程。

手动流程

  • 打开命令行提示符。
  • 执行下面的命令行指令:appium -a 127.0.0.1 -p 4723 –session-override -dc “{”noReset”: ”false”}”
  • 按Enter键。

代码模式

import java.io.IOException;

public class AppiumServerJava {

public void startServer() {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("cmd.exe /c start cmd.exe /k \"appium -a 127.0.0.1 -p 4723 --session-override -dc \"{\"\"noReset\"\": \"\"false\"\"}\"\"");
Thread.sleep(10000);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}

public void stopServer() {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("taskkill /F /IM node.exe");
runtime.exec("taskkill /F /IM cmd.exe");
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
AppiumServerJava appiumServer = new AppiumServerJava();
appiumServer.startServer();

appiumServer.stopServer();
}
}

如果觉得上述代码太长太复杂了。也可以使用下面一句简单的的语句来实现:

runtime.exec("cmd.exe /c start cmd.exe /k \"appium -a 127.0.0.1 -p 4723\"");

通过使用taskkill /F /IM命令。这个命令是通过任务管理器来杀死进程。当你用该方法启动了Appium server,那么在任务管理器可以看到node.js进程。为了关闭Appiumserver,首先先杀死node.js进程,然后杀死cmd进程关闭命令行提示符。

原文地址:https://www.cnblogs.com/NaCl/p/10236158.html

时间: 2024-11-08 21:00:18

Java代码启动Appium server的相关文章

DataX通过纯Java代码启动

DataX是阿里巴巴团队开发的一个很好开源项目,但是他们对如何使用只提供了python命令启动方式,这种方式对于只是想简单的用下DataX的人来说很是友好,仅仅需要几行代码就可以运行,但是如果你需要在DataX上进行二次开发,那么用python来控制程序加显得很没有掌控力度,也不容易和别的模块进行融合,今天来说下DataX纯Java代码的启动方式,也顺便来记录一下以后想用的时候加能直接用了 先把测绘的代码写上  就一行. 突然想起来还有好多代码没敲完!!!!先写到这,后面的下午6点前更新. 原文

Java代码启动/关闭进程

ProcessBuilder builder = new ProcessBuilder(命令,参数,参数...); Process process = builder.start(); br = new BufferedReader(new InputStreamReader(process.getInputStream())); 可以从br中读取日志信息 根据ID杀掉进程 String os = System.getProperty("os.name");         try {

Java控制Appium server start/stop

相信很多人都会遇到这种场景,在进行appium自动化的时候用Windows OS,不好实现后台运行,每次启动Appium server: 使用Appium GUI版手动点击 就是在cmd line 启动Appium 如果要实现CI,使用Appium GUI是不可行的,因为如果在跑case的过程中Appium session无法创建必须重启Appium server,也无法自动获取相应的参数直接启动Appium 那么这个时候只能使用command line PS:使用command line需要把

JAVA如何设置代理server,s取消代理erver

1.一个简短的引论 代理server(Proxy Server)是一种重要的server安全功能,它的工作主要在开放系统互联(OSI)模型的会话层,从而起到防火墙的作用. 代理server大多被用来连接INTERNET(国际互联网)和INTRANET(局域网).主要功能:就是代理网络用户去取得网络信息.形象的说,它是网络信息的中转站.本文主要介绍怎样使用java代码设置代理server. 主server为了防止被伪用户攻击,统一让用户通过代理server去訪问主server,这样做的安全性是显而

java虚拟机jvm启动后java代码层面发生了什么?

java虚拟机jvm启动后java代码层面发生了什么? 0000 我想验证的事情 java代码在被编译后可以被jdk提供的java命令进行加载和运行, 在我们的程序被运行起来的时候,都发生了什么事情, 下面就来探究下这个问题, 这个问题被拆成了两个问题, 第一个问题用来确定发生了哪些事情, 第二个问题用来确定这些事情是如何进行的. java进程里面都发生了哪些活动? 这些活动在java代码(反编译或者是源码)级别有所体现吗? 0001 寻找验证的方式 当我在探究上面两个问题时, 我想了很多方式去

首次启动Kafka报Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)

首次启动Kafka报错如下: 原因:内存不足,查看启动配置 调小一些: 首次启动Kafka报Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12) 原文地址:https://www.cnblogs.com/zjfjava/p/10325523.html

通过Appium Server Log 分析一个case执行的过程

此文的目的主要是通过分析Appium Server打印出来的log,加深对Appium Server所扮演角色的理解. 这整一个过程是由一个Test Case开始执行到结束,测试的对象是SDK自带的NotePad.apk. Test Case很简单:打开Notepad程序,然后点击安卓的Menu Options按钮调出"Add Note"菜单按钮,然后点击该按钮,然后完成测试. package majcit.com.AppiumDemo; import io.appium.java_c

appium简明教程(6)——启动appium及android模拟器

一般情况下,我们都从命令行启动appium. windows下,dos命令窗口输入 appium 如果该命令报错,那么请重装appium npm install -g appium 如果安装出错,请自行更换npm源. npm -g --registry http://registry.cnpmjs.org install appium 然后请打开android的模拟器,如果没有请新建一个虚拟设备 下面的代码以启动android原生的计算器程序为例 ruby篇 require 'appium_li

Tomcat使用MyEclipse远程调试Java代码配置详解

Tomcat使用MyEclipse远程调试Java代码总结如下:在做远程调试时,在windows系统和非windows系统下的配置,Tomcat中会有所差别,具体如下: 第一步.配置tomcat一.在windows系统中:打开%CATALINE_HOME%/bin下的文件catalina.bat,加入下面这行:set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket