@@ -67,6 +67,32 @@ function startSeleniumServer(jar) {
67
67
}
68
68
69
69
70
+ /**
71
+ * {@linkplain webdriver.WebDriver#setFileDetector WebDriver's setFileDetector }
72
+ * method uses a non-standard command to transfer files from the local client
73
+ * to the remote end hosting the browser. Many of the WebDriver sub-types, like
74
+ * the {@link chrome.Driver} and {@link firefox.Driver}, do not support this
75
+ * command. Thus, these classes override the `setFileDetector` to no-op.
76
+ *
77
+ * This function uses a mixin to re-enable `setFileDetector` by calling the
78
+ * original method on the WebDriver prototype directly. This is used only when
79
+ * the builder creates a Chrome or Firefox instance that communicates with a
80
+ * remote end (and thus, support for remote file detectors is unknown).
81
+ *
82
+ * @param {function(new: webdriver.WebDriver, ...?) } ctor
83
+ * @return {function(new: webdriver.WebDriver, ...?) }
84
+ */
85
+ function ensureFileDetectorsAreEnabled ( ctor ) {
86
+ const mixin = class extends ctor {
87
+ /** @param {input.FileDetector } detector */
88
+ setFileDetector ( detector ) {
89
+ webdriver . WebDriver . prototype . setFileDetector . call ( this , detector ) ;
90
+ }
91
+ } ;
92
+ return mixin ;
93
+ }
94
+
95
+
70
96
/**
71
97
* Creates new {@link webdriver.WebDriver WebDriver} instances. The environment
72
98
* variables listed below may be used to override a builder's configuration,
@@ -487,7 +513,7 @@ class Builder {
487
513
}
488
514
489
515
// Check for a remote browser.
490
- var url = this . url_ ;
516
+ let url = this . url_ ;
491
517
if ( ! this . ignoreEnv_ ) {
492
518
if ( process . env . SELENIUM_REMOTE_URL ) {
493
519
url = process . env . SELENIUM_REMOTE_URL ;
@@ -502,11 +528,13 @@ class Builder {
502
528
let executor = new _http . Executor ( client ) ;
503
529
504
530
if ( browser === Browser . CHROME ) {
505
- return new chrome . Driver ( capabilities , null , this . flow_ , executor ) ;
531
+ const driver = ensureFileDetectorsAreEnabled ( chrome . Driver ) ;
532
+ return new driver ( capabilities , null , this . flow_ , executor ) ;
506
533
}
507
534
508
535
if ( browser === Browser . FIREFOX ) {
509
- return new firefox . Driver ( capabilities , this . flow_ , executor ) ;
536
+ const driver = ensureFileDetectorsAreEnabled ( firefox . Driver ) ;
537
+ return new driver ( capabilities , this . flow_ , executor ) ;
510
538
}
511
539
512
540
return WebDriver . createSession ( executor , capabilities , this . flow_ ) ;
0 commit comments