Background: In the Selenium UI automation we all have been using Page Objects pattern as the "Best Practice" for years. In Page Objects "methods" are tightly coupled to pages instead of generic context free functions. As per my observations, 70-80% Page objects methods code are not directly reusable in other web applications as every page object method is highly specialized to a specific page in a given web application.
We can also gain the same level of abstraction (if not better) by simply defining an objects collection (Object repository) and a set of well-defined actions/utility functions to operate on it.
Then what exactly is the point of using page object pattern where we can use simple functions which can be re-used in different contexts. So, aren't we over coupling things in page objects?
Dilemma: Fundamentally, there is a handful of UI operations that we can perform in any UI automation. When we are defining methods in the context of a page, aren't we creating over specialized "methods" than generalized "context-free functions" ?
Example: The page object method like "click submit_user_button" which is specific to a page and might not be directly re-usable even in same application in other pages!
I strongly think, this is costing us flexibility=>reusability=>maintainability?