I wouldn't say it a poor use of recursion at all. But as @chilimatic has put it, unless you're using ES6's tail call optimisation feature, I'm afraid the elegance of recursion could be out-trumped by a stack overflow.
The maximum stack size varies across different versions of NodeJS, and different browsers. You could run the following function (thanks to Dr. Axel) to find out an estimate for your JS environment. This is indeed just an estimate, as this number would vary depending on the size of frames in the stack.
function computeMaxCallStackSize() {
try {
return 1 + computeMaxCallStackSize();
} catch (e) {
// Call stack overflow
return 1;
}
}
// For Node v6.9.4, the following line outputs 15718.
console.log(computeMaxCallStackSize());
If you are certain that your use case would never go anywhere remotely near the number estimate of your JavaScript environment, then by all means use recursion; else, I would suggest to go for a loop implementation.
Also, did you mean to write return Page.checkCssValue(newEl, cssValue, value); on line 8?
As an aside; if you want to implement tail call optimisation (TCO) yourself, (or you are interested in how it is implemented) do read about the trampoline pattern for TCOs.