More often than not, when Test Automation is being referred to, it's usually along the same lines of automating manual test cases, or creating unit tests, or whatever. But it's not just limited to that. The ability to automate valuable tests requires skill, you need to have a lateral understanding of all the criteria in play. Of course you should know how to program. Just like creating a test strategy, there are things that you should consider when attempting to automate checking of a particular test. When I say fiat, I don't mean the small italian car that's been gaining mainstream popularity here in the United States these days. Fiat is indeed a brand but it is also word that means "an act of will that creates something".
A couple weeks back, Noah Sussman published a guide on how to teach yourself to be a technical tester aka selenium/webdriver automation specialist . That list gives you the lay of the land with regards to the product elements and the product environment of a website that you can then employ automation using selenium with continuous integration in mind.
Let me step back a bit and discuss where "fiat" falls into play. If my boss asks me to automate the authentication feature of the website that we are releasing soon, I might consider the following cases from the mind map below:
I can then interact with the site UI via webdriver and give it commands to load the page, enter a known userID and password, then check for known states that indicate that a user has successfully logged in. Easy enough. As I move down that list I might hit some bumps in the road due to the complication of involving OpenID Auth, passthrough auth, etc. but it's still doable. I might even employ the use of OpenID APIs to validate the correctness of the request. I might hit a roadblock because of my knowledge when it comes to the automation of two-factor auth and the testing extensibility when it comes to how long will my auth request stay valid. This wont be a quick test mainly because a time machine hasn't been invented and I won't be able to forward time to validate these time based expiries. I can always change the time of the server, or maybe my local client's time but what else might get affected? Will there be other time dependent elements of the application that will affect my tests and render my tests invalid? I don't know, and I might never know.
Selenium/Webdriver has it's own fiat that works because the commands have been programmed in it. In my own limited fiat, I was theoretically able to automate certain parts of my pretend application but not all. The only fiats that worked are the ones that are already in place combined with the ones that I know. I would love to have an all power fiat and express my fiat through sheer will and declare, automate!, and it will be done. No, it just doesn't work that way.
Test automation fiat is limited by your understanding of the tool that you are using, your wizardry with the scripting language that drives the tool, the environment and elements of the product that you are automating against and ultimately deciding on which tests need to be automated that yields valuable information that assists the greater test effort that may involve brain based testing and perhaps other automation initiatives.
 Heuristic Test Strategy Model
 Definition of Fiat
 How to Teach Yourself to be a Technical Tester