I am attempting to model a page which contains sections and sub-sections, and I am running into trouble with scoping.
The section I am defining can be found in the DOM in a hierarchy like so:
html > body > div.page-background > div#wrapper > div#content > div#primary > ... > div#reserve-search
And so I have defined the section on the page with the CSS Selector div#reserve-search. However, clicking on a button in this section pulls up a pop-up panel that needs to be interacted with. Even though the pop-up is logically a part of the section, it is located in a different part of the DOM:
html > body > div#overlay-address
This puts me in a bind. The current code looks a bit like this:
class ReserveSearchPage < SitePrism::Page
section :reserve_search_section, ReserveSearchSection, "div#reserve-search"
end
class ReserveSearchSection < SitePrism::Section
section :overlay_address_section, OverlayAddressSection, "div#overlay-address"
element :address_section_button, "a#button"
def interactWithAddressSection
address_section_button.click
wait_until_overlay_address_section_visible
...
end
end
class OverlayAddressSection < SitePrism::Section
elements :things, "blah#stuff"
...
end
The problem with the above is that when I attempt to invoke interactWithAddressSection
, the OverlayAddressSection
is defined by the ReserveSearchSection
's scope, so that it actually looks for the sub-section in the DOM under div#reserve-search div#overlay-address. Since the sub-section isn't located there, the calls time out and the sub-section is not found.
I want to define this sub-section within the larger section, which is definitely where it logically belongs and where it needs to be accessed. Is there any way to define the sub-section's locator without using the parent section's scope?
Obviously, it's more convenient and "right" for a sub-section to exist within its parent in the DOM, but I've seen lots of pop-ups and panels defined like this, technically living in a very different part of the page, even though the structure should definitely be modeled as a sub-section of a different part of the DOM. It seems like there ought to be a way for me to break out of the parent section's scope, perhaps by defining the sub-section with some sort of absolute selector. Does such a method exist? If not, are there any other workarounds?