zoukankan      html  css  js  c++  java
  • 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.js的来启动服务器

    这个方法是其实就是通过java代码来启动appiumgui。进而启动appium server。这个方法不会直接打开对应的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 ode_modulesappiumin文件夹里node.js在C:Program Files(x86)Appium ode.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进程关闭命令行提示符。

  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/NaCl/p/10236158.html
Copyright © 2011-2022 走看看