Skip to content

Commit d6df783

Browse files
committed
Fixing cookie commands. Include port of java cookie regression tests.
Fixes issue 5321.
1 parent 2072eb5 commit d6df783

File tree

5 files changed

+212
-17
lines changed

5 files changed

+212
-17
lines changed

javascript/node/selenium-webdriver/CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* promise.Deferred#resolve() -> promise.Deferred#fulfill()
1717
* FIXED: remote.SeleniumServer#stop now shuts down within the active control
1818
flow, allowing scripts to finish. Use #kill to shutdown immediately.
19+
* FIXED: 5321: cookie deletion commands
1920

2021
## v2.31.0
2122

javascript/node/selenium-webdriver/testing/index.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,13 @@ function ignore(predicateFn) {
159159
exports.describe = global.describe;
160160
exports.xdescribe = global.xdescribe;
161161

162-
exports.after = wrapped(after);
163-
exports.afterEach = wrapped(afterEach);
164-
exports.before = wrapped(before);
165-
exports.beforeEach = wrapped(beforeEach);
166-
167-
exports.it = wrapped(it);
168-
exports.it.only = exports.iit = wrapped(it.only);
169-
exports.it.skip = exports.xit = wrapped(it.skip);
162+
exports.after = wrapped(global.after);
163+
exports.afterEach = wrapped(global.afterEach);
164+
exports.before = wrapped(global.before);
165+
exports.beforeEach = wrapped(global.beforeEach);
166+
167+
exports.it = wrapped(global.it);
168+
exports.it.only = exports.iit = wrapped(global.it.only);
169+
exports.it.skip = exports.xit = wrapped(global.xit);
170170

171171
exports.ignore = ignore;
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
// Copyright 2013 Selenium committers
2+
// Copyright 2013 Software Freedom Conservancy
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
'use strict';
17+
18+
require('./lib/_bootstrap')(module);
19+
20+
var assert = require('assert'),
21+
url = require('url');
22+
23+
var fileserver = require('./lib/fileserver'),
24+
test = require('./lib/testbase'),
25+
Browser = test.Browser,
26+
Pages = test.Pages;
27+
28+
29+
test.suite(function(env) {
30+
var driver;
31+
beforeEach(function() { driver = env.driver; });
32+
33+
describe('Cookie Management;', function() {
34+
35+
test.beforeEach(function() {
36+
driver.get(fileserver.Pages.ajaxyPage);
37+
driver.manage().deleteAllCookies();
38+
assertHasCookies();
39+
});
40+
41+
test.it('can add new cookies', function() {
42+
var cookie = createCookieSpec();
43+
44+
driver.manage().addCookie(cookie.name, cookie.value);
45+
driver.manage().getCookie(cookie.name).then(function(actual) {
46+
assert.equal(actual.value, cookie.value);
47+
});
48+
});
49+
50+
test.it('can get all cookies', function() {
51+
var cookie1 = createCookieSpec();
52+
var cookie2 = createCookieSpec();
53+
54+
driver.manage().addCookie(cookie1.name, cookie1.value);
55+
driver.manage().addCookie(cookie2.name, cookie2.value);
56+
57+
assertHasCookies(cookie1, cookie2);
58+
});
59+
60+
test.ignore(env.browsers(Browser.OPERA)).
61+
it('only returns cookies visible to the current page', function() {
62+
var cookie1 = createCookieSpec();
63+
var cookie2 = createCookieSpec();
64+
65+
driver.manage().addCookie(cookie1.name, cookie1.value);
66+
67+
var pageUrl = fileserver.whereIs('page/1');
68+
driver.get(pageUrl);
69+
driver.manage().addCookie(
70+
cookie2.name, cookie2.value, url.parse(pageUrl).pathname);
71+
assertHasCookies(cookie1, cookie2);
72+
73+
driver.get(fileserver.Pages.ajaxyPage);
74+
assertHasCookies(cookie1);
75+
76+
driver.get(pageUrl);
77+
assertHasCookies(cookie1, cookie2);
78+
});
79+
80+
test.it('can delete all cookies', function() {
81+
var cookie1 = createCookieSpec();
82+
var cookie2 = createCookieSpec();
83+
84+
driver.executeScript(
85+
'document.cookie = arguments[0] + "=" + arguments[1];' +
86+
'document.cookie = arguments[2] + "=" + arguments[3];',
87+
cookie1.name, cookie1.value, cookie2.name, cookie2.value);
88+
assertHasCookies(cookie1, cookie2);
89+
90+
driver.manage().deleteAllCookies();
91+
assertHasCookies();
92+
});
93+
94+
test.it('can delete cookies by name', function() {
95+
var cookie1 = createCookieSpec();
96+
var cookie2 = createCookieSpec();
97+
98+
driver.executeScript(
99+
'document.cookie = arguments[0] + "=" + arguments[1];' +
100+
'document.cookie = arguments[2] + "=" + arguments[3];',
101+
cookie1.name, cookie1.value, cookie2.name, cookie2.value);
102+
assertHasCookies(cookie1, cookie2);
103+
104+
driver.manage().deleteCookie(cookie1.name);
105+
assertHasCookies(cookie2);
106+
});
107+
108+
test.it('should only delete cookie with exact name', function() {
109+
var cookie1 = createCookieSpec();
110+
var cookie2 = createCookieSpec();
111+
var cookie3 = {name: cookie1.name + 'xx', value: cookie1.value};
112+
113+
driver.executeScript(
114+
'document.cookie = arguments[0] + "=" + arguments[1];' +
115+
'document.cookie = arguments[2] + "=" + arguments[3];' +
116+
'document.cookie = arguments[4] + "=" + arguments[5];',
117+
cookie1.name, cookie1.value, cookie2.name, cookie2.value,
118+
cookie3.name, cookie3.value);
119+
assertHasCookies(cookie1, cookie2, cookie3);
120+
121+
driver.manage().deleteCookie(cookie1.name);
122+
assertHasCookies(cookie2, cookie3);
123+
});
124+
125+
test.it('can delete cookies set higher in the path', function() {
126+
var cookie = createCookieSpec();
127+
var childUrl = fileserver.whereIs('child/childPage.html');
128+
var grandchildUrl = fileserver.whereIs(
129+
'child/grandchild/grandchildPage.html');
130+
131+
driver.get(childUrl);
132+
driver.manage().addCookie(cookie.name, cookie.value);
133+
assertHasCookies(cookie);
134+
135+
driver.get(grandchildUrl);
136+
assertHasCookies(cookie);
137+
138+
driver.manage().deleteCookie(cookie.name);
139+
assertHasCookies();
140+
141+
driver.get(childUrl);
142+
assertHasCookies();
143+
});
144+
145+
test.ignore(env.browsers(
146+
Browser.ANDROID, Browser.FIREFOX, Browser.IE, Browser.OPERA)).
147+
it('should retain cookie expiry', function() {
148+
var cookie = createCookieSpec();
149+
var expirationDelay = 5 * 1000;
150+
var futureTime = Date.now() + expirationDelay;
151+
152+
driver.manage().addCookie(
153+
cookie.name, cookie.value, null, null, false, futureTime);
154+
driver.manage().getCookie(cookie.name).then(function(actual) {
155+
assert.equal(actual.value, cookie.value);
156+
// expiry times are exchanged in seconds since January 1, 1970 UTC.
157+
assert.equal(actual.expiry, Math.floor(futureTime / 1000));
158+
});
159+
160+
driver.sleep(expirationDelay);
161+
assertHasCookies();
162+
});
163+
});
164+
165+
function createCookieSpec() {
166+
return {
167+
name: getRandomString(),
168+
value: getRandomString()
169+
};
170+
}
171+
172+
function buildCookieMap(cookies) {
173+
var map = {};
174+
cookies.forEach(function(cookie) {
175+
map[cookie.name] = cookie;
176+
});
177+
return map;
178+
}
179+
180+
function assertHasCookies(var_args) {
181+
var expected = arguments;
182+
driver.manage().getCookies().then(function(cookies) {
183+
assert.equal(cookies.length, expected.length);
184+
185+
var map = buildCookieMap(cookies);
186+
for (var i = 0; i < expected.length; ++i) {
187+
assert.equal(expected[i].value, map[expected[i].name].value);
188+
}
189+
});
190+
}
191+
192+
function getRandomString() {
193+
var x = 1234567890;
194+
return Math.floor(Math.random() * x).toString(36);
195+
}
196+
});

javascript/node/test/lib/testbase.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ function TestEnvironment(browserName) {
8585
this.__defineGetter__('driver', function() { return driver; });
8686

8787
this.browsers = function(var_args) {
88-
var browsersToIgnore = Array.prototype.slice.apply(arguments[0]);
88+
var browsersToIgnore = Array.prototype.slice.apply(arguments, [0]);
8989
return browsers(browserName, browsersToIgnore);
9090
};
9191

javascript/webdriver/webdriver.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -933,11 +933,8 @@ webdriver.WebDriver.Options = function(driver) {
933933
* @return {!webdriver.promise.Promise} A promise that will be resolved when the
934934
* cookie has been added to the page.
935935
*/
936-
webdriver.WebDriver.Options.prototype.addCookie = function(name, value,
937-
opt_path,
938-
opt_domain,
939-
opt_isSecure,
940-
opt_expiry) {
936+
webdriver.WebDriver.Options.prototype.addCookie = function(
937+
name, value, opt_path, opt_domain, opt_isSecure, opt_expiry) {
941938
// We do not allow '=' or ';' in the name.
942939
if (/[;=]/.test(name)) {
943940
throw Error('Invalid cookie name "' + name + '"');
@@ -964,7 +961,7 @@ webdriver.WebDriver.Options.prototype.addCookie = function(name, value,
964961
}
965962
cookieString += ';expires=' + expiryDate.toUTCString();
966963
// Convert from milliseconds to seconds.
967-
expiry = (/** @type {number} */opt_expiry) / 1000;
964+
expiry = Math.floor(/** @type {number} */ (opt_expiry) / 1000);
968965
}
969966

970967
return this.driver_.schedule(
@@ -988,7 +985,7 @@ webdriver.WebDriver.Options.prototype.addCookie = function(name, value,
988985
*/
989986
webdriver.WebDriver.Options.prototype.deleteAllCookies = function() {
990987
return this.driver_.schedule(
991-
new webdriver.Command(webdriver.CommandName.ADD_COOKIE),
988+
new webdriver.Command(webdriver.CommandName.DELETE_ALL_COOKIES),
992989
'WebDriver.manage().deleteAllCookies()');
993990
};
994991

@@ -1003,7 +1000,8 @@ webdriver.WebDriver.Options.prototype.deleteAllCookies = function() {
10031000
*/
10041001
webdriver.WebDriver.Options.prototype.deleteCookie = function(name) {
10051002
return this.driver_.schedule(
1006-
new webdriver.Command(webdriver.CommandName.DELETE_COOKIE),
1003+
new webdriver.Command(webdriver.CommandName.DELETE_COOKIE).
1004+
setParameter('name', name),
10071005
'WebDriver.manage().deleteCookie(' + name + ')');
10081006
};
10091007

0 commit comments

Comments
 (0)