Michael Karlovich asks…
Do you have any updated thoughts on rolling your own page objects with Watir? The original post is almost 4 years old but is still the basis (loosely) of every page object framework I’ve built since then.
My response…
Wow, I can’t believe that post is almost four years old. I have also have used this for the basis of every page object framework I have built since then.
I recently had a look at our JavaScript (ES2015) code of page objects and despite ES2015 not having meta-programming support like ruby, our classes are remarkably similar to what I was proposing ~4 years ago.
I believe this is because some patterns are classic and therefore almost timeless, they can be applied over and over again to different contexts. There’s a huge amount of negativity towards best practices of late, but I could seriously say that page objects are a best practise for test automation of ui systems, which isn’t saying they will be exactly the same in every context, but there’s a common best-practice pattern there which you most likely should be using.
Page objects, as a pattern, typically:
- Inherit from a base page object/container which stores common actions like:
- instantiating the object looking for a known element that defines that page’s existence
- optionally allow a ‘visit’ to the page during instantiation using some defined URL/path
- provides actions and properties common to all pages, for example: waiting for the page, checking the page is displayed, getting the title/url of the page, and checking cookies and local storage items for that page;
- Define actions as methods which are ways of interacting with that page (such as logging in);
- Do not expose internals about the page outside the page – for example they typically don’t expose elements or element selectors which should only be used within actions/methods for that page which are exposed; and
- Can also be modelled as components for user interfaces that are built using components to give greater reusability of the same components across different pages.
The biggest benefit I have found from using page objects as a pattern is having more deterministic end-to-end tests since instantiating a page I know I am on that page, so my tests will fail more reliably with a better understanding of what went wrong.
Are there any other pattern attributes you would consider vital for page objects?
Image may be NSFW.Clik here to view.
