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
package/test/remote_test.js
CHANGED
|
@@ -17,16 +17,14 @@
|
|
|
17
17
|
|
|
18
18
|
'use strict';
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
const assert = require('assert');
|
|
21
|
+
const fs = require('fs');
|
|
22
|
+
const path = require('path');
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const {enablePromiseManager} = require('../lib/test/promise');
|
|
24
|
+
const io = require('../io');
|
|
25
|
+
const cmd = require('../lib/command');
|
|
26
|
+
const remote = require('../remote');
|
|
27
|
+
const {CancellationError} = require('../http/util');
|
|
30
28
|
|
|
31
29
|
describe('DriverService', function() {
|
|
32
30
|
describe('start()', function() {
|
|
@@ -44,28 +42,11 @@ describe('DriverService', function() {
|
|
|
44
42
|
});
|
|
45
43
|
|
|
46
44
|
it('fails if child-process dies', function() {
|
|
47
|
-
this.timeout(1000);
|
|
48
45
|
return service.start(500).then(expectFailure, verifyFailure);
|
|
49
46
|
});
|
|
50
47
|
|
|
51
|
-
enablePromiseManager(function() {
|
|
52
|
-
describe(
|
|
53
|
-
'failures propagate through control flow if child-process dies',
|
|
54
|
-
function() {
|
|
55
|
-
it('', function() {
|
|
56
|
-
this.timeout(1000);
|
|
57
|
-
|
|
58
|
-
return promise.controlFlow().execute(function() {
|
|
59
|
-
promise.controlFlow().execute(function() {
|
|
60
|
-
return service.start(500);
|
|
61
|
-
});
|
|
62
|
-
}).then(expectFailure, verifyFailure);
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
48
|
function verifyFailure(e) {
|
|
68
|
-
assert.ok(!(e instanceof
|
|
49
|
+
assert.ok(!(e instanceof CancellationError));
|
|
69
50
|
assert.equal('Server terminated early with status 1', e.message);
|
|
70
51
|
}
|
|
71
52
|
|
|
@@ -77,7 +58,7 @@ describe('DriverService', function() {
|
|
|
77
58
|
|
|
78
59
|
describe('FileDetector', function() {
|
|
79
60
|
class ExplodingDriver {
|
|
80
|
-
|
|
61
|
+
execute() {
|
|
81
62
|
throw Error('unexpected call');
|
|
82
63
|
}
|
|
83
64
|
}
|
|
@@ -104,7 +85,7 @@ describe('FileDetector', function() {
|
|
|
104
85
|
return (new remote.FileDetector)
|
|
105
86
|
.handleFile(
|
|
106
87
|
new (class FakeDriver {
|
|
107
|
-
|
|
88
|
+
execute(command) {
|
|
108
89
|
assert.equal(command.getName(), cmd.Name.UPLOAD_FILE);
|
|
109
90
|
assert.equal(typeof command.getParameters()['file'], 'string');
|
|
110
91
|
return Promise.resolve('success!');
|
package/test/safari_test.js
CHANGED
|
@@ -17,75 +17,12 @@
|
|
|
17
17
|
|
|
18
18
|
'use strict';
|
|
19
19
|
|
|
20
|
-
const
|
|
21
|
-
proxy = require('../proxy'),
|
|
22
|
-
safari = require('../safari'),
|
|
23
|
-
assert = require('../testing/assert'),
|
|
24
|
-
test = require('../lib/test');
|
|
20
|
+
const assert = require('assert');
|
|
25
21
|
|
|
22
|
+
const safari = require('../safari');
|
|
23
|
+
const test = require('../lib/test');
|
|
24
|
+
const webdriver = require('..');
|
|
26
25
|
|
|
27
|
-
describe('safari.Options', function() {
|
|
28
|
-
describe('fromCapabilities', function() {
|
|
29
|
-
it('returns a new Options instance if none were defined', function() {
|
|
30
|
-
let options = safari.Options.fromCapabilities(
|
|
31
|
-
new webdriver.Capabilities());
|
|
32
|
-
assert(options).instanceOf(safari.Options);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('returns the options instance if present', function() {
|
|
36
|
-
let options = new safari.Options().setCleanSession(true),
|
|
37
|
-
caps = options.toCapabilities();
|
|
38
|
-
assert(safari.Options.fromCapabilities(caps)).equalTo(options);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('extracts supported WebDriver capabilities', function() {
|
|
42
|
-
let proxyPrefs = proxy.direct(),
|
|
43
|
-
logPrefs = {},
|
|
44
|
-
caps = webdriver.Capabilities.chrome()
|
|
45
|
-
.set(webdriver.Capability.PROXY, proxyPrefs)
|
|
46
|
-
.set(webdriver.Capability.LOGGING_PREFS, logPrefs);
|
|
47
|
-
|
|
48
|
-
let options = safari.Options.fromCapabilities(caps);
|
|
49
|
-
assert(options.proxy_).equalTo(proxyPrefs);
|
|
50
|
-
assert(options.logPrefs_).equalTo(logPrefs);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe('toCapabilities', function() {
|
|
55
|
-
let options;
|
|
56
|
-
|
|
57
|
-
before(function() {
|
|
58
|
-
options = new safari.Options()
|
|
59
|
-
.setCleanSession(true);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('returns a new capabilities object if one is not provided', function() {
|
|
63
|
-
let caps = options.toCapabilities();
|
|
64
|
-
assert(caps).instanceOf(webdriver.Capabilities);
|
|
65
|
-
assert(caps.get('browserName')).equalTo('safari');
|
|
66
|
-
assert(caps.get('safari.options')).equalTo(options);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('adds to input capabilities object', function() {
|
|
70
|
-
let caps = webdriver.Capabilities.safari();
|
|
71
|
-
assert(options.toCapabilities(caps)).equalTo(caps);
|
|
72
|
-
assert(caps.get('safari.options')).equalTo(options);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('sets generic driver capabilities', function() {
|
|
76
|
-
let proxyPrefs = proxy.direct(),
|
|
77
|
-
loggingPrefs = {};
|
|
78
|
-
|
|
79
|
-
options
|
|
80
|
-
.setLoggingPrefs(loggingPrefs)
|
|
81
|
-
.setProxy(proxyPrefs);
|
|
82
|
-
|
|
83
|
-
let caps = options.toCapabilities();
|
|
84
|
-
assert(caps.get('proxy')).equalTo(proxyPrefs);
|
|
85
|
-
assert(caps.get('loggingPrefs')).equalTo(loggingPrefs);
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
26
|
|
|
90
27
|
test.suite(function(env) {
|
|
91
28
|
describe('safaridriver', function() {
|
|
@@ -97,12 +34,11 @@ test.suite(function(env) {
|
|
|
97
34
|
}
|
|
98
35
|
});
|
|
99
36
|
|
|
100
|
-
it('can start safaridriver', function() {
|
|
37
|
+
it('can start safaridriver', async function() {
|
|
101
38
|
service = new safari.ServiceBuilder().build();
|
|
102
39
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
});
|
|
40
|
+
let url = await service.start();
|
|
41
|
+
assert(/127\.0\.0\.1/.test(url), `unexpected url: ${url}`);
|
|
106
42
|
});
|
|
107
43
|
});
|
|
108
44
|
}, {browsers: ['safari']});
|
|
@@ -17,47 +17,44 @@
|
|
|
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
|
-
assert = require('../testing/assert'),
|
|
27
|
-
test = require('../lib/test'),
|
|
28
|
-
Pages = test.Pages;
|
|
23
|
+
const test = require('../lib/test');
|
|
24
|
+
const {Browser, By, error, until} = require('..');
|
|
25
|
+
const Pages = test.Pages;
|
|
29
26
|
|
|
30
27
|
|
|
31
28
|
test.suite(function(env) {
|
|
32
29
|
var driver;
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
before(async function() { driver = await env.builder().build(); });
|
|
31
|
+
after(function() { return driver.quit(); });
|
|
35
32
|
|
|
36
33
|
// Element never goes stale in Safari.
|
|
37
34
|
test.ignore(env.browsers(Browser.SAFARI)).
|
|
38
35
|
it(
|
|
39
36
|
'dynamically removing elements from the DOM trigger a ' +
|
|
40
37
|
'StaleElementReferenceError',
|
|
41
|
-
function
|
|
42
|
-
|
|
38
|
+
async function() {
|
|
39
|
+
await driver.get(Pages.javascriptPage);
|
|
43
40
|
|
|
44
|
-
var toBeDeleted =
|
|
45
|
-
|
|
41
|
+
var toBeDeleted = await driver.findElement(By.id('deleted'));
|
|
42
|
+
assert.equal(await toBeDeleted.getTagName(), 'p');
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
await driver.findElement(By.id('delete')).click();
|
|
45
|
+
await driver.wait(until.stalenessOf(toBeDeleted), 5000);
|
|
49
46
|
});
|
|
50
47
|
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
it('an element found in a different frame is stale', async function() {
|
|
49
|
+
await driver.get(Pages.missedJsReferencePage);
|
|
53
50
|
|
|
54
|
-
var frame =
|
|
55
|
-
|
|
51
|
+
var frame = await driver.findElement(By.css('iframe[name="inner"]'));
|
|
52
|
+
await driver.switchTo().frame(frame);
|
|
56
53
|
|
|
57
|
-
var el =
|
|
58
|
-
|
|
54
|
+
var el = await driver.findElement(By.id('oneline'));
|
|
55
|
+
await driver.switchTo().defaultContent();
|
|
59
56
|
return el.getText().then(fail, function(e) {
|
|
60
|
-
assert(e
|
|
57
|
+
assert.ok(e instanceof error.StaleElementReferenceError);
|
|
61
58
|
});
|
|
62
59
|
});
|
|
63
60
|
});
|
package/test/tag_name_test.js
CHANGED
|
@@ -17,20 +17,21 @@
|
|
|
17
17
|
|
|
18
18
|
'use strict';
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
const assert = require('assert');
|
|
21
|
+
|
|
22
|
+
const test = require('../lib/test');
|
|
23
|
+
const {By} = require('..');
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
test.suite(function(env) {
|
|
26
27
|
var driver;
|
|
27
|
-
|
|
28
|
+
after(function() { return driver.quit(); });
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
driver =
|
|
31
|
-
|
|
30
|
+
it('should return lower case tag name', async function() {
|
|
31
|
+
driver = await env.builder().build();
|
|
32
|
+
await driver.get(test.Pages.formPage);
|
|
32
33
|
|
|
33
|
-
let el =
|
|
34
|
-
|
|
34
|
+
let el = await driver.findElement(By.id('cheese'));
|
|
35
|
+
assert.equal(await el.getTagName(), 'input');
|
|
35
36
|
});
|
|
36
37
|
});
|
package/test/upload_test.js
CHANGED
|
@@ -17,23 +17,22 @@
|
|
|
17
17
|
|
|
18
18
|
'use strict';
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
const assert = require('assert');
|
|
21
|
+
const fs = require('fs');
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
test = require('../lib/test'),
|
|
29
|
-
Pages = test.Pages;
|
|
23
|
+
const io = require('../io');
|
|
24
|
+
const remote = require('../remote');
|
|
25
|
+
const test = require('../lib/test');
|
|
26
|
+
const {Browser, By, until} = require('..');
|
|
27
|
+
|
|
28
|
+
const Pages = test.Pages;
|
|
30
29
|
|
|
31
30
|
test.suite(function(env) {
|
|
32
31
|
var LOREM_IPSUM_TEXT = 'lorem ipsum dolor sit amet';
|
|
33
32
|
var FILE_HTML = '<!DOCTYPE html><div>' + LOREM_IPSUM_TEXT + '</div>';
|
|
34
33
|
|
|
35
34
|
var fp;
|
|
36
|
-
|
|
35
|
+
before(function() {
|
|
37
36
|
return fp = io.tmpFile().then(function(fp) {
|
|
38
37
|
fs.writeFileSync(fp, FILE_HTML);
|
|
39
38
|
return fp;
|
|
@@ -41,46 +40,39 @@ test.suite(function(env) {
|
|
|
41
40
|
})
|
|
42
41
|
|
|
43
42
|
var driver;
|
|
44
|
-
|
|
45
|
-
driver =
|
|
43
|
+
before(async function() {
|
|
44
|
+
driver = await env.builder().build();
|
|
46
45
|
});
|
|
47
46
|
|
|
48
|
-
|
|
47
|
+
after(function() {
|
|
49
48
|
if (driver) {
|
|
50
49
|
return driver.quit();
|
|
51
50
|
}
|
|
52
51
|
});
|
|
53
52
|
|
|
54
|
-
test.ignore(env.browsers(
|
|
55
|
-
|
|
56
|
-
Browser.IPHONE,
|
|
57
|
-
// Uploads broken in PhantomJS 2.0.
|
|
58
|
-
// See https://github.com/ariya/phantomjs/issues/12506
|
|
59
|
-
Browser.PHANTOM_JS,
|
|
60
|
-
Browser.SAFARI)).
|
|
61
|
-
it('can upload files', function*() {
|
|
53
|
+
test.ignore(env.browsers(Browser.SAFARI)).
|
|
54
|
+
it('can upload files', async function() {
|
|
62
55
|
driver.setFileDetector(new remote.FileDetector);
|
|
63
56
|
|
|
64
|
-
|
|
57
|
+
await driver.get(Pages.uploadPage);
|
|
65
58
|
|
|
66
|
-
var fp =
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return fp;
|
|
70
|
-
});
|
|
59
|
+
var fp = await io.tmpFile().then(function(fp) {
|
|
60
|
+
fs.writeFileSync(fp, FILE_HTML);
|
|
61
|
+
return fp;
|
|
71
62
|
});
|
|
72
63
|
|
|
73
|
-
|
|
74
|
-
|
|
64
|
+
await driver.findElement(By.id('upload')).sendKeys(fp);
|
|
65
|
+
await driver.findElement(By.id('go')).click();
|
|
75
66
|
|
|
76
67
|
// Uploading files across a network may take a while, even if they're small.
|
|
77
|
-
var label =
|
|
78
|
-
|
|
68
|
+
var label = await driver.findElement(By.id('upload_label'));
|
|
69
|
+
await driver.wait(until.elementIsNotVisible(label),
|
|
79
70
|
10 * 1000, 'File took longer than 10 seconds to upload!');
|
|
80
71
|
|
|
81
|
-
var frame =
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
.
|
|
72
|
+
var frame = await driver.findElement(By.id('upload_target'));
|
|
73
|
+
await driver.switchTo().frame(frame);
|
|
74
|
+
assert.equal(
|
|
75
|
+
await driver.findElement(By.css('body')).getText(),
|
|
76
|
+
LOREM_IPSUM_TEXT);
|
|
85
77
|
});
|
|
86
78
|
});
|
package/test/window_test.js
CHANGED
|
@@ -17,128 +17,115 @@
|
|
|
17
17
|
|
|
18
18
|
'use strict';
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
const assert = require('assert');
|
|
21
|
+
|
|
22
|
+
const test = require('../lib/test');
|
|
23
|
+
const {Browser, By} = require('..');
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
test.suite(function(env) {
|
|
27
27
|
var driver;
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
before(async function() { driver = await env.builder().build(); });
|
|
30
|
+
after(function() { return driver.quit(); });
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
beforeEach(function() {
|
|
33
33
|
return driver.switchTo().defaultContent();
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
it('can set size of the current window', async function() {
|
|
37
|
+
await driver.get(test.Pages.echoPage);
|
|
38
|
+
await changeSizeBy(-20, -20);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
it('can set size of the current window from frame', async function() {
|
|
42
|
+
await driver.get(test.Pages.framesetPage);
|
|
43
43
|
|
|
44
|
-
var frame =
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
var frame = await driver.findElement({css: 'frame[name="fourth"]'});
|
|
45
|
+
await driver.switchTo().frame(frame);
|
|
46
|
+
await changeSizeBy(-20, -20);
|
|
47
47
|
});
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
it('can set size of the current window from iframe', async function() {
|
|
50
|
+
await driver.get(test.Pages.iframePage);
|
|
51
51
|
|
|
52
|
-
var frame =
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
var frame = await driver.findElement({css: 'iframe[name="iframe1-name"]'});
|
|
53
|
+
await driver.switchTo().frame(frame);
|
|
54
|
+
await changeSizeBy(-20, -20);
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
it('can switch to a new window', async function() {
|
|
58
|
+
await driver.get(test.Pages.xhtmlTestPage);
|
|
59
59
|
|
|
60
|
-
let handle =
|
|
61
|
-
let originalHandles =
|
|
60
|
+
let handle = await driver.getWindowHandle();
|
|
61
|
+
let originalHandles = await driver.getAllWindowHandles();
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
await driver.findElement(By.linkText("Open new window")).click();
|
|
64
|
+
await driver.wait(forNewWindowToBeOpened(originalHandles), 2000);
|
|
65
|
+
assert.equal(await driver.getTitle(), "XHTML Test Page");
|
|
66
66
|
|
|
67
|
-
let newHandle =
|
|
67
|
+
let newHandle = await getNewWindowHandle(originalHandles);
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
await driver.switchTo().window(newHandle);
|
|
70
|
+
assert.equal(await driver.getTitle(), "We Arrive Here");
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
let
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
var dy = position.y + 10;
|
|
87
|
-
return driver.wait(forPositionToBe(dx, dy), 1000);
|
|
88
|
-
}
|
|
73
|
+
it('can set the window position of the current window', async function() {
|
|
74
|
+
let {x, y} = await driver.manage().window().getRect();
|
|
75
|
+
let newX = x + 10;
|
|
76
|
+
let newY = y + 10;
|
|
77
|
+
|
|
78
|
+
await driver.manage().window().setRect({
|
|
79
|
+
x: newX,
|
|
80
|
+
y: newY,
|
|
81
|
+
width: 640,
|
|
82
|
+
height: 480
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return driver.wait(forPositionToBe(newX, newY), 1000);
|
|
89
86
|
});
|
|
90
87
|
|
|
91
|
-
|
|
92
|
-
|
|
88
|
+
it('can set the window position from a frame', async function() {
|
|
89
|
+
await driver.get(test.Pages.iframePage);
|
|
93
90
|
|
|
94
|
-
let frame =
|
|
95
|
-
|
|
91
|
+
let frame = await driver.findElement(By.name('iframe1-name'));
|
|
92
|
+
await driver.switchTo().frame(frame);
|
|
96
93
|
|
|
97
|
-
let
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
let {x, y} = await driver.manage().window().getRect();
|
|
95
|
+
x += 10;
|
|
96
|
+
y += 10;
|
|
100
97
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
return driver.manage().window().getPosition().then(function(position) {
|
|
104
|
-
assert(position.x).equalTo(0);
|
|
105
|
-
assert(position.y).equalTo(0);
|
|
106
|
-
});
|
|
107
|
-
} else {
|
|
108
|
-
var dx = position.x + 10;
|
|
109
|
-
var dy = position.y + 10;
|
|
110
|
-
return driver.wait(forPositionToBe(dx, dy), 1000);
|
|
111
|
-
}
|
|
98
|
+
await driver.manage().window().setRect({width: 640, height: 480, x, y});
|
|
99
|
+
return driver.wait(forPositionToBe(x, y), 1000);
|
|
112
100
|
});
|
|
113
101
|
|
|
114
|
-
function changeSizeBy(dx, dy) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
102
|
+
async function changeSizeBy(dx, dy) {
|
|
103
|
+
let {width, height} = await driver.manage().window().getRect();
|
|
104
|
+
width += dx;
|
|
105
|
+
height += dy;
|
|
106
|
+
|
|
107
|
+
let rect = await driver.manage().window().setRect({width, height});
|
|
108
|
+
if (rect.width === width && rect.height === height) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
return driver.wait(forSizeToBe(width, height), 1000);
|
|
123
112
|
}
|
|
124
113
|
|
|
125
114
|
function forSizeToBe(w, h) {
|
|
126
|
-
return function() {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
});
|
|
115
|
+
return async function() {
|
|
116
|
+
let {width, height} = await driver.manage().window().getRect();
|
|
117
|
+
return width === w && height === h;
|
|
130
118
|
};
|
|
131
119
|
}
|
|
132
120
|
|
|
133
121
|
function forPositionToBe(x, y) {
|
|
134
|
-
return function() {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
});
|
|
122
|
+
return async function() {
|
|
123
|
+
let position = await driver.manage().window().getRect();
|
|
124
|
+
return position.x === x &&
|
|
125
|
+
// On OSX, the window height may be bumped down 22px for the top
|
|
126
|
+
// status bar.
|
|
127
|
+
// On Linux, Opera's window position will be off by 28px.
|
|
128
|
+
(position.y >= y && position.y <= (y + 28));
|
|
142
129
|
};
|
|
143
130
|
}
|
|
144
131
|
|