diff --git a/test/assert.js b/test/assert.js
index b6d78f74..a0180290 100644
--- a/test/assert.js
+++ b/test/assert.js
@@ -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;
diff --git a/test/basics/onerror.js b/test/basics/onerror.js
deleted file mode 100644
index 4c8cb45a..00000000
--- a/test/basics/onerror.js
+++ /dev/null
@@ -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');
diff --git a/test/module/webpage/confirm.js b/test/module/webpage/confirm.js
deleted file mode 100644
index 14b2355a..00000000
--- a/test/module/webpage/confirm.js
+++ /dev/null
@@ -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);
diff --git a/test/module/webpage/mouseclick-event.js b/test/module/webpage/mouseclick-event.js
new file mode 100644
index 00000000..ffc22f1b
--- /dev/null
+++ b/test/module/webpage/mouseclick-event.js
@@ -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);
diff --git a/test/module/webpage/mousedoubleclick-event.js b/test/module/webpage/mousedoubleclick-event.js
new file mode 100644
index 00000000..e6b72f0e
--- /dev/null
+++ b/test/module/webpage/mousedoubleclick-event.js
@@ -0,0 +1,29 @@
+var assert = require('../../assert');
+var page = require('webpage').create();
+
+page.content = '';
+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);
diff --git a/test/module/webpage/mousedown-event.js b/test/module/webpage/mousedown-event.js
index 51e78e6e..3c68e08b 100644
--- a/test/module/webpage/mousedown-event.js
+++ b/test/module/webpage/mousedown-event.js
@@ -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) {
diff --git a/test/module/webpage/mousemove-event.js b/test/module/webpage/mousemove-event.js
index e287e1a5..6df34888 100644
--- a/test/module/webpage/mousemove-event.js
+++ b/test/module/webpage/mousemove-event.js
@@ -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) {
diff --git a/test/module/webpage/on-confirm.js b/test/module/webpage/on-confirm.js
new file mode 100644
index 00000000..14ea8b99
--- /dev/null
+++ b/test/module/webpage/on-confirm.js
@@ -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);
diff --git a/test/module/webpage/on-error.js b/test/module/webpage/on-error.js
new file mode 100644
index 00000000..93653659
--- /dev/null
+++ b/test/module/webpage/on-error.js
@@ -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";
+});
diff --git a/test/module/webpage/on-initialized.js b/test/module/webpage/on-initialized.js
new file mode 100644
index 00000000..e41fbc48
--- /dev/null
+++ b/test/module/webpage/on-initialized.js
@@ -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);
diff --git a/test/webpage-spec.js b/test/webpage-spec.js
index 9433b751..a4c519b0 100644
--- a/test/webpage-spec.js
+++ b/test/webpage-spec.js
@@ -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 = '';
- 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 = '\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/';