diff --git a/Appium Wizard/AppiumServerSetup.cs b/Appium Wizard/AppiumServerSetup.cs index 7595408..ffa6c49 100644 --- a/Appium Wizard/AppiumServerSetup.cs +++ b/Appium Wizard/AppiumServerSetup.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json.Linq; using NLog; using RestSharp; +using System.Collections.Concurrent; using System.Diagnostics; using System.Linq; using System.Net; @@ -170,18 +171,27 @@ public void StartAppiumServer(int appiumPort, int serverNumber, string command = } } - string deviceUDID = "none"; string currentSessionId = "none"; string currentUDID = "none"; - string currentPlatformName = "none"; //int proxyPort = 0; int screenDensity = 0; - Dictionary sessionIdUDID = new Dictionary(); + public static ConcurrentDictionary sessionIdUDID = new ConcurrentDictionary(); + // Per-serverNumber state, since a single AppiumServerSetup instance's OutputDataReceived + // handler can be invoked concurrently for multiple devices/processes. + private static readonly ConcurrentDictionary deviceUDIDByServer = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary currentSessionIdByServer = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary currentUDIDByServer = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary currentPlatformNameByServer = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary proxiedUDIDByServer = new ConcurrentDictionary(); ExecutionStatus executionStatus = new ExecutionStatus(); - string proxiedUDID = ""; private DateTime lastExecutionTime = DateTime.MinValue; bool isWelcomeDisplayed; string appiumWarning; public void AppiumServer_OutputDataReceived(object sender, DataReceivedEventArgs e, int serverNumber, int webDriverAgentProxyPort) { + string deviceUDID = deviceUDIDByServer.GetOrAdd(serverNumber, "none"); + string currentSessionId = currentSessionIdByServer.GetOrAdd(serverNumber, "none"); + string currentUDID = currentUDIDByServer.GetOrAdd(serverNumber, "none"); + string currentPlatformName = currentPlatformNameByServer.GetOrAdd(serverNumber, "none"); + string proxiedUDID = proxiedUDIDByServer.GetOrAdd(serverNumber, ""); try { if (!string.IsNullOrEmpty(e.Data)) @@ -304,7 +314,7 @@ public void AppiumServer_OutputDataReceived(object sender, DataReceivedEventArgs if (match1.Success) { currentSessionId = match1.Groups[1].Value; - sessionIdUDID.Add(currentSessionId, currentUDID); + sessionIdUDID[currentSessionId] = currentUDID; if (MainScreen.udidProxyPort.ContainsKey(deviceUDID)) { MainScreen.udidProxyPort[currentUDID] = webDriverAgentProxyPort; @@ -381,7 +391,7 @@ public void AppiumServer_OutputDataReceived(object sender, DataReceivedEventArgs if (sessionIdUDID.ContainsKey(sessionId)) { udid = sessionIdUDID[sessionId]; - sessionIdUDID.Remove(sessionId); + sessionIdUDID.TryRemove(sessionId, out _); if (MainScreen.DeviceInfo.ContainsKey(udid)) { string name = MainScreen.DeviceInfo[udid].Item1; @@ -454,6 +464,14 @@ public void AppiumServer_OutputDataReceived(object sender, DataReceivedEventArgs catch (Exception) { } + finally + { + deviceUDIDByServer[serverNumber] = deviceUDID; + currentSessionIdByServer[serverNumber] = currentSessionId; + currentUDIDByServer[serverNumber] = currentUDID; + currentPlatformNameByServer[serverNumber] = currentPlatformName; + proxiedUDIDByServer[serverNumber] = proxiedUDID; + } } public bool processExited; @@ -555,8 +573,9 @@ public bool IsAppiumServerRunning(int port) } } - public static bool isExpectedDataAvailableInSessionDetails(string data) + public static bool isExpectedDataAvailableInSessionDetails(string udid, string data) { + string sessionId = sessionIdUDID.FirstOrDefault(x => x.Value == udid).Key; Dictionary readPortData = Database.QueryDataFromPortNumberTable(); int port = 0; for (int i = 1; i <= 5; i++) @@ -574,38 +593,15 @@ public static bool isExpectedDataAvailableInSessionDetails(string data) { continue; } - var options = new RestClientOptions("http://localhost:" + port) - { - Timeout = TimeSpan.FromSeconds(5), - }; - var client = new RestClient(options); - var request = new RestRequest("/sessions", Method.Get); - RestResponse response = client.Execute(request); - Console.WriteLine(response.Content); - if (response.StatusCode == HttpStatusCode.OK && response.Content != null) + + string androidId = GetAndroidIdFromAppiumServer(port, sessionId); + if (androidId.Equals(data)) { - if (response.Content.Equals("{\"value\":[]}")) - { - continue; - } - else - { - JObject responseObj = JObject.Parse(response.Content); - string sessionId = responseObj["value"]?[0]?["id"]?.ToString() ?? string.Empty; - string androidId = GetAndroidIdFromAppiumServer(port, sessionId); - if (androidId.Equals(data)) - { - return true; - } - else - { - continue; - } - } + return true; } else { - return false; + continue; } } @@ -635,14 +631,14 @@ public static string GetAndroidIdFromAppiumServer(int appiumPort, string appiumS { try { - var options = new RestClientOptions("http://localhost:" + appiumPort) + var options = new RestClientOptions("http://127.0.0.1:"+appiumPort) { Timeout = TimeSpan.FromSeconds(5), }; var client = new RestClient(options); - var request = new RestRequest("/session/" + appiumSessionId + "/execute", Method.Post); + var request = new RestRequest("/session/"+appiumSessionId+"/execute/sync", Method.Post); request.AddHeader("Content-Type", "application/json"); - var body = @"{""script"":""mobile:deviceInfo"",""args"":[]}"; + var body = @"{""script"":""mobile:deviceInfo"",""args"": []}"; request.AddStringBody(body, DataFormat.Json); RestResponse response = client.Execute(request); Console.WriteLine(response.Content); diff --git a/Appium Wizard/OpenDevice.cs b/Appium Wizard/OpenDevice.cs index 92cf19f..c2f675f 100644 --- a/Appium Wizard/OpenDevice.cs +++ b/Appium Wizard/OpenDevice.cs @@ -523,12 +523,15 @@ await Task.Run(() => try { commonProgress.UpdateStepLabel(title, "Getting screen density...", 5); - try - { - MainScreen.udidScreenDensity[udid] = AndroidMethods.GetInstance().GetScreenDensity(udid); - } - catch (Exception) + if (!MainScreen.useScrcpy) { + try + { + MainScreen.udidScreenDensity[udid] = AndroidMethods.GetInstance().GetScreenDensity(udid); + } + catch (Exception) + { + } } commonProgress.UpdateStepLabel(title, "Checking UIAutomator installation...", 10); AndroidMethods.GetInstance().UninstallOtherInstrumentationApps(udid); @@ -609,13 +612,13 @@ await Task.Run(() => if (isSessionCreated) { string androidId = AppiumServerSetup.GetAndroidId(proxyPort, sessionIdAvailableForAutomation); - isItValidSession = AppiumServerSetup.isExpectedDataAvailableInSessionDetails(androidId); + isItValidSession = AppiumServerSetup.isExpectedDataAvailableInSessionDetails(udid,androidId); if (isItValidSession == false) { isSessionCreated = false; } } - if (isSessionCreated && !isItValidSession) + if (!isItValidSession) { commonProgress.UpdateStepLabel(title, "Restarting UIAutomator...", 80); AndroidMethods.GetInstance().StopUIAutomator(udid);