Fix benchpress for newest protractor and selenium (#11451)
* chore: update protractor and selenium-webdriver packages As `karma-jasmine` has a peer dependency on `jasmine-core@2.3`, but `jasmine` and `protractor` are using `jasmine-core@2.4` we need to add `jasmine-core@2.3` explicitly. Previously, the peer dependency was satisfied by accident because npm deduped the dependency for `jasmine-core@2.3` as top level dependency. Note that the shrink-wrap files changes quite a bit because of the deduping mechanism of npm. * fix(benchpress): make it work with latest protractor and seleniuv-webdriver * fix(e2e_tests): make them work with latest protractor
This commit is contained in:
committed by
Evan Martin
parent
71e9cae1d0
commit
f386cb4ba9
@@ -12,7 +12,7 @@
|
||||
"optionalDependencies": {
|
||||
"jpm": "1.1.4",
|
||||
"firefox-profile": "0.4.0",
|
||||
"selenium-webdriver": "3.0.0-beta-2"
|
||||
"selenium-webdriver": "^2.53.3"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -63,7 +63,7 @@ export class Runner {
|
||||
}
|
||||
|
||||
var inj = ReflectiveInjector.resolveAndCreate(sampleProviders);
|
||||
var adapter = inj.get(WebDriverAdapter);
|
||||
var adapter: WebDriverAdapter = inj.get(WebDriverAdapter);
|
||||
|
||||
return Promise
|
||||
.all([adapter.capabilities(), adapter.executeScript('return window.navigator.userAgent;')])
|
||||
|
||||
@@ -17,6 +17,6 @@ export abstract class WebDriverAdapter {
|
||||
waitFor(callback: Function): Promise<any> { throw new Error('NYI'); }
|
||||
executeScript(script: string): Promise<any> { throw new Error('NYI'); }
|
||||
executeAsyncScript(script: string): Promise<any> { throw new Error('NYI'); }
|
||||
capabilities(): Promise<Map<string, any>> { throw new Error('NYI'); }
|
||||
capabilities(): Promise<{[key: string]: any}> { throw new Error('NYI'); }
|
||||
logs(type: string): Promise<any[]> { throw new Error('NYI'); }
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ export abstract class WebDriverExtension {
|
||||
},
|
||||
{
|
||||
provide: WebDriverExtension,
|
||||
useFactory: (children: WebDriverExtension[], capabilities: any) => {
|
||||
useFactory: (children: WebDriverExtension[], capabilities: {[key: string]: any}) => {
|
||||
var delegate: WebDriverExtension;
|
||||
children.forEach(extension => {
|
||||
if (extension.supports(capabilities)) {
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import * as webdriver from 'selenium-webdriver';
|
||||
|
||||
import {WebDriverAdapter} from '../web_driver_adapter';
|
||||
|
||||
/**
|
||||
@@ -21,51 +19,52 @@ export class SeleniumWebDriverAdapter extends WebDriverAdapter {
|
||||
|
||||
constructor(private _driver: any) { super(); }
|
||||
|
||||
/** @internal */
|
||||
private _convertPromise(thenable: PromiseLike<any>) {
|
||||
var resolve: (result: any) => void;
|
||||
var reject: (error: any) => void;
|
||||
var promise = new Promise((res, rej) => {
|
||||
resolve = res;
|
||||
reject = rej;
|
||||
});
|
||||
thenable.then(
|
||||
// selenium-webdriver uses an own Node.js context,
|
||||
// so we need to convert data into objects of this context.
|
||||
(data: any) => resolve(convertToLocalProcess(data)), reject);
|
||||
return promise;
|
||||
}
|
||||
waitFor(callback: () => any): Promise<any> { return this._driver.call(callback); }
|
||||
|
||||
waitFor(callback: () => any): Promise<any> {
|
||||
return this._convertPromise(this._driver.controlFlow().execute(callback));
|
||||
}
|
||||
|
||||
executeScript(script: string): Promise<any> {
|
||||
return this._convertPromise(this._driver.executeScript(script));
|
||||
}
|
||||
executeScript(script: string): Promise<any> { return this._driver.executeScript(script); }
|
||||
|
||||
executeAsyncScript(script: string): Promise<any> {
|
||||
return this._convertPromise(this._driver.executeAsyncScript(script));
|
||||
return this._driver.executeAsyncScript(script);
|
||||
}
|
||||
|
||||
capabilities(): Promise<any> {
|
||||
return this._convertPromise(
|
||||
this._driver.getCapabilities().then((capsObject: any) => capsObject.serialize()));
|
||||
capabilities(): Promise<{[key: string]: any}> {
|
||||
return this._driver.getCapabilities().then((capsObject: any) => {
|
||||
const localData: {[key: string]: any} = {};
|
||||
capsObject.forEach((value: any, key: string) => { localData[key] = value; });
|
||||
return localData;
|
||||
});
|
||||
}
|
||||
|
||||
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 + ')'));
|
||||
return this._driver.schedule(
|
||||
new Command('getLog').setParameter('type', type),
|
||||
'WebDriver.manage().logs().get(' + type + ')');
|
||||
}
|
||||
}
|
||||
|
||||
function convertToLocalProcess(data: any): Object {
|
||||
var serialized = JSON.stringify(data);
|
||||
if ('' + serialized === 'undefined') {
|
||||
return undefined;
|
||||
/**
|
||||
* Copy of the `Command` class of webdriver as
|
||||
* it is not exposed via index.js in selenium-webdriver.
|
||||
*/
|
||||
class Command {
|
||||
private parameters_: {[key: string]: any} = {};
|
||||
constructor(private name_: string) {}
|
||||
|
||||
getName() { return this.name_; }
|
||||
|
||||
setParameter(name: string, value: any) {
|
||||
this.parameters_[name] = value;
|
||||
return this;
|
||||
}
|
||||
return JSON.parse(serialized);
|
||||
|
||||
setParameters(parameters: {[key: string]: any}) {
|
||||
this.parameters_ = parameters;
|
||||
return this;
|
||||
}
|
||||
|
||||
getParameter(key: string) { return this.parameters_[key]; }
|
||||
|
||||
getParameters() { return this.parameters_; }
|
||||
}
|
||||
|
||||
@@ -37,7 +37,8 @@ describe('WebWorkers Input', function() {
|
||||
input.sendKeys(VALUE);
|
||||
let displayElem = element(by.css(selector + ' .input-val'));
|
||||
const expectedVal = `Input val is ${VALUE}.`;
|
||||
browser.wait(protractor.until.elementTextIs(displayElem, expectedVal), 5000);
|
||||
browser.wait(
|
||||
protractor.ExpectedConditions.textToBePresentInElement(displayElem, expectedVal), 5000);
|
||||
expect(displayElem.getText()).toEqual(expectedVal);
|
||||
});
|
||||
|
||||
@@ -51,7 +52,8 @@ describe('WebWorkers Input', function() {
|
||||
input.sendKeys(VALUE);
|
||||
let displayElem = element(by.css(selector + ' .textarea-val'));
|
||||
const expectedVal = `Textarea val is ${VALUE}.`;
|
||||
browser.wait(protractor.until.elementTextIs(displayElem, expectedVal), 5000);
|
||||
browser.wait(
|
||||
protractor.ExpectedConditions.textToBePresentInElement(displayElem, expectedVal), 5000);
|
||||
expect(displayElem.getText()).toEqual(expectedVal);
|
||||
});
|
||||
|
||||
@@ -60,7 +62,8 @@ describe('WebWorkers Input', function() {
|
||||
.then(
|
||||
_ => {
|
||||
let elem = element(by.css(selector + ' h2'));
|
||||
browser.wait(protractor.until.elementTextIs(elem, 'Input App'), 5000);
|
||||
browser.wait(
|
||||
protractor.ExpectedConditions.textToBePresentInElement(elem, 'Input App'), 5000);
|
||||
},
|
||||
_ => {
|
||||
// jasmine will timeout if this gets called too many times
|
||||
|
||||
@@ -23,7 +23,8 @@ describe('WebWorkers Kitchen Sink', function() {
|
||||
|
||||
browser.wait(protractor.until.elementLocated(by.css(selector)), 15000);
|
||||
var elem = element(by.css(selector));
|
||||
browser.wait(protractor.until.elementTextIs(elem, 'hello world!'), 5000);
|
||||
browser.wait(
|
||||
protractor.ExpectedConditions.textToBePresentInElement(elem, 'hello world!'), 5000);
|
||||
expect(elem.getText()).toEqual('hello world!');
|
||||
|
||||
});
|
||||
@@ -37,7 +38,8 @@ describe('WebWorkers Kitchen Sink', function() {
|
||||
browser.wait(protractor.until.elementLocated(by.css(changeButtonSelector)), 15000);
|
||||
element(by.css(changeButtonSelector)).click();
|
||||
var elem = element(by.css(selector));
|
||||
browser.wait(protractor.until.elementTextIs(elem, 'howdy world!'), 5000);
|
||||
browser.wait(
|
||||
protractor.ExpectedConditions.textToBePresentInElement(elem, 'howdy world!'), 5000);
|
||||
expect(elem.getText()).toEqual('howdy world!');
|
||||
});
|
||||
|
||||
@@ -51,7 +53,7 @@ describe('WebWorkers Kitchen Sink', function() {
|
||||
expect(area.getText()).toEqual('(none)');
|
||||
|
||||
area.sendKeys('u');
|
||||
browser.wait(protractor.until.elementTextIs(area, 'U'), 5000);
|
||||
browser.wait(protractor.ExpectedConditions.textToBePresentInElement(area, 'U'), 5000);
|
||||
expect(area.getText()).toEqual('U');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -36,7 +36,7 @@ describe('MessageBroker', function() {
|
||||
input.sendKeys(VALUE);
|
||||
element(by.css('#send_echo')).click();
|
||||
var area = element(by.css('#echo_result'));
|
||||
browser.wait(protractor.until.elementTextIs(area, VALUE), 5000);
|
||||
browser.wait(protractor.ExpectedConditions.textToBePresentInElement(area, VALUE), 5000);
|
||||
expect(area.getText()).toEqual(VALUE);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user