@@ -19,10 +19,10 @@ public class VisualClient : IDisposable
19
19
private readonly VisualApi < WebDriver > _api ;
20
20
private readonly string _sessionId ;
21
21
private readonly string _jobId ;
22
- private readonly string _sessionMetadataBlob ;
22
+ private string ? _sessionMetadataBlob ;
23
23
private readonly List < string > _screenshotIds = new List < string > ( ) ;
24
- public VisualBuild Build { get ; }
25
- private readonly bool _externalBuild ;
24
+ public VisualBuild Build { get ; private set ; }
25
+ private bool _externalBuild ;
26
26
public bool CaptureDom { get ; set ; } = false ;
27
27
private readonly ResiliencePipeline _retryPipeline ;
28
28
@@ -31,8 +31,9 @@ public class VisualClient : IDisposable
31
31
/// </summary>
32
32
/// <param name="wd">the instance of the WebDriver session</param>
33
33
/// <param name="region">the Sauce Labs region to connect to</param>
34
- public VisualClient ( WebDriver wd , Region region ) : this ( wd , region , EnvVars . Username , EnvVars . AccessKey )
34
+ public static async Task < VisualClient > Create ( WebDriver wd , Region region )
35
35
{
36
+ return await Create ( wd , region , EnvVars . Username , EnvVars . AccessKey , new CreateBuildOptions ( ) ) ;
36
37
}
37
38
38
39
/// <summary>
@@ -41,8 +42,9 @@ public VisualClient(WebDriver wd, Region region) : this(wd, region, EnvVars.User
41
42
/// <param name="wd">the instance of the WebDriver session</param>
42
43
/// <param name="region">the Sauce Labs region to connect to</param>
43
44
/// <param name="buildOptions">the options of the build creation</param>
44
- public VisualClient ( WebDriver wd , Region region , CreateBuildOptions buildOptions ) : this ( wd , region , EnvVars . Username , EnvVars . AccessKey , buildOptions )
45
+ public static async Task < VisualClient > Create ( WebDriver wd , Region region , CreateBuildOptions buildOptions )
45
46
{
47
+ return await Create ( wd , region , EnvVars . Username , EnvVars . AccessKey , buildOptions ) ;
46
48
}
47
49
48
50
/// <summary>
@@ -52,8 +54,9 @@ public VisualClient(WebDriver wd, Region region, CreateBuildOptions buildOptions
52
54
/// <param name="region">the Sauce Labs region to connect to</param>
53
55
/// <param name="username">the Sauce Labs username</param>
54
56
/// <param name="accessKey">the Sauce Labs access key</param>
55
- public VisualClient ( WebDriver wd , Region region , string username , string accessKey ) : this ( wd , region , username , accessKey , new CreateBuildOptions ( ) )
57
+ public static async Task < VisualClient > Create ( WebDriver wd , Region region , string username , string accessKey )
56
58
{
59
+ return await Create ( wd , region , username , accessKey , new CreateBuildOptions ( ) ) ;
57
60
}
58
61
59
62
/// <summary>
@@ -64,21 +67,20 @@ public VisualClient(WebDriver wd, Region region, CreateBuildOptions buildOptions
64
67
/// <param name="username">the Sauce Labs username</param>
65
68
/// <param name="accessKey">the Sauce Labs access key</param>
66
69
/// <param name="buildOptions">the options of the build creation</param>
67
- public VisualClient ( WebDriver wd , Region region , string username , string accessKey , CreateBuildOptions buildOptions )
70
+ public static async Task < VisualClient > Create ( WebDriver wd , Region region , string username , string accessKey , CreateBuildOptions buildOptions )
68
71
{
69
- if ( StringUtils . IsNullOrEmpty ( username ) || StringUtils . IsNullOrEmpty ( accessKey ) )
70
- {
71
- throw new VisualClientException ( "Username or Access Key not set" ) ;
72
- }
72
+ var client = new VisualClient ( wd , Region . UsWest1 , username , accessKey ) ;
73
+ await client . SetupBuild ( buildOptions ) ;
74
+ return client ;
75
+ }
73
76
74
- _api = new VisualApi < WebDriver > ( wd , region , username , accessKey ) ;
75
- _sessionId = wd . SessionId . ToString ( ) ;
76
- _jobId = wd . Capabilities . HasCapability ( "jobUuid" ) ? wd . Capabilities . GetCapability ( "jobUuid" ) . ToString ( ) : _sessionId ;
77
- var response = _api . WebDriverSessionInfo ( _jobId , _sessionId ) . Result ;
77
+ private async Task SetupBuild ( CreateBuildOptions buildOptions )
78
+ {
79
+ var response = await this . _api . WebDriverSessionInfo ( _jobId , _sessionId ) ;
78
80
var metadata = response . EnsureValidResponse ( ) ;
79
81
_sessionMetadataBlob = metadata . Result . Blob ;
80
82
81
- var build = GetEffectiveBuild ( EnvVars . BuildId , EnvVars . CustomId ) . Result ;
83
+ var build = await GetEffectiveBuild ( EnvVars . BuildId , EnvVars . CustomId ) ;
82
84
if ( build != null )
83
85
{
84
86
if ( ! build . IsRunning ( ) )
@@ -91,10 +93,29 @@ public VisualClient(WebDriver wd, Region region, string username, string accessK
91
93
else
92
94
{
93
95
buildOptions . CustomId ??= EnvVars . CustomId ;
94
- var createBuildResponse = CreateBuild ( buildOptions ) . Result ;
96
+ var createBuildResponse = await CreateBuild ( buildOptions ) ;
95
97
Build = new VisualBuild ( createBuildResponse . Id , createBuildResponse . Url , createBuildResponse . Mode ) ;
96
98
_externalBuild = false ;
97
99
}
100
+ }
101
+
102
+ /// <summary>
103
+ /// Creates a new instance of <c>VisualClient</c>
104
+ /// </summary>
105
+ /// <param name="wd">the instance of the WebDriver session</param>
106
+ /// <param name="region">the Sauce Labs region to connect to</param>
107
+ /// <param name="username">the Sauce Labs username</param>
108
+ /// <param name="accessKey">the Sauce Labs access key</param>
109
+ private VisualClient ( WebDriver wd , Region region , string username , string accessKey )
110
+ {
111
+ if ( StringUtils . IsNullOrEmpty ( username ) || StringUtils . IsNullOrEmpty ( accessKey ) )
112
+ {
113
+ throw new VisualClientException ( "Username or Access Key not set" ) ;
114
+ }
115
+
116
+ _api = new VisualApi < WebDriver > ( wd , region , username , accessKey ) ;
117
+ _sessionId = wd . SessionId . ToString ( ) ;
118
+ _jobId = wd . Capabilities . HasCapability ( "jobUuid" ) ? wd . Capabilities . GetCapability ( "jobUuid" ) . ToString ( ) : _sessionId ;
98
119
99
120
_retryPipeline = new ResiliencePipelineBuilder ( )
100
121
. AddRetry ( new RetryStrategyOptions ( )
@@ -212,7 +233,7 @@ public async Task<string> VisualCheck(string name, VisualCheckOptions? options =
212
233
diffingMethod : options ? . DiffingMethod ?? DiffingMethod . Simple ,
213
234
regions : ignored . ToArray ( ) ,
214
235
sessionId : _sessionId ,
215
- sessionMetadata : _sessionMetadataBlob ,
236
+ sessionMetadata : _sessionMetadataBlob ?? "" ,
216
237
captureDom : options ? . CaptureDom ?? CaptureDom ) ) ) . EnsureValidResponse ( ) ;
217
238
result . Result . Diffs . Nodes . ToList ( ) . ForEach ( d => _screenshotIds . Add ( d . Id ) ) ;
218
239
return result . Result . Id ;
0 commit comments