Appium AppiumForWindows 菜鸟计划 (四) 启动服务

· 2015年05月06日 · 最后由 andy 回复于 2022年05月07日 · 2456 次阅读

看到了那个硕大的三角了么,启动服务就是点它,别犹豫,点吧。

查看主页面文件 MainWindowVM.xaml,可以看到启动按钮:

Command="{Binding LaunchCommand}"

说明该按钮绑定了 LaunchCommand,查找:

public ICommand LaunchCommand
{
    get { return _LaunchCommand ?? (_LaunchCommand = new RelayCommand(() => _ExecuteLaunchCommand(), () => _CanExecuteLaunchCommand())); }
}

继续查看:

private void _ExecuteLaunchCommand()
{
    if (_AppiumEngine.IsRunning)
    {
        _AppiumEngine.Stop();
    }
    else
    {
        _AppiumEngine.Start();
    }
}

接着我们就找到了真正执行启动服务的地方了:

public void Start()
{
    //setup runner
    AppiumServerRunner setup = new AppiumServerRunner(this._NodePath, this._AppiumPackageFolder, _Settings);

    // setup basic process info
    var appiumServerProcessStartInfo = new ProcessStartInfo();
    appiumServerProcessStartInfo.WorkingDirectory = setup.WorkingDirectory;
    appiumServerProcessStartInfo.FileName = setup.Filename;
    appiumServerProcessStartInfo.Arguments = setup.GetArgumentsCmdLine() + " --log-no-color";
    appiumServerProcessStartInfo.RedirectStandardOutput = true;
    appiumServerProcessStartInfo.RedirectStandardError = true;
    appiumServerProcessStartInfo.CreateNoWindow = true;
    appiumServerProcessStartInfo.UseShellExecute = false;

    //set up the process and allow the thread to start it
    _AppiumServerProcess = new Process();
    _AppiumServerProcess.StartInfo = appiumServerProcessStartInfo;
    _AppiumServerProcess.OutputDataReceived += _Process_OutputDataReceived;
    _AppiumServerProcess.ErrorDataReceived += _Process_ErrorDataReceived;

    this._ServerExitMonitorThread = new Thread(() =>
    {
        _FireOutputData("Starting Node Server");
        _OnRunningChanged(true);
        this._AppiumServerProcess.Start();
        this._AppiumServerProcess.BeginOutputReadLine();
        this._AppiumServerProcess.BeginErrorReadLine();
        this._AppiumServerProcess.WaitForExit();
        _OnRunningChanged(false);
        _FireOutputData("Node Server Process Ended");
    });
    this._ServerExitMonitorThread.Name = "Server Exit Monitor";
    this._ServerExitMonitorThread.Priority = ThreadPriority.BelowNormal;
    this._ServerExitMonitorThread.Start();
}

额,整体来说就是 new 一个 ProcessStartInfo,各种初始化,各种赋值,然后交给新 new 的 Process,再然后起一个 Thread,再在然后,执行……
appiumServerProcessStartInfo 的详细信息:
如果仔细看上边的代码,就会发现,其实启动和停止走的是同一条路,只不过通过 if (_AppiumEngine.IsRunning) 进行判断,结束自然调用的就是 stop 了,没啥可说的了……

public void Stop()
{
    if (IsRunning && null != _ServerExitMonitorThread && _ServerExitMonitorThread.IsAlive && null != _AppiumServerProcess)
    {
        _AppiumServerProcess.OutputDataReceived -= _Process_OutputDataReceived;
        _AppiumServerProcess.ErrorDataReceived -= _Process_ErrorDataReceived;
        _AppiumServerProcess.Kill();
        _AppiumServerProcess.Dispose();
        _AppiumServerProcess = null;
        _FireOutputData("Killed Node Server.");
        _OnRunningChanged(false);
    }
}

共收到 14 条回复 时间 点赞

楼主,麻烦问下,appium 只能安装到 window7 上吗,我用的 XP,安装好后启动提示不是 win32 程序,谢谢!

#3 · 2015年05月07日 Author

#1 楼 @harryguo 好像是 XP 不太好使

尽量别用这种 GUI 模式. 这不符合测试模式

#3 楼 @seveniruby 那要用什么模式,直接在 cmd 命令行敲?

#4 楼 @smile_0303 是的. 这样有助于你将来做持续集成

@nickli 在你的第一篇文章里面更新下 你后面的几篇文章,做成一个合集吧。

#7 · 2015年05月11日 Author

#6 楼 @lihuazhang OK 家里没电脑 周末没法弄 我今天弄

表示对于新手菜鸟有点困难。好忧伤。各种工具不会连接。。。求解答

#9 · 2015年07月29日 Author

#8 楼 @small728 没明白。

@seveniruby 我也不想用 GUI 模式,但是用命令安装要不成功或网络不好都安装不成功,我用命令就没安装成功过!

使用 GUI 确实不利于做持续集成,我当初也是用命令安装不了,最后放弃了。

#1 楼 @harryguo 互联网时代还不与时俱进更新操作系统?

我都装好了,不过运行一个 demo 时报错,appium 报错日志:info: [debug] Responding to client with error: {"status":33,"value":{"message":"A new session could not be created. (Original error: The following desired capabilities are required, but were not provided: platformName, deviceName)","origValue":"The following desired capabilities are required, but were not provided: platformName, deviceName"},"sessionId":null},可是我启动 appium 时是:info: [debug] Non-default server args: {"address":"127.0.0.1","logNoColors":true,"avd":"android4.4.2","deviceName":"Android Emulator","platformName":"Android","platformVersion":"19","automationName":"Appium"},代码如下:capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "19");
capabilities.setCapability("deviceName", "Android Emulator");请问为啥还报那个错误呢?

测试反对一切平台化的东西,时间久了就会发现全是...

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册