Front end testing is important and is often part of User Acceptance testing.
The most popular approaches uses Selenium along with a programming language - Java, Ruby, Python or C#
The basic principle is that you create an instance of a Selenium object called 'WebDriver' that represents the instance of use of a specific browser, for example chromedriver for chrome.
You then write tests using this infrastructure. You refer to web page elements, you 'click' on links and buttons, you type text in input fields, you submit forms, etc. Basically if a user can do it, you can usually replicate that behaviour using selenium commands through the selected language and framework. In some cases is is done through a test framework tool, for example for Ruby on Rails (Application Framework), using RSpec (Test Framework) and Capybara (Selenium API)
Generally the approach here is:
Front end tests are the focus of my job. I actually find them a lot easier to write than model or controller tests! I do use practices like Page Objects to make sure the tests stay readable and maintainable.
As for 'automating at the controller level only' I think that might have been part of a bigger statement with more context. You should consider testing at model, controller and view levels for unit, integrated and user-acceptance testing using happy, sad and optional workflows.