@@ -20,7 +20,7 @@ use std::time::{Duration, Instant};
20
20
/// etc. It will return `Ok` if all tests finish successfully, and otherwise it
21
21
/// will return an error if some tests failed.
22
22
pub fn run ( server : & SocketAddr , shell : & Shell ) -> Result < ( ) , Error > {
23
- let ( driver, args) = Driver :: find ( ) ?;
23
+ let ( driver, args, mut client_args ) = Driver :: find ( ) ?;
24
24
println ! (
25
25
"Running headless tests in {} with `{}`" ,
26
26
driver. browser( ) ,
@@ -64,7 +64,7 @@ pub fn run(server: &SocketAddr, shell: &Shell) -> Result<(), Error> {
64
64
shell. status ( "Starting new webdriver session..." ) ;
65
65
// Allocate a new session with the webdriver protocol, and once we've done
66
66
// so schedule the browser to get closed with a call to `close_window`.
67
- let id = client. new_session ( & driver) ?;
67
+ let id = client. new_session ( & driver, & mut client_args ) ?;
68
68
client. session = Some ( id. clone ( ) ) ;
69
69
70
70
// Visit our local server to open up the page that runs tests, and then get
@@ -149,17 +149,20 @@ impl Driver {
149
149
/// * Env vars like `GECKODRIVER` point to the path to a binary to execute.
150
150
/// * Otherwise, `PATH` is searched for an appropriate binary.
151
151
///
152
- /// In both cases a list of auxiliary arguments is also returned which is
153
- /// configured through env vars like `GECKODRIVER_ARGS` to support extra
154
- /// arguments to the driver's invocation.
155
- fn find ( ) -> Result < ( Driver , Vec < String > ) , Error > {
156
- let env_args = |name : & str | {
157
- env:: var ( format ! ( "{}_ARGS" , name. to_uppercase( ) ) )
152
+ /// In both cases a lists of auxiliary arguments is also returned which is
153
+ /// configured through env vars like `GECKODRIVER_ARGS` and
154
+ /// `GECKODRIVER_CLIENT_ARGS` to support extra arguments to invocation the
155
+ /// driver and a browser respectively.
156
+ fn find ( ) -> Result < ( Driver , Vec < String > , Vec < String > ) , Error > {
157
+ let env_vars = |name : String | {
158
+ env:: var ( name)
158
159
. unwrap_or_default ( )
159
160
. split_whitespace ( )
160
161
. map ( |s| s. to_string ( ) )
161
162
. collect :: < Vec < _ > > ( )
162
163
} ;
164
+ let env_args = |name : & str | env_vars ( format ! ( "{}_ARGS" , name. to_uppercase( ) ) ) ;
165
+ let env_client_args = |name : & str | env_vars ( format ! ( "{}_CLIENT_ARGS" , name. to_uppercase( ) ) ) ;
163
166
164
167
let drivers = [
165
168
( "geckodriver" , Driver :: Gecko as fn ( PathBuf ) -> Driver ) ,
@@ -175,7 +178,7 @@ impl Driver {
175
178
Some ( path) => path,
176
179
None => continue ,
177
180
} ;
178
- return Ok ( ( ctor ( path. into ( ) ) , env_args ( driver) ) ) ;
181
+ return Ok ( ( ctor ( path. into ( ) ) , env_args ( driver) , env_client_args ( driver ) ) ) ;
179
182
}
180
183
181
184
// Next, check PATH. If we can find any supported driver, use that by
@@ -190,7 +193,7 @@ impl Driver {
190
193
Some ( p) => p,
191
194
None => continue ,
192
195
} ;
193
- return Ok ( ( ctor ( name. into ( ) ) , env_args ( name) ) ) ;
196
+ return Ok ( ( ctor ( name. into ( ) ) , env_args ( name) , env_client_args ( name ) ) ) ;
194
197
}
195
198
196
199
// TODO: download an appropriate driver? How to know which one to
@@ -255,7 +258,7 @@ enum Method<'a> {
255
258
// copied the `webdriver-client` crate when writing the below bindings.
256
259
257
260
impl Client {
258
- fn new_session ( & mut self , driver : & Driver ) -> Result < String , Error > {
261
+ fn new_session ( & mut self , driver : & Driver , args : & mut Vec < String > ) -> Result < String , Error > {
259
262
match driver {
260
263
Driver :: Gecko ( _) => {
261
264
#[ derive( Deserialize ) ]
@@ -268,11 +271,12 @@ impl Client {
268
271
#[ serde( rename = "sessionId" ) ]
269
272
session_id : String ,
270
273
}
274
+ args. push ( "-headless" . to_string ( ) ) ;
271
275
let request = json ! ( {
272
276
"capabilities" : {
273
277
"alwaysMatch" : {
274
278
"moz:firefoxOptions" : {
275
- "args" : [ "-headless" ] ,
279
+ "args" : args ,
276
280
}
277
281
}
278
282
}
@@ -316,17 +320,16 @@ impl Client {
316
320
#[ serde( rename = "sessionId" ) ]
317
321
session_id : String ,
318
322
}
323
+ args. push ( "headless" . to_string ( ) ) ;
324
+ // See https://stackoverflow.com/questions/50642308/
325
+ // for what this funky `disable-dev-shm-usage`
326
+ // option is
327
+ args. push ( "disable-dev-shm-usage" . to_string ( ) ) ;
328
+ args. push ( "no-sandbox" . to_string ( ) ) ;
319
329
let request = json ! ( {
320
330
"desiredCapabilities" : {
321
331
"goog:chromeOptions" : {
322
- "args" : [
323
- "headless" ,
324
- // See https://stackoverflow.com/questions/50642308/
325
- // for what this funky `disable-dev-shm-usage`
326
- // option is
327
- "disable-dev-shm-usage" ,
328
- "no-sandbox" ,
329
- ] ,
332
+ "args" : args,
330
333
} ,
331
334
}
332
335
} ) ;
0 commit comments