Skip to content

Commit 39264df

Browse files
authored
Merge pull request #9 from Nick-1234531/DOT-5046/cli-sync-changes
changes for sync
2 parents 33c3150 + fee12f2 commit 39264df

File tree

2 files changed

+89
-17
lines changed

2 files changed

+89
-17
lines changed

LambdaTest.Sdk.Utils/SmartUI.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public static class SmartUI
1414
private static readonly HttpClient HttpClient = new();
1515
private static readonly ILogger SdkUtilsLogger = Logger.CreateLogger("LambdaTest.Sdk.Utils");
1616

17+
1718
public static async Task<bool> IsSmartUIEnabled()
1819
{
1920
try
@@ -86,6 +87,38 @@ public static async Task<string> PostSnapshot(DomObject snapshot, string pkg, D
8687
}
8788
}
8889

90+
public static async Task<string> GetSnapshotStatus(string contextId, int pollTimeout, string snapshotName)
91+
{
92+
try
93+
{
94+
var url = $"{Constants.GetSmartUIServerAddress()}/snapshot/status?contextId={contextId}&pollTimeout={pollTimeout}&snapshotName={snapshotName}";
95+
96+
// Using statement ensures proper disposal of HttpClient
97+
using (var client = new HttpClient())
98+
{
99+
client.Timeout = TimeSpan.FromHours(4);
100+
101+
var response = await client.GetAsync(url);
102+
103+
// Ensure successful status code
104+
response.EnsureSuccessStatusCode();
105+
106+
var responseBody = await response.Content.ReadAsStringAsync();
107+
return responseBody;
108+
}
109+
}
110+
catch (HttpRequestException e)
111+
{
112+
SdkUtilsLogger.LogDebug($"Snapshot Status Error: {e.Message}");
113+
throw new Exception("Snapshot Status Error", e);
114+
}
115+
catch (Exception e)
116+
{
117+
SdkUtilsLogger.LogDebug($"Get Snapshot Status failed: {e.Message}");
118+
throw new Exception("Get Snapshot Status failed", e);
119+
}
120+
}
121+
89122
public class Resource
90123
{
91124
public string content { get; set; } = string.Empty;

LambdaTest.Selenium.Driver/SmartUI.cs

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public static class SmartUISnapshot
1313
{
1414
private static readonly ILogger SmartUILogger = Logger.CreateLogger("Lambdatest.Selenium.Driver");
1515

16-
public static async Task CaptureSnapshot(IWebDriver driver, string name, Dictionary<string, object>? options = null)
16+
public static async Task<String> CaptureSnapshot(IWebDriver driver, string name, Dictionary<string, object>? options = null)
1717
{
1818
if (string.IsNullOrEmpty(name))
1919
{
@@ -31,7 +31,7 @@ public static async Task CaptureSnapshot(IWebDriver driver, string name, Diction
3131

3232
if (domSerializerResponse == null)
3333
{
34-
throw new Exception("Failed to fetch DOM serializer script repsonse.");
34+
throw new Exception("Failed to fetch DOM serializer script response.");
3535
}
3636

3737
var domSerializerScript = JsonSerializer.Deserialize<FetchDomSerializerResponse>(domSerializerResponse, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
@@ -46,22 +46,20 @@ public static async Task CaptureSnapshot(IWebDriver driver, string name, Diction
4646
((IJavaScriptExecutor)driver).ExecuteScript(script);
4747

4848
// Extract sessionId from driver
49-
string sessionId = null;
49+
string sessionId = "";
5050
if (driver is RemoteWebDriver remoteDriver)
5151
{
5252
sessionId = remoteDriver.SessionId.ToString();
5353
}
54-
54+
if (options == null)
55+
{
56+
options = new Dictionary<string, object>();
57+
}
5558
if (!string.IsNullOrEmpty(sessionId))
5659
{
57-
// Append sessionId to options
58-
if (options == null)
59-
{
60-
options = new Dictionary<string, object>();
61-
}
6260
options["sessionId"] = sessionId;
6361
}
64-
62+
6563
var optionsJSON = JsonSerializer.Serialize(options);
6664
var snapshotScript = @"
6765
var options = " + optionsJSON + @";
@@ -97,26 +95,67 @@ public static async Task CaptureSnapshot(IWebDriver driver, string name, Diction
9795
Url = domContent.Url
9896
};
9997

100-
var apiResponseJSON = await LambdaTest.Sdk.Utils.SmartUI.PostSnapshot(dom, "Lambdatest.Selenium.Driver", options);
101-
var apiResponse = JsonSerializer.Deserialize<ApiResponse>(apiResponseJSON, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
102-
103-
if (apiResponse?.Data?.Warnings != null && apiResponse.Data.Warnings.Count > 0)
98+
// Handle sync parameter if present
99+
if (options?.ContainsKey("sync") == true && (bool)options["sync"])
104100
{
105-
foreach (var warning in apiResponse.Data.Warnings)
101+
var contextId = Guid.NewGuid().ToString();
102+
options["contextId"] = contextId;
103+
104+
// Post Snapshot
105+
var apiResponseJSON = await LambdaTest.Sdk.Utils.SmartUI.PostSnapshot(dom, "Lambdatest.Selenium.Driver", options);
106+
var apiResponse = JsonSerializer.Deserialize<ApiResponse>(apiResponseJSON, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
107+
108+
if (apiResponse?.Data?.Warnings != null && apiResponse.Data.Warnings.Count > 0)
106109
{
107-
SmartUILogger.LogWarning(warning);
110+
foreach (var warning in apiResponse.Data.Warnings)
111+
{
112+
SmartUILogger.LogWarning(warning);
113+
}
114+
}
115+
116+
SmartUILogger.LogInformation($"Snapshot captured: {name}");
117+
118+
// Get Snapshot Status
119+
var timeout=600;
120+
if (options.ContainsKey("timeout")){
121+
var tempTimeout= (int)options["timeout"];
122+
if (tempTimeout<30||tempTimeout>900){
123+
SmartUILogger.LogWarning("Timeout value is out of range(30-900). Defaulting to 600 seconds.");
124+
}else{
125+
timeout=tempTimeout;
126+
}
108127
}
128+
var snapshotStatusJSON = await LambdaTest.Sdk.Utils.SmartUI.GetSnapshotStatus(contextId, timeout, name);
129+
var snapshotStatus = JsonSerializer.Deserialize<ApiResponse>(snapshotStatusJSON, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
130+
return snapshotStatusJSON;
109131
}
132+
else
133+
{
134+
// If sync is not true, simply post the snapshot
135+
var apiResponseJSON = await LambdaTest.Sdk.Utils.SmartUI.PostSnapshot(dom, "Lambdatest.Selenium.Driver", options);
136+
var apiResponse = JsonSerializer.Deserialize<ApiResponse>(apiResponseJSON, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
110137

111-
SmartUILogger.LogInformation($"Snapshot captured: {name}");
138+
if (apiResponse?.Data?.Warnings != null && apiResponse.Data.Warnings.Count > 0)
139+
{
140+
foreach (var warning in apiResponse.Data.Warnings)
141+
{
142+
SmartUILogger.LogWarning(warning);
143+
}
144+
}
145+
146+
SmartUILogger.LogInformation($"Snapshot captured: {name}");
147+
}
148+
return "";
112149
}
113150
catch (Exception e)
114151
{
115152
SmartUILogger.LogError($"SmartUI snapshot failed: {name}");
116153
SmartUILogger.LogError(e.ToString());
154+
return "";
117155
}
118156
}
119157

158+
120159
private class ApiResponse
121160
{
122161
public ApiData Data { get; set; } = new ApiData();

0 commit comments

Comments
 (0)