简体   繁体   中英

Run the appium server programmatically

I am trying to run the Appium server programmatically. I tried all the possible options that Appium is providing, but not getting any result

From the command line, if I am trying C:\\Users\\User>appium it's starting the server. How to do the same by using java code?

Note: the version of Appium is 1.6.5

AppiumDriverLocalService service=AppiumDriverLocalService.buildDefaultService(); 
service.start(); 

This the code what i am using to run the appium server programmatically .

The error i am getting is

java.lang.NoClassDefFoundError: org/apache/commons/validator/routines/InetAddressValidator

Did you tried this,

import java.io.*;

public class CmdTest {
    public static void main(String[] args) throws Exception {

        Process p = Runtime.getRuntime().exec("appium");

    }
}

Here is how you start and stop appium server programmatically using Java code

import java.nio.file.Paths;    
public class AppiumSetupAndTearDown {

        public static void startAppiumServer() throws IOException, InterruptedException {

            String logDir = <the path where you want to create the appium output file>;

            File appiumOutput = new File(logDir);

            if (!appiumOutput.exists()) {
                boolean status = appiumOutput.createNewFile();
                if (!status) {
                    throw new IOException("Failed to create Appium output file!");
                }
            }

            String cmd[] = {"/bin/bash", Paths.get(System.getProperty("user.dir")).getParent().getParent().toString() + "/Modules/Shared/startAppium.sh"};
            ProcessBuilder pb = new ProcessBuilder(cmd);

            pb.redirectError(new File(logDir));
            pb.redirectInput(new File(logDir));
            pb.redirectOutput(new File(logDir));
            pb.start();
            System.out.println("Appium server started!");

        }

        public static void stopAppiumServer() throws IOException, InterruptedException {
            String cmd[] = {"/bin/bash", Paths.get(System.getProperty("user.dir")).getParent().getParent().toString() + "/Modules/Shared/stopAppium.sh"};

            ProcessBuilder pb = new ProcessBuilder(cmd);
            pb.start();
            System.out.println("Appium server stopped!");

        }
    }

You can also add Thread.sleep(5000) after starting and stopping the appium server in case you run into timing issues.

I know you are asking for Java, but I do this programmatically with C#. So I paste my solution in case it can help to get an idea:

C# Code:

    public void startAppiumServerLocally()
    {
        try
        {
            string nodejs = "\"" + Environment.GetEnvironmentVariable("nodejs") + "\""; // Environment path for node.exe
            string appium = "\"" + Environment.GetEnvironmentVariable("appium") + "\""; // Environment path for main.js or appium.js

            ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(nodejs);

            myProcessStartInfo.UseShellExecute = false;
            myProcessStartInfo.RedirectStandardOutput = true;
            myProcessStartInfo.RedirectStandardError = true;
            myProcessStartInfo.CreateNoWindow = true;
            // getOverride() method returns '--session-override'
            // getDesiredCapabilitiesJson() returns a JSON with some capabilities '--default-capabilities {"udid":identifier..., deviceName: "Samsung S7"....}'
            // getDriverPort() returns --port X just in case I need to start in a different and unused port.
            string args = appium + getOverride() + getDesiredCapabilitiesJson() + getDriverPort();
            myProcessStartInfo.Arguments = args;

            nodeProcess = new Process();
            nodeProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            nodeProcess.StartInfo = myProcessStartInfo;
            nodeProcess.Start();

            nodeProcess.BeginErrorReadLine();
            StreamReader myStreamReader = nodeProcess.StandardOutput;
            while (_bAppiumForceEnd == false)
            {
                if (_bAppiumInit == false)
                {
                    string line = myStreamReader.ReadLine();
                    if (line.Contains("listener started"))
                    {
                        // _bAppiumInit is a flag to start my tests once the server started
                        _bAppiumInit = true;
                    }
                }
                else
                {
                    myStreamReader.ReadLine();
                }
            }
            myStreamReader.Close();
        }
        catch (Exception e)
        {
            //Log(e.Message);
        }
    }

I know that creating a while loop is not the best solution, but sometimes my nodeProcess was not stoping... So I changed it to this way, and it works perfectly.

Make sure you installed Appium globally...

npm install -g appium

尝试将Commons Validator lib添加到您的classpath / pom.xml(commons-validator-1.4.0.jar)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM