From 12ea3a2dbe0a416655b381e1b0434252bfd7c64e Mon Sep 17 00:00:00 2001 From: Joshua Goldberg Date: Wed, 18 Jul 2018 22:07:41 -0700 Subject: [PATCH 1/2] Added a basic ServiceBuilder for Internet Explorer Adds it to IE's `Driver` and allows it to be specified with a new `setIeService` in the general `Builder`. Fixes #5983 --- javascript/node/selenium-webdriver/ie.js | 31 +++++++++++++++++++-- javascript/node/selenium-webdriver/index.js | 18 +++++++++++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/javascript/node/selenium-webdriver/ie.js b/javascript/node/selenium-webdriver/ie.js index 095710a6109ba..e679335eda949 100644 --- a/javascript/node/selenium-webdriver/ie.js +++ b/javascript/node/selenium-webdriver/ie.js @@ -360,6 +360,23 @@ function createServiceFromCapabilities(capabilities) { } +/** + * Creates {@link selenium-webdriver/remote.DriverService} instances that manage + * an [IEDriverServer](https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver) + * server in a child process. + */ +class ServiceBuilder extends remote.DriverService.Builder { + /** + * @param {string=} opt_exe Path to the server executable to use. If omitted, + * the builder will attempt to locate the IEDriverServer on the system PATH. + */ + constructor(opt_exe) { + super(opt_exe || IEDRIVER_EXE); + this.setLoopback(true); // Required. + } +} + + /** * A WebDriver client for Microsoft's Internet Explorer. */ @@ -368,12 +385,21 @@ class Driver extends webdriver.WebDriver { * Creates a new session for Microsoft's Internet Explorer. * * @param {(Capabilities|Options)=} options The configuration options. + * @param {(remote.DriverService)=} opt_service The `DriverService` to use + * to start the IEDriverServer in a child process, optionally. * @return {!Driver} A new driver instance. */ - static createSession(options) { + static createSession(options, opt_service) { options = options || new Options(); - let service = createServiceFromCapabilities(options); + let service; + + if (opt_service instanceof remote.DriverService) { + service = opt_service; + } else { + service = createServiceFromCapabilities(options); + } + let client = service.start().then(url => new http.HttpClient(url)); let executor = new http.Executor(client); @@ -396,5 +422,6 @@ class Driver extends webdriver.WebDriver { exports.Driver = Driver; exports.Options = Options; exports.Level = Level; +exports.ServiceBuilder = ServiceBuilder; exports.locateSynchronously = locateSynchronously; diff --git a/javascript/node/selenium-webdriver/index.js b/javascript/node/selenium-webdriver/index.js index aa8b8a9adbef9..6c0a4c090dc5c 100644 --- a/javascript/node/selenium-webdriver/index.js +++ b/javascript/node/selenium-webdriver/index.js @@ -490,6 +490,18 @@ class Builder { return this; } + /** + * Sets the {@link ie.ServiceBuilder} to use to manage the geckodriver + * child process when creating IE sessions locally. + * + * @param {ie.ServiceBuilder} service the service to use. + * @return {!Builder} a self reference. + */ + setIeService(service) { + this.ieService_ = service; + return this; + } + /** * Set {@linkplain edge.Options options} specific to Microsoft's Edge browser * for drivers created by this builder. Any proxy settings defined on the @@ -656,7 +668,11 @@ class Builder { } case Browser.INTERNET_EXPLORER: - return createDriver(ie.Driver, capabilities); + let service = null; + if (this.ieService_) { + service = this.ieService_.build(); + } + return createDriver(ie.Driver, capabilities, service); case Browser.EDGE: { let service = null; From 146733a4f9b7d3db3c78ac3a6dcfb7c2ae834f71 Mon Sep 17 00:00:00 2001 From: Joshua Goldberg Date: Mon, 30 Jul 2018 19:04:20 -0700 Subject: [PATCH 2/2] Added IE service --- javascript/node/selenium-webdriver/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/javascript/node/selenium-webdriver/index.js b/javascript/node/selenium-webdriver/index.js index 6c0a4c090dc5c..d691b41de3e2b 100644 --- a/javascript/node/selenium-webdriver/index.js +++ b/javascript/node/selenium-webdriver/index.js @@ -223,6 +223,9 @@ class Builder { /** @private {ie.Options} */ this.ieOptions_ = null; + + /** @private {ie.ServiceBuilder} */ + this.ieService_ = null; /** @private {safari.Options} */ this.safariOptions_ = null;