@@ -121,6 +121,7 @@ const zip = require('./io/zip')
121121const { Browser, Capabilities, Capability } = require ( './lib/capabilities' )
122122const { Zip } = require ( './io/zip' )
123123const { getBinaryPaths } = require ( './common/driverFinder' )
124+ const { findFreePort } = require ( './net/portprober' )
124125const FIREFOX_CAPABILITY_KEY = 'moz:firefoxOptions'
125126
126127/**
@@ -505,6 +506,31 @@ class ServiceBuilder extends remote.DriverService.Builder {
505506 enableVerboseLogging ( opt_trace ) {
506507 return this . addArguments ( opt_trace ? '-vv' : '-v' )
507508 }
509+
510+ /**
511+ * Overrides the parent build() method to add the websocket port argument
512+ * for Firefox when not connecting to an existing instance.
513+ *
514+ * @return {!DriverService } A new driver service instance.
515+ */
516+ build ( ) {
517+ let port = this . options_ . port || findFreePort ( )
518+ let argsPromise = Promise . resolve ( port ) . then ( ( port ) => {
519+ // Start with the default --port argument.
520+ let args = this . options_ . args . concat ( `--port=${ port } ` )
521+ // If the "--connect-existing" flag is not set, add the websocket port.
522+ if ( ! this . options_ . args . some ( ( arg ) => arg === '--connect-existing' ) ) {
523+ return findFreePort ( ) . then ( ( wsPort ) => {
524+ args . push ( `--websocket-port=${ wsPort } ` )
525+ return args
526+ } )
527+ }
528+ return args
529+ } )
530+
531+ let options = Object . assign ( { } , this . options_ , { args : argsPromise , port } )
532+ return new remote . DriverService ( this . exe_ , options )
533+ }
508534}
509535
510536/**
0 commit comments