手机自动化测试:Appium源码分析之跟踪代码分析四

控制器模块

// Appium webserver controller methods

// https://github.com/hugs/appium/blob/master/appium/server.py

"use strict";

var status = require('./status.js')

  , logger = require('./logger.js').get('appium')

  , _ = require('underscore')

  , _s = require("underscore.string")

  , swig = require('swig')

  , path = require('path')

  , version = require('../../package.json').version

  , proxy = require('./proxy.js')

  , responses = require('./responses.js')

  , getResponseHandler = responses.getResponseHandler

  , respondError = responses.respondError

  , respondSuccess = responses.respondSuccess

  , checkMissingParams = responses.checkMissingParams

  , notYetImplemented = responses.notYetImplemented

  , hasValue = require('appium-support').util.hasValue

  , helpers = require('../helpers.js')

  , logCustomDeprecationWarning = helpers.logCustomDeprecationWarning

  , safely = require('./helpers.js').safely

  , NotImplementedError = require('./errors').NotImplementedError;

 

exports.getGlobalBeforeFilter = function (appium) {

  return function (req, res, next) {

    req.appium = appium;

    req.device = appium.device;

    if (proxy.shouldProxy(req)) {

      if (req.appium.commandTimeout) {

        // if we're proxying, we never get into the sessionBeforeFilter,

        // so let's make sure to reset the timeout on every request still

        req.appium.resetTimeout();

      }

      if (typeof req.device.translatePath !== "undefined") {

        req.device.translatePath(req);

      }

      proxy.doProxy(req, res, next);

    } else {

      next();

    }

  };

};

 

exports.sessionBeforeFilter = function (req, res, next) {

  var match = new RegExp("([^/]+)").exec(req.params[0]);

  var sessId = match ? match[1] : null;

  if (req.appium.commandTimeout) {

    req.appium.resetTimeout();

  }

  // if we don't actually have a valid session, respond with an error

  if (sessId && (!req.device || req.appium.sessionId !== sessId)) {

    safely(req, function () {

      res.status(404).send({sessionId: null, status: status.codes.NoSuchDriver.code, value: ''});

    });

  } else {

    next();

  }

};

 

exports.getStatus = function (req, res) {

  // Return a static JSON object to the client

  var gitSha = req.appium.serverConfig['git-sha'];

  var data = {build: {version: version}};

  if (typeof gitSha !== "undefined") {

    data.build.revision = gitSha;

  }

  if (req.device && typeof req.device.getStatusExtensions === "function") {

    data = _.extend(data, req.device.getStatusExtensions());

  }

  respondSuccess(req, res, data);

};

 

exports.installApp = function (req, res) {

  var install = function (appPath) {

    req.device.installApp(appPath, function (error, response) {

      if (error !== null) {

        respondError(req, res, error);

      } else {

        respondSuccess(req, res, response);

      }

    });

  };

  if (typeof req.body.appPath !== "undefined") {

    req.device.unpackApp(req, function (unpackedAppPath) {

      if (unpackedAppPath === null) {

        respondError(req, res, 'Only a (zipped) app/apk files can be installed using this endpoint');

      } else {

        install(unpackedAppPath);

      }

    });

  } else if (typeof req.device.args.app !== "undefined") {

    install(req.device.args.app);

  } else {

    respondError(req, res, "No app defined (either through desired capabilities or as an argument)");

  }

};

 

exports.removeApp = function (req, res) {

  req.body.appId = req.body.appId || req.body.bundleId;

  if (checkMissingParams(req, res, {appId: req.body.appId}, true)) {

    req.device.removeApp(req.body.appId, function (error, response) {

      if (error !== null) {

        respondError(req, res, response);

      } else {

        respondSuccess(req, res, response);

      }

    });

  }

};