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 free-flowing well-abstracted 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) with a well-abstracted set of simple UI functions as well by simply defining an objects collection (Object repository) and a set of well-defined utility functions to operate on it.
Then what exactly is the point of using page object pattern whereas we can use simple functions which can be composed together 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?