Jacek Migdal 2014-12-11 20:18:44 -08:00
parent 0bf14a3d0c
commit 32d20b4aa7
11 changed files with 204 additions and 329 deletions

View File

@ -90,6 +90,32 @@ function typeOf(object, expected) {
++total;
}
function waitFor(condition, callback, options) {
callback = callback || function() {};
options = options || {};
var poolMs = options.poolMs || 10;
var timeoutMs = options.timeoutMs || 1000;
var cutoffMs = timeoutMs + new Date().getTime();
var waitForInternal = function () {
if (condition()) {
++total;
callback();
} else {
var now = new Date().getTime();
if (now < cutoffMs) {
window.setTimeout(waitForInternal, poolMs);
} else {
console.error("Timeout while waiting for ''",
condition.toString(), "'");
showError();
}
}
}
waitForInternal();
}
exports.timeout = timeout;
exports.isTrue = isTrue;
exports.equal = equal;
@ -97,3 +123,4 @@ exports.jsonEqual = jsonEqual;
exports.notEqual = notEqual;
exports.strictEqual = strictEqual;
exports.typeOf = typeOf;
exports.waitFor = waitFor;

View File

@ -1,20 +0,0 @@
var assert = require('../assert');
phantom.onError = undefined;
assert.typeOf(phantom.onError, 'undefined');
var onErrorFunc1 = function() { return !"x"; };
phantom.onError = onErrorFunc1;
asssert.deepEqual(phantom.onError, onErrorFunc1);
var onErrorFunc2 = function() { return !!"y"; };
phantom.onError = onErrorFunc2;
asssert.deepEqual(phantom.onError, onErrorFunc2);
asssert.isTrue(phantom.onError != onErrorFunc1);
// Will only allow setting to a function value, so setting it to `null` returns `undefined`
phantom.onError = null;
assert.typeOf(phantom.onError, 'undefined');
phantom.onError = undefined;
assert.typeOf(phantom.onError, 'undefined');

View File

@ -1,14 +0,0 @@
var assert = require('../../assert');
var page = require('webpage').create();
var msg = "message body",
result,
expected = true;
page.onConfirm = function(msg) {
return true;
};
result = page.evaluate(function(m) {
return window.confirm(m);
}, msg);
assert.equal(result, expected);

View File

@ -0,0 +1,36 @@
var assert = require('../../assert');
var page = require('webpage').create();
page.evaluate(function() {
window.addEventListener('mousedown', function(event) {
window.loggedEvent = window.loggedEvent || {};
window.loggedEvent.mousedown = event;
}, false);
window.addEventListener('mouseup', function(event) {
window.loggedEvent = window.loggedEvent || {};
window.loggedEvent.mouseup = event;
}, false);
});
page.sendEvent('click', 42, 217);
var event = page.evaluate(function() {
return window.loggedEvent;
});
assert.equal(event.mouseup.clientX, 42);
assert.equal(event.mouseup.clientY, 217);
assert.equal(event.mousedown.clientX, 42);
assert.equal(event.mousedown.clientY, 217);
// click with modifier key
page.evaluate(function() {
window.addEventListener('click', function(event) {
window.loggedEvent = window.loggedEvent || {};
window.loggedEvent.click = event;
}, false);
});
page.sendEvent('click', 100, 100, 'left', page.event.modifier.shift);
var event = page.evaluate(function() {
return window.loggedEvent.click;
});
assert.isTrue(event.shiftKey);

View File

@ -0,0 +1,29 @@
var assert = require('../../assert');
var page = require('webpage').create();
page.content = '<input id="doubleClickField" type="text" onclick="document.getElementById(\'doubleClickField\').value=\'clicked\';" ondblclick="document.getElementById(\'doubleClickField\').value=\'doubleclicked\';" oncontextmenu="document.getElementById(\'doubleClickField\').value=\'rightclicked\'; return false;" value="hello"/>';
var point = page.evaluate(function () {
var el = document.querySelector('input');
var rect = el.getBoundingClientRect();
return { x: rect.left + Math.floor(rect.width / 2), y: rect.top + (rect.height / 2) };
});
page.sendEvent('doubleclick', point.x, point.y);
var text = page.evaluate(function () {
return document.querySelector('input').value;
});
assert.equal(text, "doubleclicked");
// click with modifier key
page.evaluate(function() {
window.addEventListener('dblclick', function(event) {
window.loggedEvent = window.loggedEvent || {};
window.loggedEvent.dblclick = event;
}, false);
});
page.sendEvent('doubleclick', 100, 100, 'left', page.event.modifier.shift);
var event = page.evaluate(function() {
return window.loggedEvent.dblclick;
});
assert.isTrue(event.shiftKey);

View File

@ -1,7 +1,5 @@
var assert = require('../../assert');
var webpage = require('webpage');
var page = webpage.create();
var page = require('webpage').create();
page.evaluate(function() {
window.addEventListener('mousedown', function(event) {

View File

@ -1,7 +1,5 @@
var assert = require('../../assert');
var webpage = require('webpage');
var page = webpage.create();
var page = require('webpage').create();
page.evaluate(function() {
window.addEventListener('mousemove', function(event) {

View File

@ -0,0 +1,31 @@
var assert = require('../../assert');
var page = require('webpage').create();
var msg = "message body",
result,
expected = true;
assert.equal(page.onConfirm, undefined);
var onConfirmTrue = function(msg) {
return true;
};
page.onConfirm = onConfirmTrue;
assert.equal(page.onConfirm, onConfirmTrue);
result = page.evaluate(function(m) {
return window.confirm(m);
}, msg);
assert.equal(result, expected);
var onConfirmFunc = function() { return !!"y"; };
page.onConfirm = onConfirmFunc2;
assert.equal(page.onConfirm, onConfirmFunc);
assert.notEqual(page.onConfirm, onConfirmTrue);
page.onConfirm = null;
// Will only allow setting to a function value, so setting it to `null` returns `undefined`
assert.equal(page.onConfirm, undefined);
page.onConfirm = undefined;
assert.equal(page.onConfirm, undefined);

View File

@ -0,0 +1,59 @@
var assert = require('../../assert');
var page = require('webpage').create();
assert.notEqual(page.onError, undefined);
var onErrorFunc1 = function() { return !"x"; };
page.onError = onErrorFunc1;
assert.equal(page.onError, onErrorFunc1);
var onErrorFunc2 = function() { return !!"y"; };
page.onError = onErrorFunc2;
assert.equal(page.onError, onErrorFunc2);
assert.notEqual(page.onError, onErrorFunc1);
page.onError = null;
// Will only allow setting to a function value, so setting it to `null` returns `undefined`
assert.equal(page.onError, undefined);
page.onError = undefined;
assert.equal(page.onError, undefined);
// reports error
var lastError = null;
page.onError = function(message) { lastError = message; };
page.evaluate(function() { referenceError2(); });
assert.equal(lastError, "ReferenceError: Can't find variable: referenceError2");
page.evaluate(function() { throw "foo"; });
assert.equal(lastError, "foo");
page.evaluate(function() { throw Error("foo"); });
assert.equal(lastError, "Error: foo");
// don't report handled errors
var hadError = false;
var caughtError = false;
page.onError = function() { hadError = true; };
page.evaluate(function() {
caughtError = false;
try {
referenceError();
} catch(e) {
caughtError = true;
}
});
assert.equal(hadError, false);
assert.isTrue(page.evaluate(function() { return caughtError; }));
// even with async
page.evaluate(function() {
setTimeout(function() { referenceError(); }, 0);
});
assert.waitFor(function() {
return lastError == "ReferenceError: Can't find variable: referenceError";
});

View File

@ -0,0 +1,20 @@
var assert = require('../../assert');
var page = require('webpage').create();
assert.equal(page.onInitialized, undefined);
var onInitialized1 = function() { var x = "x"; };
page.onInitialized = onInitialized1;
assert.equal(page.onInitialized, onInitialized1);
var onInitialized2 = function() { var y = "y"; };
page.onInitialized = onInitialized2;
assert.equal(page.onInitialized, onInitialized2);
assert.notEqual(page.onInitialized, onInitialized1);
page.onInitialized = null;
// Will only allow setting to a function value, so setting it to `null` returns `undefined`
assert.equal(page.onInitialized, undefined);
page.onInitialized = undefined;
assert.equal(page.onInitialized, undefined);

View File

@ -1,148 +1,6 @@
describe("WebPage object", function() {
var page = new WebPage();
it("should be able to get any signal handler that are currently set on it", function() {
page.onInitialized = undefined;
expect(page.onInitialized).toBeUndefined();
var onInitialized1 = function() { var x = "x"; };
page.onInitialized = onInitialized1;
expect(page.onInitialized).toEqual(onInitialized1);
var onInitialized2 = function() { var y = "y"; };
page.onInitialized = onInitialized2;
expect(page.onInitialized).toEqual(onInitialized2);
expect(page.onInitialized).toNotEqual(onInitialized1);
page.onInitialized = null;
// Will only allow setting to a function value, so setting it to `null` returns `undefined`
expect(page.onInitialized).toBeUndefined();
page.onInitialized = undefined;
expect(page.onInitialized).toBeUndefined();
});
it("should be able to get any callback handler that are currently set on it", function() {
page.onConfirm = undefined;
expect(page.onConfirm).toBeUndefined();
var onConfirmFunc1 = function() { return !"x"; };
page.onConfirm = onConfirmFunc1;
expect(page.onConfirm).toEqual(onConfirmFunc1);
var onConfirmFunc2 = function() { return !!"y"; };
page.onConfirm = onConfirmFunc2;
expect(page.onConfirm).toEqual(onConfirmFunc2);
expect(page.onConfirm).toNotEqual(onConfirmFunc1);
page.onConfirm = null;
// Will only allow setting to a function value, so setting it to `null` returns `undefined`
expect(page.onConfirm).toBeUndefined();
page.onConfirm = undefined;
expect(page.onConfirm).toBeUndefined();
});
it("should be able to get the error signal handler that is currently set on it (currently a special 1-off case)", function() {
page.onError = undefined;
expect(page.onError).toBeUndefined();
var onErrorFunc1 = function() { return !"x"; };
page.onError = onErrorFunc1;
expect(page.onError).toEqual(onErrorFunc1);
var onErrorFunc2 = function() { return !!"y"; };
page.onError = onErrorFunc2;
expect(page.onError).toEqual(onErrorFunc2);
expect(page.onError).toNotEqual(onErrorFunc1);
page.onError = null;
// Will only allow setting to a function value, so setting it to `null` returns `undefined`
expect(page.onError).toBeUndefined();
page.onError = undefined;
expect(page.onError).toBeUndefined();
});
it("should handle click event", function() {
runs(function() {
page.evaluate(function() {
window.addEventListener('mousedown', function(event) {
window.loggedEvent = window.loggedEvent || {};
window.loggedEvent.mousedown = event;
}, false);
window.addEventListener('mouseup', function(event) {
window.loggedEvent = window.loggedEvent || {};
window.loggedEvent.mouseup = event;
}, false);
});
page.sendEvent('click', 42, 217);
});
waits(50);
runs(function() {
var event = page.evaluate(function() {
return window.loggedEvent;
});
expect(event.mouseup.clientX).toEqual(42);
expect(event.mouseup.clientY).toEqual(217);
expect(event.mousedown.clientX).toEqual(42);
expect(event.mousedown.clientY).toEqual(217);
});
});
it("should handle doubleclick event", function () {
runs(function () {
page.content = '<input id="doubleClickField" type="text" onclick="document.getElementById(\'doubleClickField\').value=\'clicked\';" ondblclick="document.getElementById(\'doubleClickField\').value=\'doubleclicked\';" oncontextmenu="document.getElementById(\'doubleClickField\').value=\'rightclicked\'; return false;" value="hello"/>';
var point = page.evaluate(function () {
var el = document.querySelector('input');
var rect = el.getBoundingClientRect();
return { x: rect.left + Math.floor(rect.width / 2), y: rect.top + (rect.height / 2) };
});
page.sendEvent('doubleclick', point.x, point.y);
});
waits(50);
runs(function () {
var text = page.evaluate(function () {
return document.querySelector('input').value;
});
expect(text).toEqual("doubleclicked");
});
});
it("should handle click with modifier keys", function() {
runs(function() {
page.evaluate(function() {
window.addEventListener('click', function(event) {
window.loggedEvent = window.loggedEvent || {};
window.loggedEvent.click = event;
}, false);
});
page.sendEvent('click', 100, 100, 'left', page.event.modifier.shift);
});
waits(50);
runs(function() {
var event = page.evaluate(function() {
return window.loggedEvent.click;
});
expect(event.shiftKey).toEqual(true);
});
});
it("should handle doubleclick with modifier keys", function() {
runs(function() {
page.evaluate(function() {
window.addEventListener('dblclick', function(event) {
window.loggedEvent = window.loggedEvent || {};
window.loggedEvent.dblclick = event;
}, false);
});
page.sendEvent('doubleclick', 100, 100, 'left', page.event.modifier.shift);
});
waits(50);
runs(function() {
var event = page.evaluate(function() {
return window.loggedEvent.dblclick;
});
expect(event.shiftKey).toEqual(true);
});
});
xit("should handle file uploads", function() {
runs(function() {
page.content = '<input type="file" id="file">\n' +
@ -181,78 +39,6 @@ describe("WebPage object", function() {
});
});
it("reports unhandled errors", function() {
var lastError = null;
var page = new require('webpage').create();
page.onError = function(message) { lastError = message; };
runs(function() {
page.evaluate(function() {
setTimeout(function() { referenceError(); }, 0);
});
});
waits(0);
runs(function() {
expect(lastError).toEqual("ReferenceError: Can't find variable: referenceError");
page.evaluate(function() { referenceError2(); });
expect(lastError).toEqual("ReferenceError: Can't find variable: referenceError2");
page.evaluate(function() { throw "foo"; });
expect(lastError).toEqual("foo");
page.evaluate(function() { throw Error("foo"); });
expect(lastError).toEqual("Error: foo");
});
});
it("doesn't report handled errors", function() {
var hadError = false;
var caughtError = false;
var page = require('webpage').create();
runs(function() {
page.onError = function() { hadError = true; };
page.evaluate(function() {
caughtError = false;
try {
referenceError();
} catch(e) {
caughtError = true;
}
});
expect(hadError).toEqual(false);
expect(page.evaluate(function() { return caughtError; })).toEqual(true);
});
});
it("reports the sourceURL and line of errors", function() {
runs(function() {
var e1, e2;
try {
referenceError();
} catch (e) {
e1 = e;
}
try {
referenceError();
} catch (e) {
e2 = e;
}
expect(e1.sourceURL).toMatch(/webpage-spec.js$/);
expect(e1.line).toBeGreaterThan(1);
expect(e2.line).toEqual(e1.line + 6);
});
});
xit("reports the stack of errors", function() {
var helperFile = "./fixtures/error-helper.js";
phantom.injectJs(helperFile);
@ -293,22 +79,6 @@ describe("WebPage object", function() {
});
});
it("reports errors that occur in the main context", function() {
var error;
phantom.onError = function(e) { error = e; };
runs(function() {
setTimeout(function() { zomg(); }, 0);
});
waits(0);
runs(function() {
expect(error.toString()).toEqual("ReferenceError: Can't find variable: zomg");
phantom.onError = phantom.defaultErrorHandler;
});
});
it("should process request body properly for POST", function() {
var server = require('webserver').create();
server.listen(12345, function(request, response) {
@ -602,65 +372,6 @@ describe("WebPage object", function() {
});
});
it("should pass variables to functions properly", function() {
var testPrimitiveArgs = function() {
var samples = [
true,
0,
"`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?",
undefined,
null
];
for (var i = 0; i < samples.length; i++) {
if (samples[i] !== arguments[i]) {
console.log("FAIL");
}
}
};
var testComplexArgs = function() {
var samples = [
{a:true, b:0, c:"string"},
function() { return true; },
[true, 0, "string"],
/\d+\w*\//
];
for (var i = 0; i < samples.length; i++) {
if (typeof samples[i] !== typeof arguments[i] ||
samples[i].toString() !== arguments[i].toString()) {
console.log("FAIL");
}
}
};
var message;
runs(function() {
page.onConsoleMessage = function (msg) {
message = msg;
};
});
waits(0);
runs(function() {
page.evaluate(function() {
console.log("PASS");
});
page.evaluate(testPrimitiveArgs,
true,
0,
"`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?",
undefined,
null);
page.evaluate(testComplexArgs,
{a:true, b:0, c:"string"},
function() { return true; },
[true, 0, "string"],
/\d+\w*\//);
expect(message).toEqual("PASS");
});
});
it('should open url using secure connection', function() {
var page = require('webpage').create();
var url = 'https://httpbin.org/';