线程 "main" org.openqa.selenium.remote.UnreachableBrowserException 中的异常:使用 appium 时无法启动新会话

Exception in thread "main" org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session, When using appium

在我的机器上 运行ning Appium 服务器的 运行ning 代码时总是出现错误。谁能帮我解决这个问题。我关注了一些主题,但其中 none 无法解决我的问题。

如果我 运行 手动 "appium.exe" & 运行 代码工作正常但是当我从代码启动 运行ning appium 和交互时出现问题。

配置:Windows 7 64 位,Appium 1.2.4.1,Selenium 2.45,Appium Java 客户端 - 2.2,java 1.6

以下是以编程方式启动 Appium 服务器的代码

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();
      }


     }

}

我的移动脚本是,

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();

得到以下异常,

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

我设法重现了这个问题。出现这个问题是因为appium需要比较长的时间来启动。如果将您构建的命令行复制到 cmd 提示符并启动它,您可以看到它。 appium 准备就绪大约需要 30 秒。所以肮脏的解决方案只是在移动脚本中的 aServer.startServer(); 之后添加 Thread.sleep(30000); 。更好的解决方案是等到 appium 准备好。为此,我认为最好的方法是读取输出流并验证它是否包含预期的响应。

这个简单的代码展示了这种方法(没有响应验证)

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();
     }
}