Skip to content

Commit a567ef8

Browse files
committed
[js] Fix WebDriver#setFileDetector when using driving Chrome or Firefox on a
remote machine.
1 parent 8205739 commit a567ef8

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

javascript/node/selenium-webdriver/CHANGES.md

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
* Moved the `builder.Builder` class into the main module (`selenium-webdriver`).
66
* Removed the `builder` module.
7+
* Fix `webdriver.WebDriver#setFileDetector` when driving Chrome or Firefox on a
8+
remote machine.
79

810

911
## v3.0.0-beta-1

javascript/node/selenium-webdriver/index.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,32 @@ function startSeleniumServer(jar) {
6767
}
6868

6969

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+
7096
/**
7197
* Creates new {@link webdriver.WebDriver WebDriver} instances. The environment
7298
* variables listed below may be used to override a builder's configuration,
@@ -487,7 +513,7 @@ class Builder {
487513
}
488514

489515
// Check for a remote browser.
490-
var url = this.url_;
516+
let url = this.url_;
491517
if (!this.ignoreEnv_) {
492518
if (process.env.SELENIUM_REMOTE_URL) {
493519
url = process.env.SELENIUM_REMOTE_URL;
@@ -502,11 +528,13 @@ class Builder {
502528
let executor = new _http.Executor(client);
503529

504530
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);
506533
}
507534

508535
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);
510538
}
511539

512540
return WebDriver.createSession(executor, capabilities, this.flow_);

javascript/node/selenium-webdriver/lib/webdriver.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1997,7 +1997,7 @@ class WebElement {
19971997
}).then(function(keys) {
19981998
return element.schedule_(
19991999
new command.Command(command.Name.SEND_KEYS_TO_ELEMENT).
2000-
setParameter('value', [keys]),
2000+
setParameter('value', keys.split('')),
20012001
'WebElement.sendKeys()');
20022002
});
20032003
}, 'WebElement.sendKeys()');

0 commit comments

Comments
 (0)