Skip to content

Commit

Permalink
fix(local): allow local driver provider to use gecko driver from config
Browse files Browse the repository at this point in the history
- Add gecko driver as configuration option to be used in the local
  driver provider.
- Nit fixes to use string[] over Array<string> in the configParser.ts
- Add functionality to addDefaultBinaryLocs_ to use the geckoDriver
  value set in the config or to check locally in the
  webdriver-manager/selenium folder
- Fix transpile errors in locator. Missing toString in ProtractorLocator
  interface
- Fix transpile errors in element. Cast wdpromise.Promise<{}> to
  wdpromise.Promise<T>

closes angular#4408 and closes angular#4411.
  • Loading branch information
cnishina committed Jul 30, 2017
1 parent c0b8770 commit bec33ad
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 22 deletions.
8 changes: 4 additions & 4 deletions lib/browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ export interface ElementHelper extends Function {
*/
function buildElementHelper(browser: ProtractorBrowser): ElementHelper {
let element = ((locator: Locator) => {
return new ElementArrayFinder(browser).all(locator).toElementFinder_();
}) as ElementHelper;
return new ElementArrayFinder(browser).all(locator).toElementFinder_();
}) as ElementHelper;

element.all = (locator: Locator) => {
return new ElementArrayFinder(browser).all(locator);
Expand Down Expand Up @@ -1047,8 +1047,8 @@ export class ProtractorBrowser extends AbstractExtendedWebDriver {
clientSideScripts.setLocation, 'Protractor.setLocation()', rootEl, url)
.then((browserErr: Error) => {
if (browserErr) {
throw 'Error while navigating to \'' + url +
'\' : ' + JSON.stringify(browserErr);
throw 'Error while navigating to \'' + url + '\' : ' +
JSON.stringify(browserErr);
}
}));
}
Expand Down
14 changes: 10 additions & 4 deletions lib/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,16 +66,22 @@ export interface Config {
jvmArgs?: string[];
};
/**
* ChromeDriver location is used to help find the chromedriver binary.
* This will be passed to the Selenium jar as the system property
* webdriver.chrome.driver. If null, Selenium will attempt to find
* ChromeDriver using PATH.
* ChromeDriver location is used to help find the chromedriver binary. This will be passed to the
* Selenium jar as the system property webdriver.chrome.driver. If the value is not set when
* launching locally, it will use the default values downloaded from webdriver-manager.
*
* example:
* chromeDriver: './node_modules/webdriver-manager/selenium/chromedriver_2.20'
*/
chromeDriver?: string;

/**
* geckoDriver location is used to help find the gecko binary. This will be passed to the Selenium
* jar as the system property webdriver.gecko.driver. If the value is not set when launching
* locally, it will use the default values downloaded from webdriver-manager.
*/
geckoDriver?: string;

// ---- 2. To connect to a Selenium Server which is already running ----------

/**
Expand Down
20 changes: 10 additions & 10 deletions lib/configParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,8 @@ export class ConfigParser {
* @return {Array} The resolved file paths.
*/
public static resolveFilePatterns(
patterns: Array<string>|string, opt_omitWarnings?: boolean,
opt_relativeTo?: string): Array<string> {
let resolvedFiles: Array<string> = [];
patterns: string[]|string, opt_omitWarnings?: boolean, opt_relativeTo?: string): string[] {
let resolvedFiles: string[] = [];
let cwd = opt_relativeTo || process.cwd();

patterns = (typeof patterns === 'string') ? [patterns] : patterns;
Expand All @@ -82,8 +81,8 @@ export class ConfigParser {
*
* @return {Array} An array of globs locating the spec files
*/
static getSpecs(config: Config): Array<string> {
let specs: Array<string> = [];
static getSpecs(config: Config): string[] {
let specs: string[] = [];
if (config.suite) {
config.suite.split(',').forEach((suite) => {
let suiteList = config.suites ? config.suites[suite] : null;
Expand Down Expand Up @@ -115,8 +114,9 @@ export class ConfigParser {
private addConfig_(additionalConfig: any, relativeTo: string): void {
// All filepaths should be kept relative to the current config location.
// This will not affect absolute paths.
['seleniumServerJar', 'chromeDriver', 'onPrepare', 'firefoxPath', 'frameworkPath'].forEach(
(name) => {
['seleniumServerJar', 'chromeDriver', 'firefoxPath', 'frameworkPath', 'geckoDriver',
'onPrepare']
.forEach((name: string) => {
if (additionalConfig[name] && typeof additionalConfig[name] === 'string') {
additionalConfig[name] = path.resolve(relativeTo, additionalConfig[name]);
}
Expand Down Expand Up @@ -206,10 +206,10 @@ let makeArray = function(item: any): any {
* Adds to an array all the elements in another array without adding any
* duplicates
*
* @param {Array<string>} dest The array to add to
* @param {Array<string>} src The array to copy from
* @param {string[]} dest The array to add to
* @param {string[]} src The array to copy from
*/
let union = function(dest: Array<string>, src: Array<string>): void {
let union = function(dest: string[], src: string[]): void {
let elems: any = {};
for (let key in dest) {
elems[dest[key]] = true;
Expand Down
31 changes: 31 additions & 0 deletions lib/driverProviders/local.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,37 @@ export class Local extends DriverProvider {
}
}
}

if (this.config_.capabilities.browserName === 'firefox') {
if (!this.config_.geckoDriver) {
logger.debug(
'Attempting to find the gecko driver binary in the default ' +
'location used by webdriver-manager');

try {
let updateJson = path.resolve(SeleniumConfig.getSeleniumDir(), 'update-config.json');
let updateConfig = JSON.parse(fs.readFileSync(updateJson).toString());
this.config_.geckoDriver = updateConfig.gecko.last;
} catch (err) {
throw new BrowserError(
logger,
'No update-config.json found. ' +
'Run \'webdriver-manager update\' to download binaries.');
}
}

// Check if file exists, if not try .exe or fail accordingly
if (!fs.existsSync(this.config_.geckoDriver)) {
if (fs.existsSync(this.config_.geckoDriver + '.exe')) {
this.config_.geckoDriver += '.exe';
} else {
throw new BrowserError(
logger,
'Could not find gecko driver at ' + this.config_.geckoDriver +
'. Run \'webdriver-manager update\' to download binaries.');
}
}
}
}

/**
Expand Down
6 changes: 3 additions & 3 deletions lib/driverProviders/sauce.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,9 @@ export class Sauce extends DriverProvider {
this.config_.capabilities['build'] = this.config_.sauceBuild;
let protocol = this.config_.sauceSeleniumUseHttp ? 'http://' : 'https://';
let auth = protocol + this.config_.sauceUser + ':' + this.config_.sauceKey + '@';
this.config_.seleniumAddress = auth +
(this.config_.sauceSeleniumAddress ? this.config_.sauceSeleniumAddress :
'ondemand.saucelabs.com:443/wd/hub');
this.config_.seleniumAddress =
auth + (this.config_.sauceSeleniumAddress ? this.config_.sauceSeleniumAddress :
'ondemand.saucelabs.com:443/wd/hub');

// Append filename to capabilities.name so that it's easier to identify
// tests.
Expand Down
2 changes: 1 addition & 1 deletion lib/element.ts
Original file line number Diff line number Diff line change
Expand Up @@ -656,7 +656,7 @@ export class ElementArrayFinder extends WebdriverWebElement {
let list = arr.map((elementFinder?: ElementFinder, index?: number) => {
let mapResult = mapFn(elementFinder, index);
// All nested arrays and objects will also be fully resolved.
return wdpromise.fullyResolved(mapResult);
return wdpromise.fullyResolved(mapResult) as wdpromise.Promise<T>;
});
return wdpromise.all(list);
});
Expand Down
1 change: 1 addition & 0 deletions lib/locators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export interface ProtractorLocator {
rootSelector: string) => wdpromise.Promise<WebElement[]>;
row?: (index: number) => Locator;
column?: (index: string) => Locator;
toString?: () => string;
}
export type Locator = ProtractorLocator | WebDriverLocator;

Expand Down

0 comments on commit bec33ad

Please sign in to comment.