3
votes

Getting an error always while running code for Appium server which is running on my machine. Could anyone help me out from this. I had followed some threads but none of them could not resolve my issue.

If i run manually "appium.exe" & run code is working fine but when i start running appium from code & interacting is giving a problem.

Configurations: Windows 7 64 bit, Appium 1.2.4.1, Selenium 2.45, Appium Java client - 2.2, java 1.6

Below is the code to launch Appium server programmatically

public class AppiumServerUtils {

    public  void startServer(){

      CommandLine command = new CommandLine("cmd");
      command.addArgument("/c");
      command.addArgument("F:\\Softwares\\Selenium\\Appium\\AppiumForWindows-1.2.4.1\\Appium\\node.exe");
      command.addArgument("F:\\Softwares\\Selenium\\Appium\\AppiumForWindows-1.2.4.1\\Appium\\node_modules\\appium\\bin\\appium.js");
      command.addArgument("--address");
      command.addArgument("127.0.0.1",false);
      command.addArgument("--port",false);
      command.addArgument("4723",false);
      command.addArgument("--bootstrap-port",false);
      command.addArgument("4724",false);
      command.addArgument("--selendroid-port",false);
      command.addArgument("8082",false); 
      command.addArgument("--no-reset",false);
      command.addArgument("--local-timezone");
      command.addArgument("--log");
      command.addArgument("F:\\Softwares\\Selenium\\Appium\\appiumServerLogs.txt");
      DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
      DefaultExecutor executor = new DefaultExecutor();
      executor.setExitValue(1);

      try {
       executor.execute(command, resultHandler);
      } catch (IOException e) {
       e.printStackTrace();
      }
     }

     public  void stopServer(){

      CommandLine command = new CommandLine("cmd");
      command.addArgument("/c");
      command.addArgument("taskkill");
      command.addArgument("/F");
      command.addArgument("/IM");
      command.addArgument("node.exe");

      DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
      DefaultExecutor executor = new DefaultExecutor();
      executor.setExitValue(1);

      try {
        executor.execute(command, resultHandler);
      } catch (IOException e) {
        e.printStackTrace();
      }


     }

}

My script for mobile is,

static AndroidDriver driver;

    AppiumServerUtils aServer = new AppiumServerUtils();
    aServer.startServer();

DesiredCapabilities mDesiredCapabilities = new DesiredCapabilities();
    mDesiredCapabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
    mDesiredCapabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Nexus S");
    mDesiredCapabilities.setCapability(MobileCapabilityType.APP_PACKAGE, "com.android.vod");
    mDesiredCapabilities.setCapability(MobileCapabilityType.APP_ACTIVITY, "com.android.vod.launcher.Main");
    mDesiredCapabilities.setCapability(MobileCapabilityType.APP_WAIT_ACTIVITY, "com.android.vod.tools.remotecontrol.dialogs.Authentication");
    mDesiredCapabilities.setCapability(MobileCapabilityType.VERSION, "4.3");

    driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), mDesiredCapabilities);
androidDriver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
androidDriver.hideKeyboard();
driver.close();

Getting the following Exceptions,

Exception in thread "main" org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure. Build info: version: '2.45.0', revision: '5017cb8', time: '2015-02-26 23:59:50' System info: host: 'Saravanan-PC', ip: '192.168.101.22', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_45' Driver info: driver.version: AndroidDriver at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:593) at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:180) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:240) at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:126) at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:153) at io.appium.java_client.AppiumDriver.(AppiumDriver.java:109) at io.appium.java_client.android.AndroidDriver.(AndroidDriver.java:40) at com.helloappium.HelloAppium.main(HelloAppium.java:48) Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 127.0.0.1:4723 [/127.0.0.1] failed: Connection refused: connect at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:142) at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:319) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) at org.openqa.selenium.remote.internal.ApacheHttpClient.fallBackExecute(ApacheHttpClient.java:126) at org.openqa.selenium.remote.internal.ApacheHttpClient.execute(ApacheHttpClient.java:72) at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:133) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:572) ... 7 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:72) at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:125) ... 20 more [36minfo[39m: Welcome to Appium v1.2.4 (REV 71584425ecf777349e3215f0f18e71e7782acfb6) [36minfo[39m: Appium REST http interface listener started on 127.0.0.1:4723 [36minfo[39m: [debug] Non-default server args: {"address":"127.0.0.1","noReset":true,"log":"F:\Softwares\Selenium\Appium\appiumServerLogs.txt","localTimezone":true,"selendroidPort":8082} [36minfo[39m: Console LogLevel: debug [36minfo[39m: File LogLevel: debug

1

1 Answers

0
votes

I managed to reproduce the problem. The problem occurs because for appium takes relatively long time to start. You can see it if copy the command line that you built to the cmd prompt and launch it. It takes about 30 sec for appium to be ready. So the dirty solution is just to add Thread.sleep(30000); after aServer.startServer(); in the mobile script. The better solution is wait until appium will ready. For this purpose I think the best approach - read output stream and verify that it contains the expected response.

This simple code shows this approach (without the response verification)

InputStream is = new InputStream() {
    @Override
    public int read() throws IOException {
        return 0;
    }
};
executor.getStreamHandler().setProcessOutputStream(is);
try {
     executor.execute(command, resultHandler);
     for (int i=1; i<10; i++) {
         int nRead = is.read();
         if(nRead!=0)
             break;
         Thread.sleep(5000);
         }
     }catch (IOException e) {
            e.printStackTrace();
     }catch (InterruptedException e) {
            e.printStackTrace();
     }
}