You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.4 KiB

// Copyright 2011 Software Freedom Conservancy. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
var base = require('./_base'),
executors = require('./executors');
var goog = base.require('goog'),
AbstractBuilder = base.require('webdriver.AbstractBuilder'),
Browser = base.require('webdriver.Browser'),
Capability = base.require('webdriver.Capability'),
WebDriver = base.require('webdriver.WebDriver'),
promise = base.require('webdriver.promise');
/**
* @param {!webdriver.Capabilities} capabilities The desired capabilities.
* @return {webdriver.WebDriver} A new WebDriver instance or {@code null}
* if the requested browser is not natively supported in Node.
*/
function createNativeDriver(capabilities) {
switch (capabilities.get(Capability.BROWSER_NAME)) {
case Browser.CHROME:
// Requiring 'chrome' above would create a cycle:
// index -> builder -> chrome -> index
var chrome = require('./chrome');
return chrome.createDriver(capabilities);
case Browser.PHANTOM_JS:
// Requiring 'phantomjs' would create a cycle:
// index -> builder -> phantomjs -> index
var phantomjs = require('./phantomjs');
return phantomjs.createDriver(capabilities);
default:
return null;
}
}
/**
* Creates new {@link webdriver.WebDriver WebDriver} instances.
* @constructor
* @extends {webdriver.AbstractBuilder}
*/
var Builder = function() {
goog.base(this);
};
goog.inherits(Builder, AbstractBuilder);
/**
* Sets the proxy configuration to use for WebDriver clients created by this
* builder. Any calls to {@link #withCapabilities} after this function will
* overwrite these settings.
* @param {!proxy.ProxyConfig} config The configuration to use.
* @return {!Builder} A self reference.
*/
Builder.prototype.setProxy = function(config) {
this.getCapabilities().set(Capability.PROXY, config);
return this;
};
/**
* Sets Chrome-specific options for drivers created by this builder.
* @param {!chrome.Options} options The ChromeDriver options to use.
* @return {!Builder} A self reference.
*/
Builder.prototype.setChromeOptions = function(options) {
var newCapabilities = options.toCapabilities(this.getCapabilities());
return /** @type {!Builder} */(this.withCapabilities(newCapabilities));
};
/**
* @override
*/
Builder.prototype.build = function() {
var url = this.getServerUrl();
// If a remote server wasn't specified, check for browsers we support
// natively in node before falling back to using the java Selenium server.
if (!url) {
var driver = createNativeDriver(this.getCapabilities());
if (driver) {
return driver;
}
// Nope, fall-back to using the default java server.
url = AbstractBuilder.DEFAULT_SERVER_URL;
}
var executor = executors.createExecutor(url);
return WebDriver.createSession(executor, this.getCapabilities());
};
// PUBLIC API
exports.Builder = Builder;