11import { URLSearchParams } from "url" ;
22import URI from "urijs" ;
33import { isBoolean , assign , isEmpty , set } from "lodash" ;
4- import { remote } from "@testplane/webdriverio" ;
5- import type { Capabilities } from "@testplane/wdio-types" ;
4+ import { WebDriver } from "@testplane/webdriver" ;
5+ import { sessionEnvironmentDetector } from "@testplane/wdio-utils" ;
6+ import { attach , remote } from "@testplane/webdriverio" ;
7+ import type { Capabilities , Options } from "@testplane/wdio-types" ;
68
79import { Browser , BrowserOpts } from "./browser" ;
810import signalHandler from "../signal-handler" ;
@@ -104,9 +106,62 @@ export class NewBrowser extends Browser {
104106 }
105107
106108 protected async _createSession ( ) : Promise < WebdriverIO . Browser > {
107- const sessionOpts = await this . _getSessionOpts ( ) ;
109+ if ( this . _isDevtools ( ) ) {
110+ return this . _getSessionOpts ( ) . then ( remote ) ;
111+ }
112+
113+ let sessionOptsException = null ;
114+ const sessionOptsPromise = this . _getSessionOpts ( ) // starts installing browsers + launching driver process...
115+ . catch ( exception => {
116+ sessionOptsException = exception ;
117+ } ) ;
118+
119+ const isUsingThirtPartyGrid = typeof this . _config . user === "string" && typeof this . _config . key === "string" ;
120+ let thirdPartyGridCustomOptions = { } ;
121+
122+ if ( isUsingThirtPartyGrid && ! this . _isLocalGridUrl ( ) ) {
123+ const gridUri = new URI ( this . _config . gridUrl ) ;
124+
125+ thirdPartyGridCustomOptions = await import ( "./third-party-grid" ) . then ( m =>
126+ m . detectBackend ( {
127+ port : gridUri . port ( ) ? parseInt ( gridUri . port ( ) , 10 ) : DEFAULT_PORT ,
128+ hostname : this . _getGridHost ( gridUri ) ,
129+ user : this . _config . user ,
130+ key : this . _config . key ,
131+ protocol : gridUri . protocol ( ) ,
132+ region : this . _config . region as Options . SauceRegions | undefined ,
133+ path : gridUri . path ( ) ,
134+ capabilities : this . _config . desiredCapabilities , // we dont need exact caps here
135+ } ) ,
136+ ) ;
137+ }
108138
109- return remote ( sessionOpts ) ;
139+ const sessionOpts = await sessionOptsPromise ;
140+
141+ if ( sessionOptsException ) {
142+ throw sessionOptsException ;
143+ }
144+
145+ const fullSessionOpts = Object . assign ( sessionOpts ! , thirdPartyGridCustomOptions ) ;
146+ const session = await WebDriver . newSession ( fullSessionOpts ) . then ( res => {
147+ return res ;
148+ } ) ;
149+
150+ const detectedSessionEnvFlags = sessionEnvironmentDetector ( {
151+ capabilities : session . capabilities ,
152+ requestedCapabilities : fullSessionOpts . capabilities ,
153+ } ) ;
154+
155+ return attach ( {
156+ sessionId : session . sessionId ,
157+ ...session . options ,
158+ ...this . _getSessionOptsFromConfig ( [ "transformRequest" , "transformResponse" ] ) ,
159+ ...detectedSessionEnvFlags ,
160+ ...this . _config . sessionEnvFlags ,
161+ options : session . options ,
162+ capabilities : session . capabilities ,
163+ requestedCapabilities : fullSessionOpts . capabilities as WebdriverIO . Capabilities ,
164+ } ) ;
110165 }
111166
112167 protected async _setPageLoadTimeout ( ) : Promise < void > {
@@ -133,6 +188,10 @@ export class NewBrowser extends Browser {
133188 return this . _config . gridUrl === LOCAL_GRID_URL || getInstance ( ) . local ;
134189 }
135190
191+ protected _isDevtools ( ) : boolean {
192+ return this . _config . automationProtocol === DEVTOOLS_PROTOCOL || getInstance ( ) . devtools ;
193+ }
194+
136195 protected async _getSessionOpts ( ) : Promise < Capabilities . WebdriverIOConfig > {
137196 const config = this . _config ;
138197
@@ -150,16 +209,14 @@ export class NewBrowser extends Browser {
150209
151210 const capabilities = await this . _extendCapabilities ( config ) ;
152211
153- const { devtools } = getInstance ( ) ;
154-
155212 const options = {
156213 protocol : gridUri . protocol ( ) ,
157214 hostname : this . _getGridHost ( gridUri ) ,
158215 port : gridUri . port ( ) ? parseInt ( gridUri . port ( ) , 10 ) : DEFAULT_PORT ,
159216 path : gridUri . path ( ) ,
160217 queryParams : this . _getQueryParams ( gridUri . query ( ) ) ,
161218 capabilities,
162- automationProtocol : devtools ? DEVTOOLS_PROTOCOL : config . automationProtocol ,
219+ automationProtocol : this . _isDevtools ( ) ? DEVTOOLS_PROTOCOL : config . automationProtocol ,
163220 connectionRetryTimeout : config . sessionRequestTimeout || config . httpTimeout ,
164221 connectionRetryCount : 3 ,
165222 baseUrl : config . baseUrl ,
0 commit comments