/// <summary>
        /// Initializes the Appium driver. Service can be set using .see AppiumServer
        /// for local execution and by setting the .seealso TestRunParameters.LocalExecution,
        /// nodeEXE and AppiumJS path in runsettings file. Set AppiumServerUri for grid or manual server test execution.
        /// To get the instance of the appropriate driver, use the .see "GetInstance" method
        /// </summary>
        /// <param name="capabilities">Capabilities expected of the driver</param>
        public static void Initialize(DriverCapabilities capabilities)
        {
            AppiumDriver <AppiumWebElement> instance;
            TestEnvironmentParameters       TestRunParameters = capabilities.GetEnvironmentContext();
            TimeSpan implicitWaitTimeSpan = TimeSpan.FromSeconds(Convert.ToInt32(TestRunParameters.RS_ImplicitWaitTime));

            instance = InitializeDriver(capabilities);
            instance.Manage().Timeouts().ImplicitWait = implicitWaitTimeSpan;
            Instance = instance;
        }
        private static AppiumDriver <AppiumWebElement> InitializeDriver(DriverCapabilities capabilities)
        {
            AppiumOptions             caps = capabilities.GetDriverOptions();
            TestEnvironmentParameters TestRunParameters = capabilities.GetEnvironmentContext();
            int timeout = Convert.ToInt32(TestRunParameters.RS_DeviceReadyTimeout);

            Uri serverUri = TestRunParameters.ServerUri;

            if (TestRunParameters.RS_PlatformName.Equals("Android", StringComparison.OrdinalIgnoreCase))
            {
                return(GetDriver(() => new CustomAndroidDriver(serverUri, caps, TimeSpan.FromSeconds(timeout))));
            }
            if (TestRunParameters.RS_PlatformName.Equals("iOS", StringComparison.OrdinalIgnoreCase))
            {
                return(GetDriver(() => new CustomIOSDriver(serverUri, caps, TimeSpan.FromSeconds(timeout))));
            }
            throw new PlatformNotSupportedException($"[{TestRunParameters.RS_PlatformName}] platform is not supported.");
        }