zombie-globbies
Version:
A very quick fix for [**Zombie**](https://github.com/assaf/zombie) to permit to crawl correctly webpages with attributes on the html tag (eg: html lang="en").
260 lines (232 loc) • 9.78 kB
JavaScript
var Assert, URL, assert, assertMatch, isRegExp;
assert = require("assert");
isRegExp = require("util").isRegExp;
URL = require("url");
assertMatch = function(actual, expected, message) {
if (isRegExp(expected)) {
return assert(expected.test(actual), message || ("Expected '" + actual + "' to match " + expected));
} else if (typeof expected === "function") {
return assert(expected(actual), message);
} else {
return assert.deepEqual(actual, expected, message);
}
};
Assert = (function() {
function Assert(browser) {
this.browser = browser;
}
Assert.prototype.cookie = function(identifier, expected, message) {
var actual;
if (arguments.length === 1) {
expected = null;
}
actual = this.browser.getCookie(identifier);
message || (message = "Expected cookie " + (JSON.stringify(identifier)) + " to have the value '" + expected + "', found '" + actual + "'");
return assertMatch(actual, expected, message);
};
Assert.prototype.redirected = function(message) {
return assert(this.browser.redirected, message);
};
Assert.prototype.status = function(code, message) {
return assert.equal(this.browser.statusCode, code, message);
};
Assert.prototype.success = function(message) {
return assert(this.browser.success, message);
};
Assert.prototype.url = function(expected, message) {
var absolute, defaultValue, key, url, value, _results;
if (typeof expected === "string") {
absolute = URL.resolve(this.browser.location.href, expected);
return assertMatch(this.browser.location.href, absolute, message);
} else if (isRegExp(expected) || typeof expected === "function") {
return assertMatch(this.browser.location.href, expected, message);
} else {
url = URL.parse(this.browser.location.href, true);
_results = [];
for (key in expected) {
value = expected[key];
if (key === "port") {
defaultValue = 80;
} else {
defaultValue = null;
}
_results.push(assertMatch(url[key] || defaultValue, value || defaultValue, message));
}
return _results;
}
};
Assert.prototype.attribute = function(selector, name, expected, message) {
var actual, element, elements, _i, _len, _results;
if (arguments.length === 2) {
expected = null;
}
elements = this.browser.queryAll(selector);
assert(elements.length > 0, "Expected selector '" + selector + "' to return one or more elements");
_results = [];
for (_i = 0, _len = elements.length; _i < _len; _i++) {
element = elements[_i];
actual = element.getAttribute(name);
_results.push(assertMatch(actual, expected, message));
}
return _results;
};
Assert.prototype.element = function(selector, message) {
return this.elements(selector, {
exactly: 1
}, message);
};
Assert.prototype.elements = function(selector, count, message) {
var elements;
elements = this.browser.queryAll(selector);
if (arguments.length === 1) {
count = {
atLeast: 1
};
}
if (count.exactly) {
count = count.exactly;
}
if (typeof count === "number") {
message || (message = "Expected " + count + " elements matching '" + selector + "', found " + elements.length);
return assert.equal(elements.length, count, message);
} else {
if (count.atLeast) {
elements = this.browser.queryAll(selector);
message || (message = "Expected at least " + count.atLeast + " elements matching '" + selector + "', found only " + elements.length);
assert(elements.length >= count.atLeast, message);
}
if (count.atMost) {
message || (message = "Expected at most " + count.atMost + " elements matching '" + selector + "', found " + elements.length);
return assert(elements.length <= count.atMost, message);
}
}
};
Assert.prototype.hasClass = function(selector, expected, message) {
var classNames, element, elements, _i, _len, _results;
elements = this.browser.queryAll(selector);
assert(elements.length > 0, "Expected selector '" + selector + "' to return one or more elements");
_results = [];
for (_i = 0, _len = elements.length; _i < _len; _i++) {
element = elements[_i];
classNames = element.className.split(/\s+/);
_results.push(assert(~classNames.indexOf(expected), message || ("Expected element '" + selector + "' to have class " + expected + ", found " + (classNames.join(", ")))));
}
return _results;
};
Assert.prototype.hasNoClass = function(selector, expected, message) {
var classNames, element, elements, _i, _len, _results;
elements = this.browser.queryAll(selector);
assert(elements.length > 0, "Expected selector '" + selector + "' to return one or more elements");
_results = [];
for (_i = 0, _len = elements.length; _i < _len; _i++) {
element = elements[_i];
classNames = element.className.split(/\s+/);
_results.push(assert(classNames.indexOf(expected) === -1, message || ("Expected element '" + selector + "' to not have class " + expected + ", found " + (classNames.join(", ")))));
}
return _results;
};
Assert.prototype.className = function(selector, expected, message) {
var actual, element, elements, _i, _len, _results;
elements = this.browser.queryAll(selector);
assert(elements.length > 0, "Expected selector '" + selector + "' to return one or more elements");
expected = expected.split(/\s+/).sort().join(" ");
_results = [];
for (_i = 0, _len = elements.length; _i < _len; _i++) {
element = elements[_i];
actual = element.className.split(/\s+/).sort().join(" ");
_results.push(assertMatch(actual, expected, message || ("Expected element '" + selector + "' to have class " + expected + ", found " + actual)));
}
return _results;
};
Assert.prototype.style = function(selector, style, expected, message) {
var actual, element, elements, _i, _len, _results;
if (arguments.length === 2) {
expected = null;
}
elements = this.browser.queryAll(selector);
assert(elements.length > 0, "Expected selector '" + selector + "' to return one or more elements");
_results = [];
for (_i = 0, _len = elements.length; _i < _len; _i++) {
element = elements[_i];
actual = element.style.getPropertyValue(style);
_results.push(assertMatch(actual, expected, message || ("Expected element '" + selector + "' to have style " + style + " value of " + expected + ", found " + actual)));
}
return _results;
};
Assert.prototype.input = function(selector, expected, message) {
var element, elements, _i, _len, _results;
if (arguments.length === 1) {
expected = null;
}
elements = this.browser.queryAll(selector);
assert(elements.length > 0, "Expected selector '" + selector + "' to return one or more elements");
_results = [];
for (_i = 0, _len = elements.length; _i < _len; _i++) {
element = elements[_i];
_results.push(assertMatch(element.value, expected, message));
}
return _results;
};
Assert.prototype.link = function(selector, text, url, message) {
var absolute, elements, matching, matchingText;
elements = this.browser.queryAll(selector);
assert(elements.length > 0, "Expected selector '" + selector + "' to return one or more elements");
matchingText = elements.filter(function(element) {
return element.textContent.trim() === text;
});
if (isRegExp(url)) {
matching = matchingText.filter(function(element) {
return url.test(element.href);
});
} else {
absolute = URL.resolve(this.browser.location.href, url);
matching = matchingText.filter(function(element) {
return element.href === absolute;
});
}
return assert(matching.length > 0, "Expected at least one link matching the given text and URL");
};
Assert.prototype.text = function(selector, expected, message) {
var actual, elements;
elements = this.browser.queryAll(selector);
assert(elements.length > 0, "Expected selector '" + selector + "' to return one or more elements");
actual = elements.map(function(e) {
return e.textContent;
}).join("").trim().replace(/\s+/g, " ");
return assertMatch(actual, expected || "", message);
};
Assert.prototype.hasFocus = function(selector, message) {
var elements;
if (selector) {
elements = this.browser.queryAll(selector);
assert.equal(elements.length, 1, "Expected selector '" + selector + "' to return one element");
return assert.equal(this.browser.activeElement, elements[0], "Expected element '" + selector + "' to have the focus'");
} else {
return assert.equal(this.browser.activeElement, this.browser.body, "Expected no element to have focus");
}
};
Assert.prototype.evaluate = function(expression, expected, message) {
var actual;
actual = this.browser.evaluate(expression);
if (arguments.length === 1) {
return assert(actual);
} else {
return assertMatch(actual, expected, message);
}
};
Assert.prototype.global = function(name, expected, message) {
var actual;
actual = this.browser.window[name];
if (arguments.length === 1) {
return assert(actual);
} else {
message || (message = "Expected global " + name + " to have the value '" + expected + "', found '" + actual + "'");
return assertMatch(actual, expected, message);
}
};
Assert.prototype.prompted = function(messageShown, message) {
return assert(this.browser.prompted(messageShown), message);
};
return Assert;
})();
module.exports = Assert;