Skip to content

Commit

Permalink
[js] Fix WebDriver#setFileDetector when using driving Chrome or Firef…
Browse files Browse the repository at this point in the history
…ox on a

remote machine.
  • Loading branch information
jleyba committed Aug 8, 2016
1 parent 8205739 commit a567ef8
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 4 deletions.
2 changes: 2 additions & 0 deletions javascript/node/selenium-webdriver/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

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


## v3.0.0-beta-1
Expand Down
34 changes: 31 additions & 3 deletions javascript/node/selenium-webdriver/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,32 @@ function startSeleniumServer(jar) {
}


/**
* {@linkplain webdriver.WebDriver#setFileDetector WebDriver's setFileDetector}
* method uses a non-standard command to transfer files from the local client
* to the remote end hosting the browser. Many of the WebDriver sub-types, like
* the {@link chrome.Driver} and {@link firefox.Driver}, do not support this
* command. Thus, these classes override the `setFileDetector` to no-op.
*
* This function uses a mixin to re-enable `setFileDetector` by calling the
* original method on the WebDriver prototype directly. This is used only when
* the builder creates a Chrome or Firefox instance that communicates with a
* remote end (and thus, support for remote file detectors is unknown).
*
* @param {function(new: webdriver.WebDriver, ...?)} ctor
* @return {function(new: webdriver.WebDriver, ...?)}
*/
function ensureFileDetectorsAreEnabled(ctor) {
const mixin = class extends ctor {
/** @param {input.FileDetector} detector */
setFileDetector(detector) {
webdriver.WebDriver.prototype.setFileDetector.call(this, detector);
}
};
return mixin;
}


/**
* Creates new {@link webdriver.WebDriver WebDriver} instances. The environment
* variables listed below may be used to override a builder's configuration,
Expand Down Expand Up @@ -487,7 +513,7 @@ class Builder {
}

// Check for a remote browser.
var url = this.url_;
let url = this.url_;
if (!this.ignoreEnv_) {
if (process.env.SELENIUM_REMOTE_URL) {
url = process.env.SELENIUM_REMOTE_URL;
Expand All @@ -502,11 +528,13 @@ class Builder {
let executor = new _http.Executor(client);

if (browser === Browser.CHROME) {
return new chrome.Driver(capabilities, null, this.flow_, executor);
const driver = ensureFileDetectorsAreEnabled(chrome.Driver);
return new driver(capabilities, null, this.flow_, executor);
}

if (browser === Browser.FIREFOX) {
return new firefox.Driver(capabilities, this.flow_, executor);
const driver = ensureFileDetectorsAreEnabled(firefox.Driver);
return new driver(capabilities, this.flow_, executor);
}

return WebDriver.createSession(executor, capabilities, this.flow_);
Expand Down
2 changes: 1 addition & 1 deletion javascript/node/selenium-webdriver/lib/webdriver.js
Original file line number Diff line number Diff line change
Expand Up @@ -1997,7 +1997,7 @@ class WebElement {
}).then(function(keys) {
return element.schedule_(
new command.Command(command.Name.SEND_KEYS_TO_ELEMENT).
setParameter('value', [keys]),
setParameter('value', keys.split('')),
'WebElement.sendKeys()');
});
}, 'WebElement.sendKeys()');
Expand Down

0 comments on commit a567ef8

Please sign in to comment.