You can try this approach:
driver.findElement(By.xpath("//a[contains(@class, 'user-name m-r-sm text-muted welcome-message')]")).getText().then(function(text){
console.log("Username : " + text);
});
UPDATE:
Sometimes the object is not really hidden, but also not in the viewport, then gettext() also returns an empty String.
To check try the following:
driver.findElement(By.xpath("//a[contains(@class, 'user-name m-r-sm text-muted welcome-message')]")).getAttribute("innerText").then(function(text){
console.log("Username : " + text);
});
You are using the plural findElements, which gives you a list of elements. Using e.text against the list won't work because you can only use .text with a webobject.
Use the singular version to get the first match on the page: driver.findElement()
If you do need to get the text of only one element in a list, use e[0].text to get the text of the first element in the list.