selenium-webdriver 3.6.0 → 4.0.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.md +181 -0
- package/README.md +25 -27
- package/chrome.js +113 -127
- package/edge.js +42 -117
- package/example/chrome_android.js +8 -8
- package/example/chrome_mobile_emulation.js +8 -8
- package/example/firefox_channels.js +22 -18
- package/example/google_search_test.js +39 -26
- package/example/logging.js +39 -6
- package/firefox.js +769 -0
- package/http/index.js +41 -4
- package/http/util.js +11 -6
- package/ie.js +56 -97
- package/index.js +178 -114
- package/jasmine.json +11 -0
- package/lib/actions.js +68 -63
- package/lib/by.js +1 -1
- package/lib/capabilities.js +255 -192
- package/lib/command.js +26 -50
- package/lib/error.js +85 -44
- package/lib/http.js +133 -110
- package/lib/input.js +1044 -8
- package/lib/promise.js +222 -3323
- package/lib/proxy.js +134 -39
- package/lib/test/bootstrap_jasmine.js +28 -0
- package/lib/test/data/actions/click.html +24 -0
- package/lib/test/data/actions/drag.html +77 -0
- package/lib/test/data/actions/record_click.html +21 -0
- package/lib/test/data/chrome/download.html +2 -0
- package/lib/test/data/inputs.html +42 -0
- package/lib/test/data/selectPage.html +12 -0
- package/lib/test/data/simpleTest.html +5 -0
- package/lib/test/data/upload_invisible.html +45 -0
- package/lib/test/fileserver.js +23 -19
- package/lib/test/index.js +30 -212
- package/lib/test/resources.js +0 -1
- package/lib/webdriver.js +675 -936
- package/net/index.js +21 -25
- package/net/portprober.js +51 -68
- package/package.json +5 -3
- package/remote/index.js +5 -19
- package/safari.js +41 -128
- package/test/actions_test.js +173 -18
- package/test/{session_test.js → builder_test.js} +44 -37
- package/test/chrome/devtools_test.js +93 -0
- package/test/chrome/options_test.js +48 -154
- package/test/chrome/service_test.js +7 -7
- package/test/cookie_test.js +77 -63
- package/test/element_finding_test.js +206 -201
- package/test/execute_script_test.js +115 -114
- package/test/fingerprint_test.js +16 -15
- package/test/firefox_test.js +251 -0
- package/test/http/http_test.js +0 -1
- package/test/http/util_test.js +2 -2
- package/test/io/zip_test.js +6 -7
- package/test/lib/error_test.js +34 -7
- package/test/lib/http_test.js +8 -128
- package/test/lib/input_test.js +1379 -0
- package/test/lib/promise_test.js +473 -908
- package/test/lib/webdriver_test.js +296 -868
- package/test/logging_test.js +37 -43
- package/test/page_loading_test.js +71 -81
- package/test/proxy_test.js +64 -72
- package/test/rect_test.js +14 -25
- package/test/remote_test.js +10 -29
- package/test/safari_test.js +7 -71
- package/test/stale_element_test.js +20 -23
- package/test/tag_name_test.js +10 -9
- package/test/upload_test.js +27 -35
- package/test/window_test.js +72 -85
- package/testing/index.js +386 -314
- package/.npmignore +0 -2
- package/example/async_await_test.js +0 -69
- package/example/google_search_generator.js +0 -47
- package/example/parallel_flows.js +0 -51
- package/firefox/binary.js +0 -347
- package/firefox/extension.js +0 -224
- package/firefox/index.js +0 -576
- package/firefox/profile.js +0 -311
- package/lib/events.js +0 -210
- package/lib/test/data/firefox/jetpack-sample.xpi +0 -0
- package/lib/test/data/firefox/sample.xpi +0 -0
- package/lib/test/promise.js +0 -79
- package/opera.js +0 -405
- package/phantomjs.js +0 -282
- package/test/firefox/extension_test.js +0 -120
- package/test/firefox/firefox_test.js +0 -244
- package/test/firefox/profile_test.js +0 -140
- package/test/lib/events_test.js +0 -177
- package/test/lib/promise_aplus_test.js +0 -78
- package/test/lib/promise_error_test.js +0 -884
- package/test/lib/promise_flow_test.js +0 -2288
- package/test/lib/promise_generator_test.js +0 -310
- package/test/phantomjs/execute_phantomjs_test.js +0 -59
- package/test/testing/assert_test.js +0 -373
- package/test/testing/index_test.js +0 -224
- package/testing/assert.js +0 -378
|
@@ -17,25 +17,21 @@
|
|
|
17
17
|
|
|
18
18
|
'use strict';
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
const assert = require('assert');
|
|
21
|
+
const {fail} = require('assert');
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
until = require('..').until,
|
|
26
|
-
promise = require('../lib/promise'),
|
|
27
|
-
test = require('../lib/test'),
|
|
28
|
-
assert = require('../testing/assert'),
|
|
29
|
-
Pages = test.Pages;
|
|
23
|
+
const promise = require('../lib/promise');
|
|
24
|
+
const {Browser, By, error, until} = require('..');
|
|
25
|
+
const {Pages, ignore, suite, whereIs} = require('../lib/test');
|
|
30
26
|
|
|
31
27
|
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
suite(function(env) {
|
|
29
|
+
const browsers = (...args) => env.browsers(...args);
|
|
34
30
|
|
|
35
31
|
var driver;
|
|
36
32
|
|
|
37
|
-
|
|
38
|
-
driver =
|
|
33
|
+
before(async function() {
|
|
34
|
+
driver = await env.builder().build();
|
|
39
35
|
});
|
|
40
36
|
|
|
41
37
|
after(function() {
|
|
@@ -43,358 +39,367 @@ test.suite(function(env) {
|
|
|
43
39
|
});
|
|
44
40
|
|
|
45
41
|
describe('finding elements', function() {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
yield driver.wait(until.titleIs('We Arrive Here'), 5000);
|
|
53
|
-
});
|
|
42
|
+
it('should work after loading multiple pages in a row', async function() {
|
|
43
|
+
await driver.get(Pages.formPage);
|
|
44
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
45
|
+
await driver.findElement(By.linkText('click me')).click();
|
|
46
|
+
await driver.wait(until.titleIs('We Arrive Here'), 5000);
|
|
47
|
+
});
|
|
54
48
|
|
|
55
49
|
describe('By.id()', function() {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
50
|
+
it('should work', async function() {
|
|
51
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
52
|
+
await driver.findElement(By.id('linkId')).click();
|
|
53
|
+
await driver.wait(until.titleIs('We Arrive Here'), 5000);
|
|
60
54
|
});
|
|
61
55
|
|
|
62
|
-
|
|
63
|
-
|
|
56
|
+
it('should fail if ID not present on page', async function() {
|
|
57
|
+
await driver.get(Pages.formPage);
|
|
64
58
|
return driver.findElement(By.id('nonExistantButton')).
|
|
65
59
|
then(fail, function(e) {
|
|
66
|
-
assert(e
|
|
60
|
+
assert.ok(e instanceof error.NoSuchElementError);
|
|
67
61
|
});
|
|
68
62
|
});
|
|
69
63
|
|
|
70
|
-
|
|
64
|
+
it(
|
|
71
65
|
'should find multiple elements by ID even though that is ' +
|
|
72
66
|
'malformed HTML',
|
|
73
|
-
function
|
|
74
|
-
|
|
67
|
+
async function() {
|
|
68
|
+
await driver.get(Pages.nestedPage);
|
|
75
69
|
|
|
76
|
-
let elements =
|
|
77
|
-
assert(elements.length
|
|
70
|
+
let elements = await driver.findElements(By.id('2'));
|
|
71
|
+
assert.equal(elements.length, 8);
|
|
78
72
|
});
|
|
79
73
|
});
|
|
80
74
|
|
|
81
75
|
describe('By.linkText()', function() {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
76
|
+
it('should be able to click on link identified by text', async function() {
|
|
77
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
78
|
+
await driver.findElement(By.linkText('click me')).click();
|
|
79
|
+
await driver.wait(until.titleIs('We Arrive Here'), 5000);
|
|
86
80
|
});
|
|
87
81
|
|
|
88
|
-
|
|
82
|
+
it(
|
|
89
83
|
'should be able to find elements by partial link text',
|
|
90
|
-
function
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
84
|
+
async function() {
|
|
85
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
86
|
+
await driver.findElement(By.partialLinkText('ick me')).click();
|
|
87
|
+
await driver.wait(until.titleIs('We Arrive Here'), 5000);
|
|
94
88
|
});
|
|
95
89
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
let el =
|
|
90
|
+
it('should work when link text contains equals sign', async function() {
|
|
91
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
92
|
+
let el = await driver.findElement(By.linkText('Link=equalssign'));
|
|
99
93
|
|
|
100
|
-
let id =
|
|
101
|
-
assert(id
|
|
94
|
+
let id = await el.getAttribute('id');
|
|
95
|
+
assert.equal(id, 'linkWithEqualsSign');
|
|
102
96
|
});
|
|
103
97
|
|
|
104
|
-
|
|
105
|
-
function
|
|
106
|
-
|
|
107
|
-
let link =
|
|
98
|
+
it('matches by partial text when containing equals sign',
|
|
99
|
+
async function() {
|
|
100
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
101
|
+
let link = await driver.findElement(By.partialLinkText('Link='));
|
|
108
102
|
|
|
109
|
-
let id =
|
|
110
|
-
assert(id
|
|
103
|
+
let id = await link.getAttribute('id');
|
|
104
|
+
assert.equal(id, 'linkWithEqualsSign');
|
|
111
105
|
});
|
|
112
106
|
|
|
113
|
-
|
|
114
|
-
function
|
|
115
|
-
|
|
107
|
+
it('works when searching for multiple and text contains =',
|
|
108
|
+
async function() {
|
|
109
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
116
110
|
let elements =
|
|
117
|
-
|
|
111
|
+
await driver.findElements(By.linkText('Link=equalssign'));
|
|
118
112
|
|
|
119
|
-
assert(elements.length
|
|
113
|
+
assert.equal(elements.length, 1);
|
|
120
114
|
|
|
121
|
-
let id =
|
|
122
|
-
assert(id
|
|
115
|
+
let id = await elements[0].getAttribute('id');
|
|
116
|
+
assert.equal(id, 'linkWithEqualsSign');
|
|
123
117
|
});
|
|
124
118
|
|
|
125
|
-
|
|
119
|
+
it(
|
|
126
120
|
'works when searching for multiple with partial text containing =',
|
|
127
|
-
function
|
|
128
|
-
|
|
121
|
+
async function() {
|
|
122
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
129
123
|
let elements =
|
|
130
|
-
|
|
124
|
+
await driver.findElements(By.partialLinkText('Link='));
|
|
131
125
|
|
|
132
|
-
assert(elements.length
|
|
126
|
+
assert.equal(elements.length, 1);
|
|
133
127
|
|
|
134
|
-
let id =
|
|
135
|
-
assert(id
|
|
128
|
+
let id = await elements[0].getAttribute('id');
|
|
129
|
+
assert.equal(id, 'linkWithEqualsSign');
|
|
136
130
|
});
|
|
137
131
|
|
|
138
|
-
|
|
139
|
-
function
|
|
140
|
-
|
|
141
|
-
let elements =
|
|
142
|
-
assert(elements.length
|
|
132
|
+
it('should be able to find multiple exact matches',
|
|
133
|
+
async function() {
|
|
134
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
135
|
+
let elements = await driver.findElements(By.linkText('click me'));
|
|
136
|
+
assert.equal(elements.length, 2);
|
|
143
137
|
});
|
|
144
138
|
|
|
145
|
-
|
|
146
|
-
function
|
|
147
|
-
|
|
139
|
+
it('should be able to find multiple partial matches',
|
|
140
|
+
async function() {
|
|
141
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
148
142
|
let elements =
|
|
149
|
-
|
|
150
|
-
assert(elements.length
|
|
143
|
+
await driver.findElements(By.partialLinkText('ick me'));
|
|
144
|
+
assert.equal(elements.length, 2);
|
|
151
145
|
});
|
|
152
146
|
|
|
153
|
-
|
|
154
|
-
it('works on XHTML pages', function
|
|
155
|
-
|
|
147
|
+
ignore(browsers(Browser.SAFARI)).
|
|
148
|
+
it('works on XHTML pages', async function() {
|
|
149
|
+
await driver.get(whereIs('actualXhtmlPage.xhtml'));
|
|
156
150
|
|
|
157
|
-
let el =
|
|
158
|
-
|
|
151
|
+
let el = await driver.findElement(By.linkText('Foo'));
|
|
152
|
+
assert.equal(await el.getText(), 'Foo');
|
|
159
153
|
});
|
|
160
154
|
});
|
|
161
155
|
|
|
162
156
|
describe('By.name()', function() {
|
|
163
|
-
|
|
164
|
-
|
|
157
|
+
it('should work', async function() {
|
|
158
|
+
await driver.get(Pages.formPage);
|
|
165
159
|
|
|
166
|
-
let el =
|
|
167
|
-
|
|
160
|
+
let el = await driver.findElement(By.name('checky'));
|
|
161
|
+
assert.equal(await el.getAttribute('value'), 'furrfu');
|
|
168
162
|
});
|
|
169
163
|
|
|
170
|
-
|
|
171
|
-
|
|
164
|
+
it('should find multiple elements with same name', async function() {
|
|
165
|
+
await driver.get(Pages.nestedPage);
|
|
172
166
|
|
|
173
|
-
let elements =
|
|
174
|
-
assert(elements.length
|
|
167
|
+
let elements = await driver.findElements(By.name('checky'));
|
|
168
|
+
assert.ok(elements.length > 1);
|
|
175
169
|
});
|
|
176
170
|
|
|
177
|
-
|
|
171
|
+
it(
|
|
178
172
|
'should be able to find elements that do not support name property',
|
|
179
|
-
function
|
|
180
|
-
|
|
181
|
-
|
|
173
|
+
async function() {
|
|
174
|
+
await driver.get(Pages.nestedPage);
|
|
175
|
+
await driver.findElement(By.name('div1'));
|
|
182
176
|
// Pass if this does not return an error.
|
|
183
177
|
});
|
|
184
178
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
179
|
+
it('shoudl be able to find hidden elements by name', async function() {
|
|
180
|
+
await driver.get(Pages.formPage);
|
|
181
|
+
await driver.findElement(By.name('hidden'));
|
|
188
182
|
// Pass if this does not return an error.
|
|
189
183
|
});
|
|
190
184
|
});
|
|
191
185
|
|
|
192
186
|
describe('By.className()', function() {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
let el =
|
|
197
|
-
|
|
187
|
+
it('should work', async function() {
|
|
188
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
189
|
+
|
|
190
|
+
let el = await driver.findElement(By.className('extraDiv'));
|
|
191
|
+
let text = await el.getText();
|
|
192
|
+
assert.ok(
|
|
193
|
+
text.startsWith('Another div starts here.'),
|
|
194
|
+
`Unexpected text: "${text}"`);
|
|
198
195
|
});
|
|
199
196
|
|
|
200
|
-
|
|
201
|
-
|
|
197
|
+
it('should work when name is first name among many', async function() {
|
|
198
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
202
199
|
|
|
203
|
-
let el =
|
|
204
|
-
|
|
200
|
+
let el = await driver.findElement(By.className('nameA'));
|
|
201
|
+
assert.equal(await el.getText(), 'An H2 title');
|
|
205
202
|
});
|
|
206
203
|
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
it('should work when name is last name among many', async function() {
|
|
205
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
209
206
|
|
|
210
|
-
let el =
|
|
211
|
-
|
|
207
|
+
let el = await driver.findElement(By.className('nameC'));
|
|
208
|
+
assert.equal(await el.getText(), 'An H2 title');
|
|
212
209
|
});
|
|
213
210
|
|
|
214
|
-
|
|
215
|
-
|
|
211
|
+
it('should work when name is middle of many', async function() {
|
|
212
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
216
213
|
|
|
217
|
-
let el =
|
|
218
|
-
|
|
214
|
+
let el = await driver.findElement(By.className('nameBnoise'));
|
|
215
|
+
assert.equal(await el.getText(), 'An H2 title');
|
|
219
216
|
});
|
|
220
217
|
|
|
221
|
-
|
|
222
|
-
|
|
218
|
+
it('should work when name surrounded by whitespace', async function() {
|
|
219
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
223
220
|
|
|
224
|
-
let el =
|
|
225
|
-
|
|
221
|
+
let el = await driver.findElement(By.className('spaceAround'));
|
|
222
|
+
assert.equal(await el.getText(), 'Spaced out');
|
|
226
223
|
});
|
|
227
224
|
|
|
228
|
-
|
|
229
|
-
|
|
225
|
+
it('should fail if queried name only partially matches', async function() {
|
|
226
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
230
227
|
return driver.findElement(By.className('nameB')).
|
|
231
228
|
then(fail, function(e) {
|
|
232
|
-
assert(e
|
|
229
|
+
assert.ok(e instanceof error.NoSuchElementError);
|
|
233
230
|
});
|
|
234
231
|
});
|
|
235
232
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
233
|
+
it('should implicitly wait', async function() {
|
|
234
|
+
const TIMEOUT_IN_MS = 1000;
|
|
235
|
+
const EPSILON = TIMEOUT_IN_MS / 2;
|
|
239
236
|
|
|
240
|
-
|
|
241
|
-
|
|
237
|
+
await driver.manage().setTimeouts({implicit: TIMEOUT_IN_MS});
|
|
238
|
+
await driver.get(Pages.formPage);
|
|
242
239
|
|
|
243
240
|
var start = new Date();
|
|
244
241
|
return driver.findElement(By.id('nonExistantButton')).
|
|
245
242
|
then(fail, function(e) {
|
|
246
243
|
var end = new Date();
|
|
247
|
-
assert(e
|
|
248
|
-
|
|
244
|
+
assert.ok(e instanceof error.NoSuchElementError);
|
|
245
|
+
|
|
246
|
+
let elapsed = end - start;
|
|
247
|
+
let diff = Math.abs(elapsed - TIMEOUT_IN_MS);
|
|
248
|
+
assert.ok(
|
|
249
|
+
diff < EPSILON,
|
|
250
|
+
`Expected ${TIMEOUT_IN_MS} \u00b1 ${EPSILON} but got ${elapsed}`);
|
|
249
251
|
});
|
|
250
252
|
});
|
|
251
253
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
+
it('should be able to find multiple matches', async function() {
|
|
255
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
254
256
|
|
|
255
|
-
let elements =
|
|
256
|
-
assert(elements.length
|
|
257
|
+
let elements = await driver.findElements(By.className('nameC'));
|
|
258
|
+
assert.ok(elements.length > 1);
|
|
257
259
|
});
|
|
258
260
|
|
|
259
|
-
|
|
261
|
+
it('permits compound class names', function() {
|
|
260
262
|
return driver.get(Pages.xhtmlTestPage)
|
|
261
263
|
.then(() => driver.findElement(By.className('nameA nameC')))
|
|
262
264
|
.then(el => el.getText())
|
|
263
|
-
.then(text => assert(text
|
|
265
|
+
.then(text => assert.equal(text, 'An H2 title'));
|
|
264
266
|
});
|
|
265
267
|
});
|
|
266
268
|
|
|
267
269
|
describe('By.xpath()', function() {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
let elements =
|
|
271
|
-
assert(elements.length
|
|
270
|
+
it('should work with multiple matches', async function() {
|
|
271
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
272
|
+
let elements = await driver.findElements(By.xpath('//div'));
|
|
273
|
+
assert.ok(elements.length > 1);
|
|
272
274
|
});
|
|
273
275
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
276
|
+
it('should work for selectors using contains keyword', async function() {
|
|
277
|
+
await driver.get(Pages.nestedPage);
|
|
278
|
+
await driver.findElement(By.xpath('//a[contains(., "hello world")]'));
|
|
277
279
|
// Pass if no error.
|
|
278
280
|
});
|
|
279
281
|
});
|
|
280
282
|
|
|
281
283
|
describe('By.tagName()', function() {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
+
it('works', async function() {
|
|
285
|
+
await driver.get(Pages.formPage);
|
|
284
286
|
|
|
285
|
-
let el =
|
|
286
|
-
|
|
287
|
+
let el = await driver.findElement(By.tagName('input'));
|
|
288
|
+
assert.equal(await el.getTagName(), 'input');
|
|
287
289
|
});
|
|
288
290
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
+
it('can find multiple elements', async function() {
|
|
292
|
+
await driver.get(Pages.formPage);
|
|
291
293
|
|
|
292
|
-
let elements =
|
|
293
|
-
assert(elements.length
|
|
294
|
+
let elements = await driver.findElements(By.tagName('input'));
|
|
295
|
+
assert.ok(elements.length > 1);
|
|
294
296
|
});
|
|
295
297
|
});
|
|
296
298
|
|
|
297
299
|
describe('By.css()', function() {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
300
|
+
it('works', async function() {
|
|
301
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
302
|
+
await driver.findElement(By.css('div.content'));
|
|
301
303
|
// Pass if no error.
|
|
302
304
|
});
|
|
303
305
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
+
it('can find multiple elements', async function() {
|
|
307
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
306
308
|
|
|
307
|
-
let elements =
|
|
308
|
-
assert(elements.length
|
|
309
|
+
let elements = await driver.findElements(By.css('p'));
|
|
310
|
+
assert.ok(elements.length > 1);
|
|
309
311
|
// Pass if no error.
|
|
310
312
|
});
|
|
311
313
|
|
|
312
|
-
|
|
314
|
+
it(
|
|
313
315
|
'should find first matching element when searching by ' +
|
|
314
316
|
'compound CSS selector',
|
|
315
|
-
function
|
|
316
|
-
|
|
317
|
+
async function() {
|
|
318
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
317
319
|
|
|
318
320
|
let el =
|
|
319
|
-
|
|
320
|
-
|
|
321
|
+
await driver.findElement(By.css('div.extraDiv, div.content'));
|
|
322
|
+
assert.equal(await el.getAttribute('class'), 'content');
|
|
321
323
|
});
|
|
322
324
|
|
|
323
|
-
|
|
324
|
-
function
|
|
325
|
-
|
|
325
|
+
it('should be able to find multiple elements by compound selector',
|
|
326
|
+
async function() {
|
|
327
|
+
await driver.get(Pages.xhtmlTestPage);
|
|
326
328
|
let elements =
|
|
327
|
-
|
|
329
|
+
await driver.findElements(By.css('div.extraDiv, div.content'));
|
|
328
330
|
|
|
329
331
|
return Promise.all([
|
|
330
332
|
assertClassIs(elements[0], 'content'),
|
|
331
333
|
assertClassIs(elements[1], 'extraDiv')
|
|
332
334
|
]);
|
|
333
335
|
|
|
334
|
-
function assertClassIs(el, expected) {
|
|
335
|
-
|
|
336
|
+
async function assertClassIs(el, expected) {
|
|
337
|
+
let clazz = await el.getAttribute('class');
|
|
338
|
+
assert.equal(clazz, expected);
|
|
336
339
|
}
|
|
337
340
|
});
|
|
338
341
|
|
|
339
342
|
// IE only supports short version option[selected].
|
|
340
|
-
|
|
341
|
-
it('should be able to find element by boolean attribute', function
|
|
342
|
-
|
|
343
|
+
ignore(browsers(Browser.IE)).
|
|
344
|
+
it('should be able to find element by boolean attribute', async function() {
|
|
345
|
+
await driver.get(whereIs(
|
|
343
346
|
'locators_tests/boolean_attribute_selected.html'));
|
|
344
347
|
|
|
345
|
-
let el =
|
|
346
|
-
|
|
348
|
+
let el = await driver.findElement(By.css('option[selected="selected"]'));
|
|
349
|
+
assert.equal(await el.getAttribute('value'), 'two');
|
|
347
350
|
});
|
|
348
351
|
|
|
349
|
-
|
|
352
|
+
it(
|
|
350
353
|
'should be able to find element with short ' +
|
|
351
354
|
'boolean attribute selector',
|
|
352
|
-
function
|
|
353
|
-
|
|
355
|
+
async function() {
|
|
356
|
+
await driver.get(whereIs(
|
|
354
357
|
'locators_tests/boolean_attribute_selected.html'));
|
|
355
358
|
|
|
356
|
-
let el =
|
|
357
|
-
|
|
359
|
+
let el = await driver.findElement(By.css('option[selected]'));
|
|
360
|
+
assert.equal(await el.getAttribute('value'), 'two');
|
|
358
361
|
});
|
|
359
362
|
|
|
360
|
-
|
|
363
|
+
it(
|
|
361
364
|
'should be able to find element with short boolean attribute ' +
|
|
362
365
|
'selector on HTML4 page',
|
|
363
|
-
function
|
|
364
|
-
|
|
366
|
+
async function() {
|
|
367
|
+
await driver.get(whereIs(
|
|
365
368
|
'locators_tests/boolean_attribute_selected_html4.html'));
|
|
366
369
|
|
|
367
|
-
let el =
|
|
368
|
-
|
|
370
|
+
let el = await driver.findElement(By.css('option[selected]'));
|
|
371
|
+
assert.equal(await el.getAttribute('value'), 'two');
|
|
369
372
|
});
|
|
370
373
|
});
|
|
371
374
|
|
|
372
375
|
describe('by custom locator', function() {
|
|
373
|
-
|
|
374
|
-
|
|
376
|
+
it('handles single element result', async function() {
|
|
377
|
+
await driver.get(Pages.javascriptPage);
|
|
375
378
|
|
|
376
|
-
let link =
|
|
379
|
+
let link = await driver.findElement(function(driver) {
|
|
377
380
|
let links = driver.findElements(By.tagName('a'));
|
|
378
381
|
return promise.filter(links, function(link) {
|
|
379
382
|
return link.getAttribute('id').then(id => id === 'updatediv');
|
|
380
383
|
}).then(links => links[0]);
|
|
381
384
|
});
|
|
382
385
|
|
|
383
|
-
|
|
386
|
+
let text = await link.getText();
|
|
387
|
+
let regex = /Update\s+a\s+div/;
|
|
388
|
+
assert.ok(regex.test(text), `"${text}" does not match ${regex}`);
|
|
384
389
|
});
|
|
385
390
|
|
|
386
|
-
|
|
387
|
-
|
|
391
|
+
it('uses first element if locator resolves to list', async function() {
|
|
392
|
+
await driver.get(Pages.javascriptPage);
|
|
388
393
|
|
|
389
|
-
let link =
|
|
394
|
+
let link = await driver.findElement(function() {
|
|
390
395
|
return driver.findElements(By.tagName('a'));
|
|
391
396
|
});
|
|
392
397
|
|
|
393
|
-
|
|
398
|
+
assert.equal(await link.getText(), 'Change the page title!');
|
|
394
399
|
});
|
|
395
400
|
|
|
396
|
-
|
|
397
|
-
|
|
401
|
+
it('fails if locator returns non-webelement value', async function() {
|
|
402
|
+
await driver.get(Pages.javascriptPage);
|
|
398
403
|
|
|
399
404
|
let link = driver.findElement(function() {
|
|
400
405
|
return driver.getTitle();
|
|
@@ -402,24 +407,24 @@ test.suite(function(env) {
|
|
|
402
407
|
|
|
403
408
|
return link.then(
|
|
404
409
|
() => fail('Should have failed'),
|
|
405
|
-
(e) => assert(e
|
|
410
|
+
(e) => assert.ok(e instanceof TypeError));
|
|
406
411
|
});
|
|
407
412
|
});
|
|
408
413
|
|
|
409
414
|
describe('switchTo().activeElement()', function() {
|
|
410
415
|
// SAFARI's new session response does not identify it as a W3C browser,
|
|
411
416
|
// so the command is sent in the unsupported wire protocol format.
|
|
412
|
-
|
|
413
|
-
it('returns document.activeElement', function
|
|
414
|
-
|
|
417
|
+
ignore(browsers(Browser.SAFARI)).
|
|
418
|
+
it('returns document.activeElement', async function() {
|
|
419
|
+
await driver.get(Pages.formPage);
|
|
415
420
|
|
|
416
|
-
let email =
|
|
417
|
-
|
|
421
|
+
let email = await driver.findElement(By.css('#email'));
|
|
422
|
+
await driver.executeScript('arguments[0].focus()', email);
|
|
418
423
|
|
|
419
|
-
let ae =
|
|
420
|
-
let equal =
|
|
424
|
+
let ae = await driver.switchTo().activeElement();
|
|
425
|
+
let equal = await driver.executeScript(
|
|
421
426
|
'return arguments[0] === arguments[1]', email, ae);
|
|
422
|
-
assert(equal)
|
|
427
|
+
assert.ok(equal);
|
|
423
428
|
});
|
|
424
429
|
});
|
|
425
430
|
});
|