【问题标题】:Exception in thread "main" org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session, When using appium线程“主”org.openqa.selenium.remote.UnreachableBrowserException 中的异常:无法启动新会话,使用 appium 时
【发布时间】:2015-07-29 21:26:09
【问题描述】:

在我的机器上运行 Appium 服务器的代码时总是出错。谁能帮我解决这个问题。我关注了一些线程,但没有一个无法解决我的问题。

如果我手动运行“appium.exe”并运行代码工作正常,但是当我开始从代码运行 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();

获取以下异常,

线程“主”org.openqa.selenium.remote.UnreachableBrowserException 中的异常:无法启动新会话。可能的原因是远程服务器地址无效或浏览器启动失败。 构建信息:版本:'2.45.0',修订:'5017cb8',时间:'2015-02-26 23:59:50' 系统信息:主机:'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.version:AndroidDriver 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:593) 在 io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:180) 在 org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:240) 在 org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:126) 在 org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:153) 在 io.appium.java_client.AppiumDriver.(AppiumDriver.java:109) 在 io.appium.java_client.android.AndroidDriver.(AndroidDriver.java:40) 在 com.helloappium.HelloAppium.main(HelloAppium.java:48) 引起:org.apache.http.conn.HttpHostConnectException:连接到 127.0.0.1:4723 [/127.0.0.1] 失败:连接被拒绝:连接 在 org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:142) 在 org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:319) 在 org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) 在 org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) 在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) 在 org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) 在 org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) 在 org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) 在 org.openqa.selenium.remote.internal.ApacheHttpClient.fallBackExecute(ApacheHttpClient.java:126) 在 org.openqa.selenium.remote.internal.ApacheHttpClient.execute(ApacheHttpClient.java:72) 在 org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:133) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:572) ... 7 更多 引起:java.net.ConnectException:连接被拒绝:连接 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) 在 java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) 在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 在 java.net.Socket.connect(Socket.java:529) 在 org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:72) 在 org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:125) ... 20 更多 [36minfo[39m: 欢迎使用 Appium v​​1.2.4 (REV 71584425ecf777349e3215f0f18e71e7782acfb6) [36minfo[39m:Appium REST http 接口监听器开始于 127.0.0.1:4723 [36minfo[39m: [debug] 非默认服务器参数:{"address":"127.0.0.1","noReset":true,"log":"F:\Softwares\Selenium\Appium\appiumServerLogs.txt", "localTimezone":true,"selendroidPort":8082} [36minfo [39m:控制台日志级别:调试 [36minfo[39m:文件日志级别:调试

【问题讨论】:

    标签: android selenium-webdriver appium


    【解决方案1】:

    我设法重现了这个问题。出现问题是因为对于 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();
         }
    }
    

    【讨论】:

    • 在执行命令之后,您可以编写每 5 秒验证一次状态的循环。如果有帮助请不要忘记采纳答案,谢谢
    • 当然。执行命令后是否需要添加 5 秒睡眠?或者你能分享一些代码吗
    • 如果我调用 read(),总是得到 0。我该怎么做?只是我复制了您的代码并执行。这是正确的方法吗?
    • 能否请您先在 aServer.startServer() 之后立即添加 Thread.sleep(50000);看看问题是否解决了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多