Skip to content

Commit 3d61a7b

Browse files
committed
feat(bench press): add iOS support
1 parent f9dcfa3 commit 3d61a7b

17 files changed

+173
-106
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ pubspec.lock
2222
# Don't check in secret files
2323
*secret.js
2424

25+
# Don't check in downloaded jar files or log files
26+
*.jar
27+
*.log
28+
2529
/docs/bower_components/

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,32 @@ Angular specific command line options when running protractor:
7474
Angular specific command line options when running protractor (e.g. force gc, ...):
7575
`protractor protractor-{js|dart2js}-conf.js --ng-help`
7676

77+
### Test on mobile devices
78+
79+
## iOS:
80+
81+
1. Download [latest iphone-driver](http://ios-driver-ci.ebaystratus.com/userContent/ios-server-standalone-0.6.6-SNAPSHOT.jar),
82+
see `scripts/ci/install_io_driver.sh`.
83+
2. create a wifi network on which the iOS device can see the server
84+
3. Run `java -jar ios-server-standalone-0.6.6-SNAPSHOT.jar -real`
85+
4. `protractor protractor-js.conf.js --browsers=SafariIos --seleniumAddress=http://localhost:5555/wd/hub --serverAddress=yourServerName`
86+
87+
Notes:
88+
* ios-driver does not yet support iOS 8.x native devices, so only use iOS 7.x for them
89+
* ios-driver does support iOS 8.x for the iOS simulator
90+
91+
## Android:
92+
93+
1. get root access so that you can control the CPU speed of the device
94+
* e.g. flash a so called user-debug build of Android
95+
2. connect your Android device via usb
96+
3. run `./scripts/ci/init_android.sh`. This will:
97+
* set up a reverse proxy so that the browser on Android can use `localhost`
98+
* set the cpu speed to a fixed value
99+
* prevent the device from sleeping
100+
4. `protractor protractor-js.conf.js --browsers=ChromeAndroid`
101+
102+
77103
### Examples
78104

79105
To see the examples, first build the project as described above.

modules/benchpress/src/runner.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,6 @@ var _DEFAULT_BINDINGS = [
7272
WebDriverExtension.bindTo([ChromeDriverExtension, IOsDriverExtension]),
7373
Metric.bindTo(MultiMetric),
7474

75-
bind(Options.CAPABILITIES).toAsyncFactory(
76-
(adapter) => adapter.capabilities(), [WebDriverAdapter]
77-
),
7875
bind(Options.USER_AGENT).toAsyncFactory(
7976
(adapter) => adapter.executeScript('return window.navigator.userAgent;'), [WebDriverAdapter]
8077
)

modules/benchpress/src/sample_options.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ export class Options {
1414
// TODO(tbosch): use static initializer when our transpiler supports it
1515
static get EXECUTE() { return _EXECUTE; }
1616
// TODO(tbosch): use static initializer when our transpiler supports it
17-
static get CAPABILITIES() { return _CAPABILITIES; }
18-
// TODO(tbosch): use static initializer when our transpiler supports it
1917
static get USER_AGENT() { return _USER_AGENT; }
2018
// TODO(tbosch): use static initializer when our transpiler supports it
2119
/**
@@ -31,6 +29,5 @@ var _SAMPLE_DESCRIPTION = new OpaqueToken('Options.sampleDescription');
3129
var _FORCE_GC = new OpaqueToken('Options.forceGc');
3230
var _PREPARE = new OpaqueToken('Options.prepare');
3331
var _EXECUTE = new OpaqueToken('Options.execute');
34-
var _CAPABILITIES = new OpaqueToken('Options.capabilities');
3532
var _USER_AGENT = new OpaqueToken('Options.userAgent');
3633
var _MICRO_ITERATIONS = new OpaqueToken('Options.microIterations');

modules/benchpress/src/web_driver_extension.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,19 @@ export class WebDriverExtension {
2020
[Injector]
2121
),
2222
bind(WebDriverExtension).toFactory(
23-
(children, capabilities) => {
23+
(children, userAgent) => {
2424
var delegate;
2525
ListWrapper.forEach(children, (extension) => {
26-
if (extension.supports(capabilities)) {
26+
if (extension.supports(userAgent)) {
2727
delegate = extension;
2828
}
2929
});
3030
if (isBlank(delegate)) {
31-
throw new BaseException('Could not find a delegate for given capabilities!');
31+
throw new BaseException(`Could not find a delegate for userAgent ${userAgent}!`);
3232
}
3333
return delegate;
3434
},
35-
[_CHILDREN, Options.CAPABILITIES]
35+
[_CHILDREN, Options.USER_AGENT]
3636
)
3737
];
3838
}
@@ -64,7 +64,7 @@ export class WebDriverExtension {
6464
throw new BaseException('NYI');
6565
}
6666

67-
supports(capabilities:StringMap):boolean {
67+
supports(userAgent:string):boolean {
6868
return true;
6969
}
7070
}

modules/benchpress/src/webdriver/chrome_driver_extension.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ export class ChromeDriverExtension extends WebDriverExtension {
111111
return normalizedEvents;
112112
}
113113

114-
supports(capabilities:StringMap):boolean {
115-
return StringWrapper.equals(capabilities['browserName'].toLowerCase(), 'chrome');
114+
supports(userAgent:string):boolean {
115+
return isPresent(RegExpWrapper.firstMatch(_USER_AGENT_REGEX, userAgent));
116116
}
117117
}
118118

@@ -142,6 +142,8 @@ function normalizeEvent(chromeEvent, data) {
142142
return result;
143143
}
144144

145+
var _USER_AGENT_REGEX = RegExpWrapper.create('\\bChrome\\b');
146+
145147
var _BINDINGS = [
146148
bind(ChromeDriverExtension).toFactory(
147149
(driver) => new ChromeDriverExtension(driver),

modules/benchpress/src/webdriver/ios_driver_extension.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,11 @@ export class IOsDriverExtension extends WebDriverExtension {
3737
}
3838

3939
// See https://github.com/WebKit/webkit/tree/master/Source/WebInspectorUI/Versions
40+
// for the protocol.
41+
// See https://github.com/WebKit/webkit/blob/master/Source/WebCore/inspector/InspectorTimelineAgent.cpp
42+
// for which records are actually fired by Safari.
4043
readPerfLog() {
41-
// TODO(tbosch): Bug in IOsDriver: Need to execute at least one command
44+
// TODO(tbosch): Bug in WebKit: Need to execute at least one command
4245
// so that the browser logs can be read out!
4346
return this._driver.executeScript('1+1')
4447
.then( (_) => this._driver.logs('performance') )
@@ -64,7 +67,6 @@ export class IOsDriverExtension extends WebDriverExtension {
6467
var data = record['data'];
6568
var startTime = record['startTime'];
6669
var endTime = record['endTime'];
67-
6870
if (StringWrapper.equals(type, 'FunctionCall') &&
6971
(isBlank(data) || !StringWrapper.equals(data['scriptName'], 'InjectedScript'))) {
7072
ListWrapper.push(events, createStartEvent('script', startTime));
@@ -99,8 +101,8 @@ export class IOsDriverExtension extends WebDriverExtension {
99101
return events;
100102
}
101103

102-
supports(capabilities:StringMap):boolean {
103-
return StringWrapper.equals(capabilities['browserName'].toLowerCase(), 'safari');
104+
supports(userAgent:string):boolean {
105+
return isPresent(RegExpWrapper.firstMatch(_USER_AGENT_REGEX, userAgent));
104106
}
105107
}
106108

@@ -136,6 +138,8 @@ function createMarkEndEvent(name, time) {
136138
return createEvent('e', name, time);
137139
}
138140

141+
var _USER_AGENT_REGEX = RegExpWrapper.create('\\bMobile\\b.*\\bSafari\\b');
142+
139143
var _BINDINGS = [
140144
bind(IOsDriverExtension).toFactory(
141145
(driver) => new IOsDriverExtension(driver),

modules/benchpress/test/web_driver_extension_spec.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,26 @@ import { PromiseWrapper } from 'angular2/src/facade/async';
77
import { WebDriverExtension, bind, Injector, Options } from 'benchpress/common';
88

99
export function main() {
10-
function createExtension(ids, caps) {
10+
function createExtension(ids, userAgent) {
1111
return new Injector([
1212
ListWrapper.map(ids, (id) => bind(id).toValue(new MockExtension(id)) ),
13-
bind(Options.CAPABILITIES).toValue(caps),
13+
bind(Options.USER_AGENT).toValue(userAgent),
1414
WebDriverExtension.bindTo(ids)
1515
]).asyncGet(WebDriverExtension);
1616
}
1717

1818
describe('WebDriverExtension.bindTo', () => {
1919

20-
it('should bind the extension that matches the capabilities', (done) => {
21-
createExtension(['m1', 'm2', 'm3'], {'browser': 'm2'}).then( (m) => {
20+
it('should bind the extension that matches the userAgent', (done) => {
21+
createExtension(['m1', 'm2', 'm3'], 'm2').then( (m) => {
2222
expect(m.id).toEqual('m2');
2323
done();
2424
});
2525
});
2626

2727
it('should throw if there is no match', (done) => {
2828
PromiseWrapper.catchError(
29-
createExtension(['m1'], {'browser': 'm2'}),
29+
createExtension(['m1'], 'm2'),
3030
(err) => {
3131
expect(isPresent(err)).toBe(true);
3232
done();
@@ -45,7 +45,7 @@ class MockExtension extends WebDriverExtension {
4545
this.id = id;
4646
}
4747

48-
supports(capabilities:StringMap):boolean {
49-
return StringWrapper.equals(capabilities['browser'], this.id);
48+
supports(userAgent:string):boolean {
49+
return StringWrapper.equals(userAgent, this.id);
5050
}
5151
}

modules/benchpress/test/webdriver/chrome_driver_extension_spec.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,13 +208,8 @@ export function main() {
208208
});
209209

210210
it('should match chrome browsers', () => {
211-
expect(createExtension().supports({
212-
'browserName': 'chrome'
213-
})).toBe(true);
214-
215-
expect(createExtension().supports({
216-
'browserName': 'Chrome'
217-
})).toBe(true);
211+
expect(createExtension().supports('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) '
212+
+'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.74 Safari/537.36')).toBe(true);
218213
});
219214

220215
});

modules/benchpress/test/webdriver/ios_driver_extension_spec.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,8 @@ export function main() {
156156
});
157157

158158
it('should match safari browsers', () => {
159-
expect(createExtension().supports({
160-
'browserName': 'safari'
161-
})).toBe(true);
162-
163-
expect(createExtension().supports({
164-
'browserName': 'Safari'
165-
})).toBe(true);
159+
expect(createExtension().supports('Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) '+
160+
'AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53')).toBe(true);
166161
});
167162

168163
});

0 commit comments

Comments
 (0)