Быстрые способы
document.body.innerText;
document.body.textContent;
Для выделения пользователя: window.getSelection().toString().
Обход только текстовых узлов:
function allText(root = document.body) {
const out = [];
const walk = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
let n;
while ((n = walk.nextNode())) {
const t = n.nodeValue.trim();
if (t) out.push(t);
}
return out.join('\n');
}
Нюансы
innerText дороже (layout). Скрытые элементы: textContent их включит, innerText — чаще нет.
Итог
Для «как видит пользователь» — innerText; для сырого дерева — textContent / TreeWalker.