我正在尝试对包含部分和子部分的页面进行建模,并且在范围界定方面遇到了麻烦。
我正在定义的部分可以在 DOM 中的层次结构中找到,如下所示:
html > body > div.page-background > div#wrapper > div#content > div#primary > ... > div#reserve-search
因此,我使用 CSS 选择器div#reserve-search定义了页面上的部分。但是,单击本节中的按钮会弹出一个需要与之交互的弹出面板。尽管弹出窗口在逻辑上是该部分的一部分,但它位于 DOM 的不同部分:
html > 正文 > div#overlay-address
这让我陷入了困境。当前代码看起来有点像这样:
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
上面的问题是,当我尝试调用时interactWithAddressSection
,OverlayAddressSection
由 的范围定义,因此它实际上在div#reserve-search div#overlay-addressReserveSearchSection
下的 DOM 中查找子部分。由于子部分不在那里,调用超时并且找不到子部分。
我想在更大的部分中定义这个子部分,这绝对是它在逻辑上属于的地方和需要访问的地方。有没有办法在不使用父节范围的情况下定义子节的定位器?
显然,子部分存在于 DOM 中的父级中更方便和“正确”,但我见过很多这样定义的弹出窗口和面板,从技术上讲,它们位于页面的一个非常不同的部分,即使该结构绝对应该建模为 DOM 不同部分的子部分。似乎应该有一种方法让我摆脱父部分的范围,也许是通过使用某种绝对选择器定义子部分。这样的方法存在吗?如果没有,还有其他解决方法吗?