Explain the key principles of Object-Oriented Programming (OOP) and how you have applied them to build reusable test automation frameworks.