> Your proposal has a drawback: it would make it very easy to work with several pages at once (as you would store the page outside the session by default), which does not work as the driver can only have 1 active page at a time (which is why a session has a single DocumentElement instance).

Session would still store that last visit page's DocumentElement. However pages retrieved previously (even not matching current page url) would keep working. This is bad, since custom PageObject logic valid on one page, might not be valid on another page. That's why doing a `$page = $session->getPage()` is a must after doing any kind of operation which might have resulted in url change. Maybe some sort of auto-expiring previous retrieved page objects (if they are not valid anymore) should be made.

> Thus, visit is not the only way to move to a different page (a form submission or clicking on a link will most of the time navigate to a different page).

This make me thinking that we must have something like `ElementFactory::getPage($url)` and `ElementFactory::isSamePage(DocumentElement $old_page, DocumentElement $new_page)` method, that would check if we're actually on same page and if not create correct PageObject. Then it's up to `ElementFinder` how to determine if urls are the same. For example it might consider (not in default implementation of course), that if all but query_string is same, then it's same page.

But idea of having proper PageObject classes auto-magically just by visiting another url (through `->visit()` method or indirectly through operations on a page) sounds powerful.