2016-08-03 15:00:07 -07:00
|
|
|
/**
|
|
|
|
|
* @license
|
|
|
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
|
|
|
* found in the LICENSE file at https://angular.io/license
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import * as webdriver from 'selenium-webdriver';
|
|
|
|
|
|
2015-05-27 14:57:54 -07:00
|
|
|
import {WebDriverAdapter} from '../web_driver_adapter';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Adapter for the selenium-webdriver.
|
|
|
|
|
*/
|
|
|
|
|
export class SeleniumWebDriverAdapter extends WebDriverAdapter {
|
2016-08-26 16:34:08 -07:00
|
|
|
static PROTRACTOR_PROVIDERS = [{
|
|
|
|
|
provide: WebDriverAdapter,
|
|
|
|
|
useFactory: () => new SeleniumWebDriverAdapter((<any>global).browser)
|
|
|
|
|
}];
|
2015-05-27 14:57:54 -07:00
|
|
|
|
|
|
|
|
constructor(private _driver: any) { super(); }
|
|
|
|
|
|
2016-08-03 15:00:07 -07:00
|
|
|
/** @internal */
|
2016-08-26 16:34:08 -07:00
|
|
|
private _convertPromise(thenable: PromiseLike<any>) {
|
2016-08-02 15:53:34 -07:00
|
|
|
var resolve: (result: any) => void;
|
|
|
|
|
var reject: (error: any) => void;
|
|
|
|
|
var promise = new Promise((res, rej) => {
|
|
|
|
|
resolve = res;
|
|
|
|
|
reject = rej;
|
|
|
|
|
});
|
2015-05-27 14:57:54 -07:00
|
|
|
thenable.then(
|
|
|
|
|
// selenium-webdriver uses an own Node.js context,
|
|
|
|
|
// so we need to convert data into objects of this context.
|
2016-08-26 16:34:08 -07:00
|
|
|
(data: any) => resolve(convertToLocalProcess(data)), reject);
|
2016-08-02 15:53:34 -07:00
|
|
|
return promise;
|
2015-05-27 14:57:54 -07:00
|
|
|
}
|
|
|
|
|
|
2016-08-26 16:34:08 -07:00
|
|
|
waitFor(callback: () => any): Promise<any> {
|
2015-05-27 14:57:54 -07:00
|
|
|
return this._convertPromise(this._driver.controlFlow().execute(callback));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
executeScript(script: string): Promise<any> {
|
|
|
|
|
return this._convertPromise(this._driver.executeScript(script));
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-08 13:51:10 -07:00
|
|
|
executeAsyncScript(script: string): Promise<any> {
|
|
|
|
|
return this._convertPromise(this._driver.executeAsyncScript(script));
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-27 14:57:54 -07:00
|
|
|
capabilities(): Promise<any> {
|
|
|
|
|
return this._convertPromise(
|
2016-08-26 16:34:08 -07:00
|
|
|
this._driver.getCapabilities().then((capsObject: any) => capsObject.serialize()));
|
2015-05-27 14:57:54 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logs(type: string): Promise<any> {
|
|
|
|
|
// Needed as selenium-webdriver does not forward
|
|
|
|
|
// performance logs in the correct way via manage().logs
|
|
|
|
|
return this._convertPromise(this._driver.schedule(
|
|
|
|
|
new webdriver.Command(webdriver.CommandName.GET_LOG).setParameter('type', type),
|
|
|
|
|
'WebDriver.manage().logs().get(' + type + ')'));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-26 16:34:08 -07:00
|
|
|
function convertToLocalProcess(data: any): Object {
|
2015-05-27 14:57:54 -07:00
|
|
|
var serialized = JSON.stringify(data);
|
|
|
|
|
if ('' + serialized === 'undefined') {
|
|
|
|
|
return undefined;
|
|
|
|
|
}
|
|
|
|
|
return JSON.parse(serialized);
|
|
|
|
|
}
|