1 | var wd = require('wd');
|
2 | var urlModule = require('url');
|
3 | var urlparse = urlModule.parse;
|
4 | var urlformat = urlModule.format;
|
5 |
|
6 | var WebDriverInstance = function (baseBrowserDecorator, args, logger) {
|
7 | var log = logger.create('WebDriver');
|
8 |
|
9 | var config = args.config || {
|
10 | hostname: '127.0.0.1',
|
11 | port: 4444
|
12 | };
|
13 | var self = this;
|
14 |
|
15 |
|
16 | var spec = {
|
17 | platform: 'ANY',
|
18 | testName: 'Karma test',
|
19 | tags: [],
|
20 | version: ''
|
21 | };
|
22 |
|
23 | Object.keys(args).forEach(function (key) {
|
24 | var value = args[key];
|
25 | switch (key) {
|
26 | case 'browserName':
|
27 | break;
|
28 | case 'platform':
|
29 | break;
|
30 | case 'testName':
|
31 | break;
|
32 | case 'tags':
|
33 | break;
|
34 | case 'version':
|
35 | break;
|
36 | case 'config':
|
37 |
|
38 | return;
|
39 | }
|
40 | spec[key] = value;
|
41 | });
|
42 |
|
43 | if (!spec.browserName) {
|
44 | throw new Error('browserName is required!');
|
45 | }
|
46 |
|
47 | baseBrowserDecorator(this);
|
48 |
|
49 | this.name = spec.browserName + ' via Remote WebDriver';
|
50 | this.spec = spec;
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 | function handleXUaCompatible(args, urlObj) {
|
68 | if (args['x-ua-compatible']) {
|
69 | urlObj.query['x-ua-compatible'] = args['x-ua-compatible'];
|
70 | }
|
71 | }
|
72 |
|
73 | this._start = function (url) {
|
74 | var urlObj = urlparse(url, true);
|
75 |
|
76 | handleXUaCompatible(spec, urlObj);
|
77 |
|
78 | delete urlObj.search;
|
79 | url = urlformat(urlObj);
|
80 |
|
81 | log.debug('WebDriver config: ' + JSON.stringify(config));
|
82 | log.debug('Browser capabilities: ' + JSON.stringify(spec));
|
83 |
|
84 | self.browser = wd.remote(config);
|
85 |
|
86 | var interval = args.pseudoActivityInterval && setInterval(function() {
|
87 | log.debug('Imitate activity');
|
88 | self.browser.title();
|
89 | }, args.pseudoActivityInterval);
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 | self.browser.init(spec, function() {
|
96 | log.debug('Session ID: ' + self.browser.sessionID);
|
97 | self.browser.get(url, function(error) {
|
98 | if (!error) {
|
99 | return;
|
100 | }
|
101 |
|
102 |
|
103 |
|
104 | log.error('WebDriver command failed', {
|
105 | spec: spec,
|
106 | error: error
|
107 | });
|
108 |
|
109 |
|
110 | self._process.kill();
|
111 | });
|
112 | });
|
113 |
|
114 | self._process = {
|
115 | kill: function() {
|
116 | interval && clearInterval(interval);
|
117 | self.browser.quit(function() {
|
118 | log.info('Killed ' + spec.testName + '.');
|
119 | self._onProcessExit(self.error ? -1 : 0, self.error);
|
120 | });
|
121 | }
|
122 | };
|
123 | };
|
124 |
|
125 |
|
126 | this._onKillTimeout = function(){};
|
127 | };
|
128 |
|
129 | WebDriverInstance.prototype = {
|
130 | name: 'WebDriver',
|
131 |
|
132 | DEFAULT_CMD: {
|
133 | linux: require('wd').path,
|
134 | darwin: require('wd').path,
|
135 | win32: require('wd').path
|
136 | },
|
137 | ENV_CMD: 'WEBDRIVER_BIN'
|
138 | };
|
139 |
|
140 | WebDriverInstance.$inject = ['baseBrowserDecorator', 'args', 'logger'];
|
141 |
|
142 |
|
143 | module.exports = {
|
144 | 'launcher:WebDriver': ['type', WebDriverInstance]
|
145 | };
|